一、网络角色
当我们通过客户端去游玩一款游戏时,我的客户端,服务器,其他客户端构成了一个游戏网络,在我的客户端上存在一个自己操作的角色,在服务器上和其他客户端上会存在一个我的角色的副本,在进行游戏开发时需要明白我们要操作的是那种角色。
二、四种权限
UE5中存在ENetRole枚举,列举了几种权限,虚幻引擎使用的是权威服务器模型
ENetRole::ROLE_Authority:服务端角色
ENetRole::ROLE_SimulatedProxy:客户端模拟角色
ENetRole::ROLE_AutonomousProxy:客户端角色
ENetRole::ROLE_None:没有角色
ENetRole::ROLE_MAX: 角色数量最大值
二、目标
在角色模型的上方添加一个UsrWidget去显示当前的角色具有哪个权限
三、实现 ue5中将函数OnLevelRemovedFromWorld替换成NativeDestruct
1.创建C++类父类是UsrWidget
2.创建对应的蓝图类,双击蓝图天机一个text命名为DisplayText
xxx.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "OverheadWidget.generated.h"
/**
*
*/
UCLASS()
class BLASTER_API UOverheadWidget : public UUserWidget
{
GENERATED_BODY()
public:
UPROPERTY(meta = (BindWidget))
class UTextBlock* DisplayText;
void SetDisplayText(FString TextDisplay);
UFUNCTION(BlueprintCallable)
/** 显示网络角色是哪种类型 */
void ShowPlayerNetRole(APawn* InPawn);
protected:
//virtual void OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld) override;
virtual void NativeDestruct() override; /** NativeDestruct()替换OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld) */
};
xxx.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "OverheadWidget.h"
#include "Components/TextBlock.h"
void UOverheadWidget::SetDisplayText(FString TextDisplay)
{
if (DisplayText)
{
DisplayText->SetText(FText::FromString(TextDisplay));
}
}
void UOverheadWidget::ShowPlayerNetRole(APawn* InPawn)
{
/** 获得本地角色的类型 */
ENetRole LocalRole = InPawn->GetLocalRole();
FString Role;
switch (LocalRole)
{
case ENetRole::ROLE_Authority:
Role = FString("Authority");
break;
case ENetRole::ROLE_AutonomousProxy:
Role = FString("ROLE_AutonomousProxy");
break;
case ENetRole::ROLE_None:
Role = FString("ROLE_None");
break;
case ENetRole::ROLE_SimulatedProxy:
Role = FString("ROLE_SimulatedProxy");
break;
}
FString LocalRoleString = FString::Printf(TEXT("Local Role:%s"),*Role);
SetDisplayText(LocalRoleString);
}
//void UOverheadWidget::OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld)
//{
// RemoveFromParent();/** 将小部件从视口上移除 */
//
// Super::OnLevelRemovedFromWorld(InLevel,InWorld);
//}
void UOverheadWidget::NativeDestruct()
{
RemoveFromParent();/** 将小部件从视口上移除 */
Super::NativeDestruct();
}
3.写好代码后在角色类的头文件中添加当前类的指针变量在源文件中在角色类的构造函数中初始化当前变量
UPROPERTY(EditAnywhere,BlueprintReadOnly,meta = (AllowPrivateAccess = "true"))
class UWidgetComponent* OverheadWidget;
OverheadWidget = CreateDefaultSubobject<UWidgetComponent>(TEXT("OverheadWidget"));
OverheadWidget->SetupAttachment(RootComponent);
4.在角色蓝图类中在将新的窗口(就是刚才创建的userwidget)的细节栏中的用户界面的空间选择屏幕,空间类选择对应的蓝图类(就是刚才创建的userwidget的蓝图类)
5.一点说明 ,界面中左侧的ovrheadwidget框是从左侧BP_BlasetrCharacter下面的OveheadWidget点击拖拽即可
6.如果显示位置不正确如图调整,选中overheadwidget,调整角色上方的方向键
四、最终效果
1.当在本地启动时,本机是服务器类型是ROLE_Authority
2.更改运行的模式,改变运行时角色数量
3.3个玩家的效果如图