效果
通过在关卡蓝图中触发GameInstanceSubsystem包含的委托,来触发所有绑定到这个委托的事件,从而实现跨蓝图通信。
步骤
1. 新建一个C++类
这里命名为“SubsystemAndDelegate”
引入GameInstanceSubsystem.h,让“SubsystemAndDelegate”继承“UGameInstanceSubsystem”
添加如下代码,让反射系统识别 USubsystemAndDelegate类
声明了一个名为 FSubsystemActorLocation
的动态多播委托类型,该委托类型带有两个参数
再添加一个蓝图可访问的函数“CallLocation”用于调用委托
实现函数“CallLocation”,通过Broadcast触发委托SubsystemActorLocationDelegate
完整头文件代码:
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"#include "SubsystemAndDelegate.generated.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSubsystemActorLocation, FString, InActionName, int32, InActionIndex);UCLASS()
class STUDY_API USubsystemAndDelegate : public UGameInstanceSubsystem
{GENERATED_BODY()public:UFUNCTION(BlueprintCallable)void CallLocation(FString InActionName, int32 InActionIndex);UPROPERTY(BlueprintAssignable)FSubsystemActorLocation SubsystemActorLocationDelegate;
};
源文件:
#include "Subsystem/SubsystemAndDelegate.h"void USubsystemAndDelegate::CallLocation(FString InActionName, int32 InActionIndex)
{SubsystemActorLocationDelegate.Broadcast(InActionName, InActionIndex);
}
2. 编译后,新建一个actor蓝图类,这里命名为“BP_WorkActor”,然后将其拖入场景中
打开“BP_WorkActor”,在事件图表中通过“USubsystemAndDelegate”的委托“SubsystemActorLocationDelegate”来绑定委托事件
3. 在关卡蓝图中通过按下1键调用子系统的函数“CallLocation”,从而触发委托绑定的自定义事件
运行效果如下,可以看到按下1键成功触发委托绑定的打印事件