# 代理(委托) 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的析构函数中解绑委托,以防止悬挂引用或其他问题。