UEC++中的宏标识DefaultToSelf 和 DeterminesOutPutType

文章讲述了在UnrealEngineC++(UEC++)中,DefaultToSelf宏标识用于蓝图函数参数默认传入Self,而DeterminesOutputType则帮助解决蓝图类作为C++函数返回值类型的问题。

UEC++中的宏标识DefaultToSelf 和 DeterminesOutPutType

1、DefaultToSelf:UEC++中定义的函数。在蓝图中调用时,某一参数默认传入Self。

UFUNCTION(BlueprintCallable, Meta=(DefaultToSelf="AnyParams"))
void Func1(CustomClass* AnyParams);

2、在进行蓝图和C++通信开发过程中,会遇到这样的问题:蓝图中创建的类,如何在UEC++中作为参数的返回值。蓝图中创建的类很容易可以在C++中使用,使用TSubOfClass即可。但是如何作为C++中,函数的返回值类型呢?使用DeterminesOutputType即可,在调用该函数时,就可以指定返回值类型。

UFUNCTION( BlueprintCallable,Meta = (DeterminesOutputType = "WidgetClass"))
static UUserWidget* WidgetGetParentOfClass(UWidget* ChildWidget, TSubclassOf<UUserWidget> WidgetClass);
### RPC 的相关性 在 Unreal Engine C++UEC++)中,RPC(Remote Procedure Call)是一种用于在网络环境中实现远程对象间通信的机制,主要用于客户端与服务器之间的同步与交互。RPC 的相关性主要体现在其在网络通信中的作用、对游戏逻辑的影响以及其与网络复制系统的关系。 UEC++ 中的 RPC 可分为三类:**Server RPCs**、**Client RPCs** **NetMulticast RPCs**。这些 RPC 类型决定了函数在网络中的执行位置传播范围。例如,Server RPCs 通常由客户端调用并在服务器上执行,Client RPCs 则由服务器触发并在客户端上执行,而 NetMulticast RPCs 可在服务器所有连接的客户端上同时执行。 RPC 与网络复制系统紧密相关,其调用通常依赖于 Actor 的复制状态。只有在网络复制启用的情况下,RPC 才能正确地在网络实体之间传递。因此,RPC 是 Unreal Engine 网络同步机制的重要组成部分,尤其在多人游戏中用于同步状态、触发事件处理玩家输入。 ### RPC 的优先级确定 RPC 的优先级主要由其执行的**可靠性**(Reliable/Unreliable)**调用频率**决定。在 UEC++ 中,开发者需根据实际需求选择合适的 RPC 类型: - **可靠 RPC(Reliable)**:保证消息最终会到达目标,并在未确认接收前持续重传。这种类型适合用于对 gameplay 至关重要的操作,例如武器发射、生成 Actor 或处理关键事件。由于其保证送达的特性,可靠 RPC 的优先级通常较高,但频繁使用可能导致网络队列溢出,从而影响性能 [^1]。 - **不可靠 RPC(Unreliable)**:不保证消息送达,适用于高频调用或对 gameplay 不关键的操作,例如逐帧更新 Actor 的移动状态。由于其轻量级特性,不可靠 RPC 的优先级相对较低,但更适合实时性要求高且可容忍部分丢失的场景 [^1]。 在设置 RPC 的优先级时,还需考虑**调用频率**。如果某个 RPC 函数需要频繁调用(如每帧调用一次),应将其设置为不可靠模式,以避免网络拥塞。而对不常触发但关键的操作(如玩家输入触发的事件),应使用可靠模式,并结合验证逻辑(Validate 函数)限制调用频率。 此外,RPC 的执行顺序优先级还受到 Unreal Engine 的网络更新频率(NetUpdate) Actor 的 NetPriority 属性影响。开发者可以通过调整这些参数,进一步优化 RPC 的网络表现。 ### 示例:RPC 的声明与实现 以下是一个在 UEC++ 中定义 RPC 的示例: #### 声明 RPC 函数(.h 文件) ```cpp UCLASS() class MYPROJECT_API AMyActor : public AActor { GENERATED_BODY() public: // 可靠 Server RPC UFUNCTION(Server, Reliable, WithValidation) void ServerFireWeapon(); // 不可靠 Client RPC UFUNCTION(Client, Unreliable) void ClientPlayFireAnimation(); // NetMulticast RPC UFUNCTION(NetMulticast, Reliable) void MulticastSpawnExplosion(FVector Location); }; ``` #### 实现 RPC 函数(.cpp 文件) ```cpp void AMyActor::ServerFireWeapon_Implementation() { // 在服务器上执行武器发射逻辑 UE_LOG(LogTemp, Log, TEXT("Weapon fired on server")); } bool AMyActor::ServerFireWeapon_Validate() { // 验证逻辑,例如防止过快连续发射 return true; } void AMyActor::ClientPlayFireAnimation_Implementation() { // 客户端播放射击动画 UE_LOG(LogTemp, Log, TEXT("Playing fire animation on client")); } void AMyActor::MulticastSpawnExplosion_Implementation(FVector Location) { // 在服务器所有客户端生成爆炸效果 UE_LOG(LogTemp, Log, TEXT("Explosion at %s"), *Location.ToString()); } ``` 通过上述方式,开发者可以根据不同场景需求合理选择 RPC 的类型优先级,以实现高效、稳定的网络通信。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值