角色类型判断方法
在Unreal Engine的网络架构中:
- 专用服务器(Dedicated Server):所有角色都有控制器(AI控制器或玩家控制器)
- 监听服务器(Listen Server):服务器同时也是一个客户端
- 客户端(Client):只有本地控制的角色有玩家控制器
正确的判断逻辑
voidUTargetDataUnderMouse::DetermineCharacterType(){if(AActor*AvatarActor=GetAvatarActor()){ENetRole LocalRole=AvatarActor->GetLocalRole();boolbHasAuthority=AvatarActor->HasAuthority();boolbIsLocallyControlled=false;if(APawn*Pawn=Cast<APawn>(AvatarActor)){bIsLocallyControlled=Pawn->IsLocallyControlled();}// 正确的判断逻辑:if(bHasAuthority){// 服务器端角色(专用服务器或监听服务器)if(bIsLocallyControlled){// 监听服务器:服务器同时是本地客户端UE_LOG(LogTemp,Warning,TEXT("监听服务器 - 本地控制角色"));}else{// 专用服务器:服务器端AI控制或远程玩家角色UE_LOG(LogTemp,Warning,TEXT("专用服务器 - 服务器端角色"));}}else{// 客户端if(bIsLocallyControlled){// 客户端本地控制的角色UE_LOG(LogTemp,Warning,TEXT("客户端 - 本地控制角色"));}else{// 客户端远程玩家控制的角色UE_LOG(LogTemp,Warning,TEXT("客户端 - 远程控制角色"));}}}}更精确的专用服务器判断
voidUTargetDataUnderMouse::CheckForDedicatedServer(){if(AActor*AvatarActor=GetAvatarActor()){// 判断是否是专用服务器环境boolbIsDedicatedServer=IsRunningDedicatedServer();// 或者通过World判断UWorld*World=GetWorld();if(World){ENetMode NetMode=World->GetNetMode();bIsDedicatedServer=(NetMode==NM_DedicatedServer);}if(bIsDedicatedServer){// 专用服务器环境if(AvatarActor->HasAuthority()){UE_LOG(LogTemp,Warning,TEXT("专用服务器 - 权威角色"));}}}}在TargetDataUnderMouse中的实际应用
在你的代码中,可以在以下关键位置进行判断:
voidUTargetDataUnderMouse::SendMouseCursorData(){// 只在本地控制的客户端发送鼠标数据if(AActor*AvatarActor=GetAvatarActor()){if(APawn*Pawn=Cast<APawn>(AvatarActor)){if(!Pawn->IsLocallyControlled()){// 不是本地控制的角色,不发送鼠标数据return;}}// 继续发送鼠标数据的逻辑...}}关键概念澄清
- 专用服务器(Dedicated Server):
NetMode == NM_DedicatedServer - 监听服务器(Listen Server):
NetMode == NM_ListenServer - 权威控制(Authority):
HasAuthority() == true - 本地控制(Locally Controlled):
IsLocallyControlled() == true
总结
正确的判断流程应该是:
- 先判断网络模式(专用服务器/监听服务器/客户端)
- 再判断权威性(
HasAuthority()) - 最后判断本地控制(
IsLocallyControlled())
这样就能准确区分各种情况下的角色类型了。感谢你的指正!