函数与宏:功能差不多
本质上是为了解决重复性事件的代码重复问题
宏没有局部变量
宏可以没有执行引脚
函数中的自定义事件
蓝图里: 在一个蓝图里可以直接调用另一个蓝图的自定义事件。
自定义事件节点 → Action 节点(例如,播放动画)→输出
在本地蓝图中实现自定义事件
-
创建自定义事件
- 打开蓝图(比如角色蓝图或物体蓝图)。
- 在蓝图编辑器中,右键单击空白区域,选择 "Add Event" > "Add Custom Event"。
- 给那个自定义事件命名(比如
MyCustomEvent
)。
-
在蓝图中触发事件
- 在同一个蓝图中,可以通过拖动自定义事件节点到图表中,并连接到想要的逻辑。
- 如果想从另一个蓝图中触发这个事件,需要一个引用到这个蓝图的实例。
-
从另一个蓝图中触发事件
蓝图 A → 获取对蓝图 B 的引用→调用自定义事件
- 在另一个蓝图中,可以获取到目标蓝图的引用(例如,使用
Get All Actors of Class
节点或在蓝图中保存的引用)。 - 通过拖动目标蓝图的引用,选择
Call Function
,然后选择你之前创建的自定义事件。
- 在另一个蓝图中,可以获取到目标蓝图的引用(例如,使用
在网络环境中实现自定义事件
多人游戏或网络环境中,远程触发涉及到客户端和服务器之间的通信。需要使用UE的网络功能,包括RPC(远程过程调用)。
-
定义自定义事件
- 打开要定义事件的蓝图(例如,角色蓝图)。
- 在蓝图中,创建一个自定义事件。确保这个事件是网络可用的。
-
设置RPC
-
为自定义事件设置网络属性。需要使用
UFUNCTION
宏来标记事件,这样它可以在网络上调用 -
一些常见的RPC设置:
Server
:事件由客户端调用并在服务器上执行。Client
:事件由服务器调用并在客户端上执行。NetMulticast
:事件由服务器调用并在所有客户端上执行。// 服务器调用 UFUNCTION(Server, Reliable) void ServerTriggerCustomEvent(); // 客户端调用 UFUNCTION(Client, Reliable) void ClientTriggerCustomEvent(); // 多播调用 UFUNCTION(NetMulticast, Reliable) void MulticastTriggerCustomEvent();
-
3.实现RPC函数(蓝图或C++)
// 服务器调用实现
void AMyActor::ServerTriggerCustomEvent_Implementation()
{
// 服务器逻辑
MulticastTriggerCustomEvent(); // 广播到所有客户端
}
// 客户端调用实现
void AMyActor::ClientTriggerCustomEvent_Implementation()
{
// 客户端逻辑
}
// 多播调用实现
void AMyActor::MulticastTriggerCustomEvent_Implementation()
{
// 广播逻辑
}
4.调用PRC (蓝图或C++)
// 在客户端调用服务器RPC
void AMyActor::TriggerCustomEvent()
{
if (HasAuthority()) // 服务器调用
{
ServerTriggerCustomEvent();
}
else // 客户端调用
{
ClientTriggerCustomEvent();
}
}
C++:
使用UFUNCTION
宏定义自定义事件,并在需要触发该事件的地方调用
// 在头文件中定义自定义事件
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "MyEvents")
void MyCustomEvent();
};
// 在源文件中实现自定义事件
void AMyActor::MyCustomEvent()
{
// 执行事件逻辑
}
关于上面的RPC(远程过程调用)
RPC允许在网络上远程调用函数,从而在不同的客户端或服务器上触发事件。
服务器到客户端:
// 在服务器上定义并调用 UFUNCTION(Server, Reliable) void ServerTriggerEvent();
在服务器上定义一个RPC函数,标记为
UFUNCTION
,指定它在客户端上执行。这样服务器可以触发客户端的事件。客户端到服务器:
// 在客户端上定义并调用 UFUNCTION(Client, Reliable) void ClientTriggerEvent();
在客户端上定义一个RPC函数,标记为
UFUNCTION
,指定它在服务器上执行。这样客户端可以触发服务器的事件。事件广播和网络同步多播(Multicast):定义一个多播RPC,这样服务器可以广播事件到所有客户端。多播RPC会在所有客户端上执行相同的逻辑。
UFUNCTION(NetMulticast, Reliable) void MulticastTriggerEvent();
应用场景
一个玩家的动作(如击杀敌人)可以触发其他玩家的事件或更新。
- 当一个玩家按下按钮,所有客户端上的对应对象都会更新状态。
- 触发物体动画或物理效果,使得所有玩家都能看到相同的动作或效果。