UnrealEngine中角色类型判断方法
2026/7/9 12:21:37 网站建设 项目流程

角色类型判断方法

在Unreal Engine的网络架构中:

  1. 专用服务器(Dedicated Server):所有角色都有控制器(AI控制器或玩家控制器)
  2. 监听服务器(Listen Server):服务器同时也是一个客户端
  3. 客户端(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

总结

正确的判断流程应该是:

  1. 先判断网络模式(专用服务器/监听服务器/客户端)
  2. 再判断权威性(HasAuthority()
  3. 最后判断本地控制(IsLocallyControlled()

这样就能准确区分各种情况下的角色类型了。感谢你的指正!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询