1.服务器、客户端里面角色和控制器之间的关系:

在客户端中,只有一个本地玩家控制器;但在服务器端(不管是监听服务器还是专用服务器),都有其他玩家的控制器。
所以,我们先判断,屏幕上的角色,是不是由本地玩家控制器控制的:
Source/Crunch/Public/Character/CCharacter.h
//判断是否有本地玩家控制
bool IsLocallyControlledByPlayer();
Source/Crunch/Private/Character/CCharacter.cpp
bool ACCharacter::IsLocallyControlledByPlayer()
{
return GetController() != nullptr && GetController()->IsLocalPlayerController();
}
思考:
如果,我将上面的IsLocalPlayerController()换成IsLocalController()会如何呢?
在Unreal Engine中,IsLocalPlayerController()和IsLocalController()的区别主要体现在以下方面:
-
所属类与功能定位
IsLocalPlayerController()是APlayerController类的成员函数,专门用于判断当前PlayerController是否为本地控制的玩家控制器IsLocalController()是AController基类的成员函数,适用于所有控制器类型(包括PlayerController和AIController)的本地化判断
-
应用场景差异
IsLocalPlayerController()通常用于:- 分屏游戏中区分不同本地玩家的控制器实例
- 确保输入事件、UI交互等操作仅对本地玩家生效
IsLocalController()更通用,可用于:- AI控制的本地模拟(如离线训练模式)
- 网络游戏中判断任意控制器的本地归属
-
返回值逻辑
IsLocalPlayerController()需同时满足:- 控制器是PlayerController类型
- 控制器由本地机器控制
IsLocalController()仅判断控制器是否由本地机器控制,不关心具体类型
-
典型使用示例
// 仅PlayerController专用判断 if (PlayerController->IsLocalPlayerController()) { // 处理本地玩家专属逻辑 } // 通用控制器判断 if (AnyController->IsLocalController()) { // 处理本地控制的AI或玩家逻辑 }
对于需要精确区分玩家控制的场景,推荐使用IsLocalPlayerController();若需兼容AI控制器的本地化判断,则应选择IsLocalController()。
void ACCharacter::ConfigureOverHeadStateWidget()
{
if (!OverHeadWidgetComponent)
{
UE_LOG(LogTemp, Error, TEXT("OverHeadWidgetComponent is NULL"));
return;
}
//如果是本地玩家控制的角色,不显示状态条
if (IsLocallyControlledByPlayer())
{
OverHeadWidgetComponent->SetHiddenInGame(true);
return;
}
//得到小部件:头顶属性条
UOverHeadStateGauge* OverHeadStateGauge = Cast<UOverHeadStateGauge>(
OverHeadWidgetComponent->GetUserWidgetObject());
if (OverHeadStateGauge)
{
//调用能力系统组件,并配置它
OverHeadStateGauge ->ConfigWithASC(GetAbilitySystemComponent());
OverHeadWidgetComponent->SetHiddenInGame(false);
}
}
效果

拖入AI角色:

最低0.47元/天 解锁文章
2183

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



