UnrealEngine中角色类型判断方法

角色类型判断方法

在Unreal Engine的网络架构中:

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

总结

正确的判断流程应该是:

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值