角色类型判断方法
在Unreal Engine的网络架构中:
- 专用服务器(Dedicated Server):所有角色都有控制器(AI控制器或玩家控制器)
- 监听服务器(Listen Server):服务器同时也是一个客户端
- 客户端(Client):只有本地控制的角色有玩家控制器
正确的判断逻辑
void UTargetDataUnderMouse::DetermineCharacterType()
{
if (AActor* AvatarActor = GetAvatarActor())
{
ENetRole LocalRole = AvatarActor->GetLocalRole();
bool bHasAuthority = AvatarActor->HasAuthority();
bool bIsLocallyControlled = 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("客户端 - 远程控制角色"));
}
}
}
}
更精确的专用服务器判断
void UTargetDataUnderMouse::CheckForDedicatedServer()
{
if (AActor* AvatarActor = GetAvatarActor())
{
// 判断是否是专用服务器环境
bool bIsDedicatedServer = 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中的实际应用
在你的代码中,可以在以下关键位置进行判断:
void UTargetDataUnderMouse::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())
这样就能准确区分各种情况下的角色类型了。感谢你的指正!

1466

被折叠的 条评论
为什么被折叠?



