**
UE4 中 多播的用法
**
一,目的
想象一个场景, 一个 King 和一堆 peasant(农民) 站在一起参加活动。 突然, king 死掉了, 周围的农民 吓得立即四散。
以上场景实现 用到了 多播的概念。
二,实现步骤
1,创建King 的类
King.h
…
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnKingDeathSignature, AKing*, DeadKing); //委托签名;
…
以上是一个 动态多播的声明,并且带有一个参数
FOnKingDeathSignature :可以理解为一个委托的对象。 这个只是一个对象,名字可以按照规则随便起,前提是首字母必须是F 。 比如: 你可以定义为 Fmydeltate, FTestDelegate; 都可以。
AKing*: 是参数的类型。 此处 我们直接将当前对象作为参数传递出去,我们采用 对象 指针的行驶。
DeadKing: 是AKing* 对应的变量的名字。是我们传递的参数起的 名字。
比如:
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTestDynamicDelagate, float, Value);
这是别人定义的一个 动态多播的例子。 这个地方的 传递参数 是float 类型, 传递参数 命名为 : Value
…
UFUNCTION(BlueprintCallable, category = “king”)
void Die(); // 这个函数会被蓝图里面调用。 里面只有一个功能就是 进行广播
UPROPERTY(BlueprintAssignable) // 蓝图ke动态委托为委托赋予事件, 就是在蓝图里面可以实现 bind event
FOnKingDeathSignature OnKingDeath; // 多播委托实例, 在 brocast 之后 调用该委托上的方法, OnkingDeath 就委托对象的 实例化 之后对应的名字。就是 蓝图中 bind event to (OnKingDeath)
…
King.cpp
void AKing::Die()
{
OnKingDeath.Broadcast(this);
}
// 该事件,调用委托,进行广播。
…
2,创建Peasant的类
创建农民的类。
农民的类, 主要是创建一个逃跑的函数。
…
peasant.h 中
UFUNCTION(BlueprintCallable, Category = "Peasant")
void Flee(AKing* DeadKing); // 该函数有一个传递参数, 代表的是 king 的对象。
…
peasant.cpp
void APeasant::Flee(AKing * DeadKing)
{
GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Red, TEXT(“Go awaY”));
FVector FleeVector = GetActorLocation() - DeadKing->GetActorLocation(); // 注意向减的顺利, 这个代笔的是 从国王朝向农民。
FleeVector.Normalize();
FleeVector *= 500;
SetActorLocation(GetActorLocation() + FleeVector);
}
// 以上函数, 传递参数代表的是 将 king对象 传递过来。整体思路是: (1)农民的对象 首先大喊“快跑” (2)判断国王和当前农民之间的距离。 然后 让 沿着 和 国王相反的方向,向外跳出500cm 的距离。
以上可以看出 为什么传递参数要 使用 king 对象指针的原因。 实际上 很多情况,我们范围更喜欢直接传递一个特定的值 比如 :float 或者 Fstring 之类的。 不过 传递一个对象 对我来说,用的少,需要牢记。
…
3, 蓝图中进行演示
(1)使用peasant类, 创建 蓝图类 BP_Peasant 。 人为加一个 staticmesh 黑色的球。
这是农民(peasant) 中 实现 绑定委托的 过程。 绑定国王的死掉事件, 执行自己的逃跑事件。
(3)同理, 创建一个 king 的蓝图类。 人为加一个蓝色的立方体。蓝图里面不需要任何处理。
(4)在关卡蓝图中,做一个延时,进行一个事件触发。
延时5s 后, 国王执行 die 事件,事件会自动进行广播。
默认状态
国王挂掉,后 广播的状态
以上就是今天的一点小小的学习进度。 估计后续会在故障检测中 大量的用到此相关的功能,以此进行记录备份。(文章是在看完别人的文章后自己整理的, 若涉侵权,必须删)
这世上没有白走的路,每一步都算数。