# 代理(委托)
Delegate:消息机制
触发点,执行点
观察者模式。
+ 触发方
声明代理,构建一个代理类,描述函数的参数列表和返回值
实例化代理对象
在需要的位置触发(执行、通知)代理--》调用函数
+ 委托方
在任意时刻将函数绑定到触发方的代理对象。
(目的:在触发时,能第一时间能得到通知)
实现执行函数的具体内容。
# 示例
好的,我会提供两个简单的C++类来演示如何使用`DECLARE_DYNAMIC_MULTICAST_DELEGATE`。
类A (`AClassA`) 有一个健康值(`HP`),以及一个修改健康值的函数。当健康值改变时,我们会触发一个动态多播委托。
类B (`AClassB`) 将监听类A的这个委托,并执行一些响应操作。
**1. AClassA (头文件 .h)**
```cpp
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AClassA.generated.h"
UCLASS()
class YOURPROJECT_API AClassA : public AActor
{
GENERATED_BODY()
public:
AClassA();
// 健康值
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Health")
float HP;
// 修改健康值的函数
UFUNCTION(BlueprintCallable, Category = "Health")
void ModifyHP(float Amount);
// 定义动态多播委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnHPChanged);
UPROPERTY(BlueprintAssignable)
FOnHPChanged OnHPChanged;
};
```
**AClassA (源文件 .cpp)**
```cpp
#include "AClassA.h"
AClassA::AClassA()
{
// 默认健康值为 100
HP = 100.f;
}
void AClassA::ModifyHP(float Amount)
{
HP += Amount;
if (OnHPChanged.IsBound())
{
OnHPChanged.Broadcast();
}
}
```
**2. AClassB (头文件 .h)**
```cpp
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AClassA.h"
#include "AClassB.generated.h"
UCLASS()
class YOURPROJECT_API AClassB : public AActor
{
GENERATED_BODY()
public:
AClassB();
// 类A的引用,用于绑定委托
UPROPERTY(EditAnywhere, Category = "Reference")
AClassA* ReferenceToClassA;
// 响应委托的函数
UFUNCTION()
void HandleHPChanged();
};
```
**AClassB (源文件 .cpp)**
```cpp
#include "AClassB.h"
AClassB::AClassB()
{
ReferenceToClassA = nullptr;
}
void AClassB::BeginPlay()
{
Super::BeginPlay();
// 如果有类A的引用,绑定其委托
if (ReferenceToClassA)
{
ReferenceToClassA->OnHPChanged.AddDynamic(this, &AClassB::HandleHPChanged);
}
}
void AClassB::HandleHPChanged()
{
// 做一些响应操作,例如打印日志
UE_LOG(LogTemp, Warning, TEXT("ClassA's HP was changed!"));
}
```
在这个示例中,当你在运行时修改`AClassA`的`HP`,`AClassB`会自动响应并打印一条日志消息。
注意:为了确保代码的完整性,你可能还需要在类B的析构函数中解绑委托,以防止悬挂引用或其他问题。