ue4 Authority和server的区别

本文解析了UE4中authority与server的区别,特别是在actor可复制性方面的应用。authority不仅指服务器端,在特定情况下还指向客户端,如不可复制actor的pointdamage事件会由本地客户端处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

authority是权威的意思,server是服务器的意思

在ue4中,有个判断switch has authority,如下图


有两个选项,authority和remote

此处一定要区分authority和server的区别

比如,当actor设置为可复制时,一般来说authority和server都是指的服务器,因为服务器端的actor是权威的

但是当actor设置为不可复制,authority指的就是指actor所在的客户端,包括一些事件,比如point damage事件,ue4中文翻译的是在仅服务器端执行,这就不准确了,因为不可复制的actor的point damage事件是在本地客户端执行的,此问题一定要引起注意

### RPC实现概述 在Unreal Engine 4中,通过C++实现远程过程调用(RPC)主要依赖于`UActorComponent`类中的函数标记以及特定的宏定义来声明处理RPC。为了使一个函数能够在网络上被其他客户端或服务器调用,该函数需满足一定条件并使用适当的关键字修饰[^1]。 对于希望在网络环境中执行的操作而言,在头文件(.h)内声明成员方法时应加上`Server`, `NetMulticast`, 或者带有` Reliable/Unreliable`属性的`Client`前缀,并利用`BlueprintCallable`确保蓝图也可访问这些功能。具体到服务端发起请求至客户端的情况,则会采用如下形式: ```cpp UPROPERTY() float SomeVariable; // Server function called by clients, reliable transmission. void ServerMyFunction_Implementation(float Value); bool ServerMyFunction_Validate(float Value); ``` 当涉及到更复杂的场景如仅初始化期间同步变量状态给新加入的游戏参与者时,可以借助特殊宏指令完成此操作: ```cpp DOREPLIFETIME_CONDITION(MyClass, MyVar, COND_InitialOnly)[^3]; ``` 上述代码片段展示了如何限定某个属性只在玩家首次连接时才发送更新通知。 实际应用过程中还需注意权限验证逻辑(`_Validate`)的设计以保障网络安全性稳定性;同时合理运用可靠(reliable)/不可靠(unreliable)传输模式优化性能表现。 ### 完整示例 下面给出一段完整的RPC实现例子,假设有一个名为`ATestActor`的角色需要向所有已连接玩家广播消息: ```cpp #include "TestActor.h" // .h 文件部分 class ATestActor : public AActor { GENERATED_BODY() public: UFUNCTION(Server, Reliable, WithValidation) void ServerBroadcastMessage(const FString& MessageText); private: UPROPERTY(ReplicatedUsing = OnRep_MessageReceived) FString LastMessage; void OnRep_MessageReceived(); }; // .cpp 文件部分 void ATestActor::OnRep_MessageReceived() { UE_LOG(LogTemp, Log, TEXT("Received replicated message: %s"), *LastMessage); } void ATestActor::ServerBroadcastMessage_Implementation(const FString& MessageText) { if (HasAuthority()) { // Only run on server LastMessage = MessageText; // Replicate this change to all clients MarkPackageDirty(); } } bool ATestActor::ServerBroadcastMessage_Validate(const FString& MessageText) { return !MessageText.IsEmpty(); } ``` 这段程序实现了从任意拥有控制权的对象处触发一次全局通告的功能,其中包含了必要的安全检查机制(_Validate),并且正确设置了数据复制规则以便及时将最新信息传递给每一个订阅者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值