虚幻引擎UE5专用服务器游戏开发-18 隐藏本地玩家角色头顶控件显示的

虚幻引擎5 Gameplay框架(二) PlayerController网络机制、客户端连接服务器流程、HUD与UserWidghet类,C++绑定UI控件,C++读取命令行文本 阅读详情

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()的区别主要体现在以下方面:

  1. ‌所属类与功能定位‌

    • IsLocalPlayerController()是APlayerController类的成员函数,专门用于判断当前PlayerController是否为本地控制的玩家控制器
    • IsLocalController()是AController基类的成员函数,适用于所有控制器类型(包括PlayerController和AIController)的本地化判断
  2. ‌应用场景差异‌

    • IsLocalPlayerController()通常用于:
      • 分屏游戏中区分不同本地玩家的控制器实例
      • 确保输入事件、UI交互等操作仅对本地玩家生效
    • IsLocalController()更通用,可用于:
      • AI控制的本地模拟(如离线训练模式)
      • 网络游戏中判断任意控制器的本地归属
  3. ‌返回值逻辑‌

    • IsLocalPlayerController()需同时满足:
      • 控制器是PlayerController类型
      • 控制器由本地机器控制
    • IsLocalController()仅判断控制器是否由本地机器控制,不关心具体类型
  4. ‌典型使用示例‌

    // 仅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角色:

发现,AI状态条不更新!

2.检查C++代码,发现,我们只是在玩家控制器调用的ServerSideInit(),而AI角色没有执行过!

void ACPlayerController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	CPlayerCharacter = Cast<ACPlayerCharacter>(InPawn);
	if (CPlayerCharacter)
	{
		CPlayerCharacter->ServerSideInit();
	}
}
void ACCharacter::ServerSideInit()
{
	CAbilitySystemComponent->InitAbilityActorInfo(this, this);	//应用能力系统组件前都要初始化
	CAbilitySystemComponent->ApplyInitialEffects();		//效果初始化
}

 所以,要在角色类里,重写服务器调用函数:

	// 只有服务器调用的方法
	virtual void PossessedBy(AController* NewController) override;
void ACCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	// AI控制的角色
	if (NewController && !NewController->IsPlayerController())
	{	
		ServerSideInit();
	}
}

源码:

Source/Crunch/Public/Character/CCharacter.h:

// Copyright@ChenChao

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "CCharacter.generated.h"

class UWidgetComponent;
class UCAbilitySystemComponent;
class UCAttributeSet;

UCLASS(Abstract)
class CRUNCH_API ACCharacter : public ACharacter, public IAbilitySystemInterface
{
	GENERATED_BODY()

public:
	
	ACCharacter();
	//服务器端初始化
	void ServerSideInit();		
	//客户端初始化
	void ClientSideInit();		
	//判断是否有本地玩家控制
	bool IsLocallyControlledByPlayer();
	// 只有服务器调用的方法
	virtual void PossessedBy(AController* NewController) override;

	/********************************************************************************/
	/*                             GameplayAbilitySystem                            */
	/********************************************************************************/
	virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
	

	
protected:
	
	virtual void BeginPlay() override;


private:
	UPROPERTY(VisibleDefaultsOnly, Category="GamePlay Ability")
	TObjectPtr<UCAbilitySystemComponent> CAbilitySystemComponent;
	
	UPROPERTY(VisibleDefaultsOnly, Category="GamePlay Ability")
	TObjectPtr<UCAttributeSet> CAttributeSet;

	/********************************************************************************/
	/*                                       UI                                     */
	/********************************************************************************/
	UPROPERTY(VisibleDefaultsOnly, Category="UI")
	TObjectPtr<UWidgetComponent> OverHeadWidgetComponent;		//小部件组件

	//控制头顶状态部件
	void ConfigureOverHeadStateWidget();
};

Source/Crunch/Private/Character/CCharacter.cpp:

// Copyright@ChenChao


#include "Character/CCharacter.h"

#include "Components/WidgetComponent.h"
#include "GAS/CAbilitySystemComponent.h"
#include "GAS/CAttributeSet.h"
#include "UI/Widget/OverHeadStateGauge.h"

// Sets default values
ACCharacter::ACCharacter()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;

	// 网格体无碰撞
	GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);

	//添加组件
	CAbilitySystemComponent = CreateDefaultSubobject<UCAbilitySystemComponent>(TEXT("CAbilitySystemComponent"));
	CAttributeSet = CreateDefaultSubobject<UCAttributeSet>(TEXT("CAttributeSet"));

	OverHeadWidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("OverHeadWidgetComponent"));
	OverHeadWidgetComponent->SetupAttachment(GetRootComponent());
}

void ACCharacter::ServerSideInit()
{
	CAbilitySystemComponent->InitAbilityActorInfo(this, this);	//应用能力系统组件前都要初始化
	CAbilitySystemComponent->ApplyInitialEffects();		//效果初始化
}

void ACCharacter::ClientSideInit()
{
	CAbilitySystemComponent->InitAbilityActorInfo(this, this);	//应用能力系统组件前都要初始化
}

bool ACCharacter::IsLocallyControlledByPlayer()
{
	return GetController() && GetController()->IsLocalPlayerController();
}

void ACCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	// AI控制的角色
	if (NewController && !NewController->IsPlayerController())
	{	
		ServerSideInit();
	}
}

UAbilitySystemComponent* ACCharacter::GetAbilitySystemComponent() const
{
	return CAbilitySystemComponent;
}


void ACCharacter::BeginPlay()
{
	Super::BeginPlay();
	ConfigureOverHeadStateWidget();
}

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);
	}
}

效果:

PS:其实,我们习惯在角色类里的PossessedBy方法里写服务器代码,在控制器类的AcknowledgePossession方法里写客户端方法:

修改如下:

Source/Crunch/Public/Character/CCharacter.h:

// Copyright@ChenChao

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "CCharacter.generated.h"

class UWidgetComponent;
class UCAbilitySystemComponent;
class UCAttributeSet;

UCLASS(Abstract)
class CRUNCH_API ACCharacter : public ACharacter, public IAbilitySystemInterface
{
	GENERATED_BODY()

public:
	
	ACCharacter();
	
	void ServerSideInit();		//服务器端初始化
	void ClientSideInit();		//客户端初始化
	//判断是否有本地玩家控制
	bool IsLocallyControlledByPlayer() const;
	// 只有服务器调用的方法
	virtual void PossessedBy(AController* NewController) override;
protected:
	
	virtual void BeginPlay() override;
	
	/********************************************************************************/
	/*                             GameplayAbilitySystem                            */
	/********************************************************************************/
public:
	virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
	
private:
	UPROPERTY(VisibleDefaultsOnly, Category="GamePlay Ability")
	TObjectPtr<UCAbilitySystemComponent> CAbilitySystemComponent;
	
	UPROPERTY(VisibleDefaultsOnly, Category="GamePlay Ability")
	TObjectPtr<UCAttributeSet> CAttributeSet;
	
	/********************************************************************************/
	/*                                       UI                                     */
	/********************************************************************************/
private:
	//控制头顶状态部件
	void ConfigureOverHeadStateWidget();



	//检测状态条可见性
	void UpdateHeadGaugeVisibility();
private:
	UPROPERTY(VisibleDefaultsOnly, Category="UI")
	TObjectPtr<UWidgetComponent> OverHeadWidgetComponent;		//小部件组件

	//计时器频率
	UPROPERTY(EditDefaultsOnly, Category="UI")
	float CheakUpdateRate = 0.2f;

	//状态条可见距离
	UPROPERTY(EditDefaultsOnly, Category="UI")
	float CheakUpdateDistance = 300.f;

	// 距离检测计时器句柄
	FTimerHandle VisibilityCheckTimerHandle;
	
};

Source/Crunch/Private/Character/CCharacter.cpp:

// Copyright@ChenChao


#include "Character/CCharacter.h"

#include "Components/WidgetComponent.h"
#include "GAS/CAbilitySystemComponent.h"
#include "GAS/CAttributeSet.h"
#include "Kismet/GameplayStatics.h"
#include "UI/Widget/OverHeadStateGauge.h"

// Sets default values
ACCharacter::ACCharacter()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;

	// 网格体无碰撞
	GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);

	//添加组件
	CAbilitySystemComponent = CreateDefaultSubobject<UCAbilitySystemComponent>(TEXT("CAbilitySystemComponent"));
	CAttributeSet = CreateDefaultSubobject<UCAttributeSet>(TEXT("CAttributeSet"));

	OverHeadWidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("OverHeadWidgetComponent"));
	OverHeadWidgetComponent->SetupAttachment(GetRootComponent());
}

void ACCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	ServerSideInit();
	
	/*
	// AI控制的角色
	if (NewController && !NewController->IsPlayerController())
	{	
		ServerSideInit();
	}
	*/
	
}

void ACCharacter::ServerSideInit()
{
	CAbilitySystemComponent->InitAbilityActorInfo(this, this);	//应用能力系统组件前都要初始化
	CAbilitySystemComponent->ApplyInitialEffects();		//效果初始化
}

void ACCharacter::ClientSideInit()
{
	CAbilitySystemComponent->InitAbilityActorInfo(this, this);	//应用能力系统组件前都要初始化
}

UAbilitySystemComponent* ACCharacter::GetAbilitySystemComponent() const
{
	return CAbilitySystemComponent;
}

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);

		GetWorldTimerManager().ClearTimer(VisibilityCheckTimerHandle);
		GetWorldTimerManager().SetTimer(VisibilityCheckTimerHandle, this, &ACCharacter::UpdateHeadGaugeVisibility, CheakUpdateRate, true);
	}
}

bool ACCharacter::IsLocallyControlledByPlayer() const
{
	return GetController()  && GetController()->IsLocalPlayerController();
}

void ACCharacter::UpdateHeadGaugeVisibility()
{
	//测算距离
	APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
	if (!PlayerPawn) return;
	float Distance = FVector::DistSquared(GetActorLocation(), PlayerPawn->GetActorLocation());
	//隐藏状态条
	OverHeadWidgetComponent->SetHiddenInGame(Distance > CheakUpdateDistance*CheakUpdateDistance);
}

void ACCharacter::BeginPlay()
{
	Super::BeginPlay();
	ConfigureOverHeadStateWidget();
}

Source/Crunch/Public/Player/CPlayerController.h:

// Copyright@ChenChao

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "CPlayerController.generated.h"

class ACPlayerCharacter;
class UGameplayWidget;
/**
 * 
 */
UCLASS()
class CRUNCH_API ACPlayerController : public APlayerController
{
	GENERATED_BODY()

public:
	
	/*
	// 只有服务器调用的方法
	virtual void OnPossess(APawn* InPawn) override;
	*/
	
	// 只有客户端(或者监听服务器)调用的方法
	virtual void AcknowledgePossession(class APawn* P) override;
private:
	UPROPERTY()
	TObjectPtr<ACPlayerCharacter> CPlayerCharacter;

	/*************************************************************************************************/
	/*                                             UI                                                */
	/*************************************************************************************************/
private:
	void SpawnGameplayWidget();
	
	UPROPERTY()
	TObjectPtr<UGameplayWidget> GameplayWidget;

	UPROPERTY(EditDefaultsOnly, Category="UI")
	TSubclassOf<UGameplayWidget> GameplayWidgetClass;
};

Source/Crunch/Private/Player/CPlayerController.cpp:

// Copyright@ChenChao


#include "Player/CPlayerController.h"

#include "Blueprint/UserWidget.h"
#include "Player/CPlayerCharacter.h"
#include "UI/Widget/GameplayWidget.h"

/*
void ACPlayerController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	CPlayerCharacter = Cast<ACPlayerCharacter>(InPawn);
	if (CPlayerCharacter)
	{
		CPlayerCharacter->ServerSideInit();
	}
}
*/

void ACPlayerController::AcknowledgePossession(class APawn* P)
{
	Super::AcknowledgePossession(P);
	CPlayerCharacter = Cast<ACPlayerCharacter>(P);
	if (CPlayerCharacter)
	{
		CPlayerCharacter->ClientSideInit();
		SpawnGameplayWidget();
	}
	
}

void ACPlayerController::SpawnGameplayWidget()
{
	if (!IsLocalPlayerController()) return;

	//创建游戏玩法小部件
	GameplayWidget = CreateWidget<UGameplayWidget>(this, GameplayWidgetClass);
	if (GameplayWidget)
	{
		GameplayWidget->AddToViewport();		//添加到视口
	}
}

效果:

 出现BUG:

当用监听服务器运行游戏时,别的玩家也会隐藏状态条:

实验:

(1) ROLE_SimulatedProxy - 模拟代理,表示该对象在本地是远程对象的模拟副本

if ( GetLocalRole() == ROLE_SimulatedProxy)
	{
		OverHeadWidgetComponent->SetHiddenInGame(true);
		return;
	}

效果:

客户端模式:其他的客户端的角色和AI控制的角色都隐藏了

监听服务器模式:其他客户端的角色隐藏了,AI没隐藏

(2) ROLE_AutonomousProxy - 自主代理,表示该对象在本地有自主控制权(如玩家控制的角色)

if ( GetLocalRole() == ROLE_AutonomousProxy )
	{
		OverHeadWidgetComponent->SetHiddenInGame(true);
		return;
	}

效果:

客户端:自己控制的角色隐藏了

服务器:别的客户端控制的角色隐藏了

(3) ROLE_Authority - 权威角色,表示该对象在网络中具有最高控制权(通常是服务器)

if ( GetLocalRole() == ROLE_Authority)
	{
		OverHeadWidgetComponent->SetHiddenInGame(true);
		return;
	}

效果:

客户端:没有隐藏的

服务端:全部隐藏

ADS 使用调整器动态调参教程(Tuning) ADS动态调参教程 阅读详情

相关推荐

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1784

ue4 只有本地玩家控制器才能被指定到控件 xxx并非本地玩家控制器

可以添加一个分支判断 调用Controller的 IsLocalController

2281

ArcGIS数据处理必备技能:从地理坐标到UTM投影的面转栅格完整流程

本文详细介绍了在ArcGIS中从地理坐标到UTM投影的面转栅格完整流程,包括坐标系转换、像元大小设置及质量控制等关键步骤。通过实战案例和Python脚本示例,帮助用户解决常见问题并优化数据处理效率,特别适合需要精确GIS数据分析的专业人士。

weixin_42628688的博客 180

ue5 lyra探索分析2 持续更新中

意思是 你玩一个角色 同时 还有其他玩家和你一起玩, 那么你电脑上 ,你操作的角色就是ROLE_AutonomousProxy 你电脑上的其他玩家就是ROLE_SimulatedProxy。如果pawn的controller合法 如果这个pawn是local player controller调用 load into experience方法。如果是客户端并且localrole是ROLE_AutonomousProxy。如果是服务器 并且localrole是ROLE_Authority。

opk8848的专栏 920

MATLAB出现”警告: 名称不存在或不是目录“的解决方案

MATLAB出现 警告: 名称不存在或不是目录 的解决方案1. 出现错误2. 问题解释3. 解决方法4. 特殊情况5. 问题解决6. 多多点赞交流 1. 出现错误 打开MATLAB突然发现,出现下面的错误: 提示我们不存在这样的路径。 2. 问题解释 这样的错误很明显,我们曾经在预设路径中添加了这个文件夹。 在某种情况下,我们把它删除了,现在MATLAB找不到它了。 (这里我在桌面上添加了新建文件夹,然后将其添加到MATLAB的搜索路径中。之后把新建文件夹删除了,所以就会出现这样的报错) 3. 解决方法

qq_18820125的博客 5万+

君正T31x metartc集成测试

metartc为国内杨大侠部分开源的一款用于嵌入式领域webrtc库,它与谷歌官方webrtc相比,编译到君正平台的可执行文件仅有5M即可实现webrtc的通信。1. 目前实现的是基于开源版v5.0-b0版本做的简单修改,官方的好几个版本都多少缺点东西,我这里给整理了一下。目前是局域网连接的webrtc,后续尝试走stun和turn试一下NAT穿越的效果。

fsmpeg的博客 3155

UE4学习记录-网络同步补遗

UE4学习记录-网络同步补遗 只有Server端存在多个PlayerController,客户端仅存在一个PlayerController(LocalPlayer),在PlayerController写RPC函数时需要注意到这点 使用Object作为RPC的参数时,务必要确保这个Object在被调用的客户端和服务端都存在,否则你会发现传递过去的参数变成了空值。尤其是使用一些动态生成的Object,...

unknowntheg的博客 280

PhotovoltaicPanelCleanlinessDetector:基于YOLOv8的光伏板清洁状态监测系统

data.yamlyaml复制编辑names:0: clean1: dust3: leaves4: shadow✅ 高精度污染识别✅ 具备实时检测与UI展示✅ 可本地化部署应用未来方向增加污染程度分级(轻度、中度、严重)加入时间序列分析(污染变化趋势预测)无人机集成巡检模块。

YOLO 275

UE4 IsLocallyControlled() 源码分析

ue4 IsLocallyControlled函数分析

qq_63052321的博客 970

1 四种防反接电路——multisim仿真

摘要:防反接电路可防止电源反接损坏器件,主要有四种方案:1)二极管串联(低成本,适用小电流);2)整流桥(无极性输入,但效率低);3)保险丝+稳压管(低损耗但需更换);4)MOS管方案(大电流、高效率,主流选择)。选型需考虑电流、压降和成本,MOS管因其低导通电阻(毫欧级)成为大电流应用的首选。口诀:"小电流二极管,大电流用MOS"可快速指导设计。

XU157303764的博客 1565

详解Linux下使用vscode编译运行和调试C/C++

本教程将具体详解使用Visual Studio Code在Linux环境下使用C/C++方法。 GCC C++ 编译器 (g++) 和 GDB 调试器的方法。 GCC是GNU 编译器集合; GDB 是 GNU 调试器。 1.先决条件 安装Visual Studio Code. 安装C++拓展插件。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下命令

休的博客 6240

ue 小知识点 APlayerCameraManager 和 角色的自己相机

当一个controller possessed一个character的时候,下面代码按顺序看 void APlayerController::OnPossess(APawn* PawnToPossess) { ................. ClientRestart(GetPawn()); ................. } void APlayerController::ClientRestart_Implementation(APawn* NewPawn)

opk8848的专栏 4050

【Simulink教程案例19】基于simulink的扩频通信系统建模与仿真

扩频是一种应用于数字调制信号的调制技术,可以提高传输信号的带宽。扩频通信具有抗干扰能力强,扩频增益越大,抗干扰能力越强。而且扩频通信具有很强的保密性,扩频后信号近似白噪声,功率谱密度也很低。扩频通信可用于多址通信。扩频调制有如下三个特点:① 扩频后信号的带宽远大于信号所需的带宽② 使用扩频码进行扩频调制,扩频码与信号中的数据相互独立③ 在接收端,通过将接收信号与扩频码的同步副本进行相关,实现解扩。

FPGA/MATLAB学习教程/源码/项目合作开发 2196

UE4 从服务端分别获取各个客户端的PlayerController实现

在GameMode里面通过登录的方式,把PC和Index(一定是一个键值),存在一个哈希表里面,再把Index返回给客户端(这里返回的是客户端的PlayerController),让客户端能够通过这个键值从服务端找到对应的自己的PC,然后做出其他操作。 例如做死亡操作,获取对应玩家死亡的PlayerController,然后做出对应方法事件 ...

qqQQqsadfj的博客 2663

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

UI控件看不见或不能点击原因总结

创建了一个控件,就是看不见: 1.当前控件没有添加到父控件中 2.当前控件的hidden = YES 3.当前控件的alpha <= 0.01 4.没有设置尺寸(frame.size、bounds.size) 5.位置不对(当前控件显示到窗口以外的区域) 6.背景色是clearColor 7.当前控件被其他可见的控件挡住了 8.当前控件是个显示图片的控件(没有设置图片\图片不存在,比如UIImage

cr7aaa的专栏 1543

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

UnrealEngine中角色类型判断方法

先判断网络模式(专用服务器/监听服务器/客户端)再判断权威性(最后判断本地控制(这样就能准确区分各种情况下的角色类型了。

chenchaoNH的博客 228

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[UE4]一个PlayerController控制多个Actor的问题

  UE4中,一个PlayerController同时只能控制一个Actor,如果要实现RTS游戏中的那种多个Actor同时移动,需要Spawn出来多个Controller(PlayerController或者AIController等,具体看你需求),每个Controller去Possess一个Actor,然后通过控制这多个Controller来实现移动。   如何创建PlayerCo...

玄冬Wong 3486

Unity3D Unet(Network)玩家子物体如何检测isLocalPlayer

Unity3D Unet(Network)玩家子物体如何检测isLocalPlayer 其实很简单啦,直接上代码~ NetworkIdentity parentIdentity; private void Start() { parentIdentity = transform.parent.GetComponent<NetworkIdentity&...

Coder_4的博客 1531

STM32F407红外避障传感器进阶玩法:教你用ADC读取电位器电压实现动态阈值调节

本文详细介绍了如何利用STM32F407的ADC功能读取红外避障传感器电位器电压,实现动态阈值调节的进阶玩法。通过CubeMX配置、ADC采样代码实现和动态阈值算法,开发者可以提升智能小车和机器人的环境适应能力。文章包含硬件连接指南、源码示例及高级应用场景,帮助用户从基础数字输出升级到智能模拟控制。

weixin_30879169的博客 1003

Unreal Engine 4:学习笔记(八)PlayerController

PlayerController介绍

netyeaxi的专栏 4961

虚拟现实-VR-UE4-编辑自定义Character-上下左右移动-旋转

在上一片文章中,我创建了一个自定义的Character,但是只是有一行log显示,我使用了自己的Character,不能有任何操作,这里,我将记录我修改我的Character的过程 万事第一步,打开工程,哈哈哈。 第一步,添加矩形的移动罗技,就是要定义键盘的按键,打开虚幻引擎,进行键盘按键定义。 打开项目设置,进入项目设置界面

DreamLife&Yaothos 1万+

ShooterGame 学习笔记1 PlayerPawn的两个Mesh的可见性

GameMode Override 为 ShooterGame_TeamDeathMatch GameMode中设置的Default Pawn Class 为 PlayerPawn , PlayerPawn为蓝图类,其父类为ShooterGame.ShooterCharacter 而ShooterCharacter类中做了按键绑定,一旦使用瞄准键,则会置isTargeting = tru...

weixin_30933531的博客 430

虚幻导入模型设置(基建交通数字孪生类)

针对桥梁、港口、码头这类数字孪生项目,模型量大、结构复杂且全是静态物体,FBX 导入设置核心思路应该从“默认能用”转向“为性能和后续数据绑定服务”。

zhanxxiao的博客 188

【UE5.8】VS2026安装

本文介绍了VS2026的安装与验证流程:从官网下载Community 2026安装器,通过引导程序手动选择工作负载并指定安装路径完成安装;验证时使用vswhere检查安装路径,确认MSVC版本≥14.50.35723,并确保VS2022工具链未受影响。最终成功编译UE5.8项目,证明新旧版本可共存且功能正常。

ChaoChao66666的博客 209

UE5 GT、RT同步

在GameThread的一帧中,会看到各种各样的ENQUEUE_RENDER_COMMAND( ... ){ Lambda};这些command 里的lambda 就是要运行在RenderThread中的逻辑。

qq_33727884的博客 237
上一篇: 虚幻引擎UE5专用服务器游戏开发-17 添加顶部状态指示器
下一篇: 虚幻引擎5 GAS开发俯视角RPG游戏 P03-7:广播初始值
AA陈超
博客等级 码龄7年 204粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值