虚幻引擎 (Unreal Engine 5) 学习笔记

一些概念

Pawn

Pawn 是一个演员,可以是世界上的“代理人”。一个控制器(Controller)可以拥有一个Pawn,他们被设置为容易接受输入,他们可以做各种各样的其他类似玩家的东西。请注意,一个Pawn不被认为是人形。

Character

Character 是一个人形的 Pawn.它带有一个用于碰撞的CapsuleComponent和一个CharacterMovementComponent。它可以做基本的类人动作,它可以在整个网络上流畅地复制动作,并且具有一些动画相关的功能。

Controller

是一个负责指挥Pawn的Actor。 他们通常有两种,AIController和PlayerController。一个Controller可以“拥有”一个Pawn来控制它。

PlayerController

PlayerController 是Pawn和人类玩家控制它之间的接口。PlayerController实质上代表了人类玩家的意愿。

AIController

一个AIController就是它的声音。一个模拟的“意志”,可以控制一个Pawn。

HUD

HUD 是“抬头显示器”,或在2D屏幕上显示的是常见于许多游戏。考虑健康,弹药,枪瞄准器等。每个PlayerController通常具有其中之一。

Camera

PlayerCameraManager是一个球员的“眼球”,并管理他的行为。每个PlayerController通常也有其一

GameMode

“游戏”的概念分为两​​类。在游戏模式和游戏状态(Game Mode and Game State ) 是游戏的定义,包括像游戏规则的事情,

赢得条件。它只存在于服务器上。它通常不应该有太多的数据在播放过程中发生变化,绝对不应该有客户需要知道的瞬态数据。

GameState

该游戏状态( GameState ) 包括游戏,这可能包括像关连球员名单,得分,那里的作品是一盘棋,或者你在一个开放的世界游戏完成的任务是什么列表的状态。GameState存在于服务器和所有客户端上,并且可以自由复制以保持所有的机器都是最新的。

PlayerState

PlayerState是在游戏中,参与者的状态,诸如人类演奏者或者是模拟播放机的机器人。存在作为游戏一部分的非玩家AI不会有PlayerState。在PlayerState中适当的示例数据包括玩家姓名,得分,类似于MOBA之类的比赛级别,或者玩家是否正在CTF 游戏中携带该旗子。所有玩家的PlayerStates都存在于所有机器上(不像PlayerControllers),并且可以自由复制以保持同步。

字符串转换

UE 自定义了几种字符串,包括 FName,FText,FString 等。各有一些特点:

  • FName: 不区分大小写
  • FText: 支持自动本地化
SourceTargetExampleNote
FNameFStringFName name = FName(TEXT("test"));
FString str = name.ToString();
FNameFTextFName name = FName(TEXT("test"));
FText text = FText::FromName(name);
FName -> FText is valid in some cases, but be aware that
the FNames's content will not benefit from the FText's "auto localization".
FStringFNameFString str = "test";
FName name = FName(*str);
FString -> FName is dangerous as the conversion is lossy as
FName's are case insensitive.
FStringFTextFString str = "test";
FText text = FText::FromString(str);
FString -> FText is valid in some cases, but be aware that
the FString's content will not benefit from the FText's "auto localization".
FTextFStringFText text = FText::FromString(TEXT("test"));
FString str = text->GetText().ToString();
FText -> FString is dangerous as it is a potentially lossy
conversion for some languages.
FTextFNameNAThere is no direct conversion from FText to FName. Instead,
convert to FString and then to FName. FText -> FString -> FName is dangerous as the conversion is lossy as FName's are case insensitive.
FStringTCHAR*FString
str = "test"; TCHAR char = *str;
std::stringFStringstd:string stdStr = "test";
FString str(stdStr.c_str());
FStringStd::stringFString
str = "test"; Std::string stdStr(TCHAR_TO_UTF8(*str));
FStringintFString str = "123.456";
int32 value = FCString::Atoi(*str);
FStringfloatFString str = "123.456";
float value = FCString::Atof(*str);
int/floatFStringFString str1 = FString::FromInt(123);
FString str2 = FString::FromInt(123.456);

创建对象的几种方法

创建Actor对象
创建 Aactor 派生类对象不要用 NewObject 或者 new,而要用 UWorld::SpawnActor()

UWorld * world = GetWorld();
FVector position(0, 0, 0);
AMyActor* myActor = World->SpawnActor<AMyActor>(position, Frotator::ZeroRotator);

创建组件

在 UE 中,为 Actor 创建组件,可以使用 UObject::CreateDefaultSubobject() 模板函数,这个函数只能在构造函数中调用。如下所示:

AMyActor::AMyActor()
{
    MyComponent* myComponent = CreateDefaultSubobject<MyComponent>(TEXT("MyComponent"));
}

加载资源对象

在 UE 中,项目中的所有资源文件,不要看做是文件,而要理解为“静态对象”:也就是对象序列化的产物。加载项目资源可以使用“UObject::StaticLoadObject()”函数,其中重要的参数为对象的 Name,而不是文件路径。UE 底层提供文件读取功能,无论资源文件是存储在独立的 .uasset 文件,还是存储在 .pak 文件中,对于上层都不需要关心。

UStaticMesh* mesh = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(), NULL, TEXT("/Engine/BasicShapes/Plane")));
UStaticMeshComponent* comp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("UStaticMeshComponent"));
comp->SetStaticMesh(mesh);

创建 Uobject 对象

Uobject 的派生类(非Actor、非ActorComponent),使用 NewObject() 模板函数来创建其实例对象。

MyObject* obj = NewObject<MyObject>();

创建自定义普通对象

MyClass* myClass = new MyClass();

UE 中的 log

<占位>

namespace ELogVerbosity
{
	enum Type : uint8
	{
		/** Not used */
		NoLogging		= 0,

		/** Always prints a fatal error to console (and log file) and crashes (even if logging is disabled) */
		Fatal,

		/** 
		 * Prints an error to console (and log file). 
		 * Commandlets and the editor collect and report errors. Error messages result in commandlet failure.
		 */
		Error,

		/** 
		 * Prints a warning to console (and log file).
		 * Commandlets and the editor collect and report warnings. Warnings can be treated as an error.
		 */
		Warning,

		/** Prints a message to console (and log file) */
		Display,

		/** Prints a message to a log file (does not print to console) */
		Log,

		/** 
		 * Prints a verbose message to a log file (if Verbose logging is enabled for the given category, 
		 * usually used for detailed logging) 
		 */
		Verbose,

		/** 
		 * Prints a verbose message to a log file (if VeryVerbose logging is enabled, 
		 * usually used for detailed logging that would otherwise spam output) 
		 */
		VeryVerbose,

		// Log masks and special Enum values

		All				= VeryVerbose,
		NumVerbosity,
		VerbosityMask	= 0xf,
		SetColor		= 0x40, // not actually a verbosity, used to set the color of an output device 
		BreakOnLog		= 0x80
	};
}

UE_LOG(LogTemp, Warning, TEXT("Warning!"));
UE_LOG(LogTemp, Log, TEXT("Log value: %s"), TEXT("my string"));

GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("My message"));


自定义 Category:

DECLARE_LOG_CATEGORY_CLASS(MyCategory, Log, All)
UE_LOG(MyCategory, Log, TEXT("My log..."));

遍历

TObjectIterator, TActorIterator 模板。

编辑模式

  • 编辑模式 左键:左右,转动视 角;上下,移动观察者前后位置
  • 按住鼠标中(或同时按下鼠标左右键)轮:左右,移动观察者左右位置;上下,移动观察者上下位置
  • 按住鼠标右键:左右,移动观察者左右视角;上下,移动观察者上下视角
  • 鼠标中轮:视角拉近拉远
  • 按住鼠标左或右键,再按w,s,a,d,q,e分别代表上下左右移动观察者位置,升降视野
  • 按住鼠标任意键,再滚动中轮调节灵敏度 (前滚更灵敏,后滚反之)
  • 当选中某一Actor时,按F键将focus到该Actor。等同于在World outline双击某个actor
  • 选中中某一Actor时,按住alt,同时用鼠标左键,可以围绕该物体查看
  • 多选:按住Ctrl键选中更多Actor
  • W, E, R:物体的移动、旋转、缩放。也可按空格键切换。
  • 移动时同时按下shift键,可以保持被移动物体距离不变
  • End (Alt +End):将空中的物体放置到地面
  • 按下alt移动物体,将copy一份
  • Scaled Camera Zoom and Pan, Editor Preferences -> Level Editor / Viewports -> Controls/Use distance-scaled camera speed。调整鼠标滚轮随距离变化的灵敏度变化
  • 按住 alt 移动物体,可以复制
  • 按住 shift 可以多选
  • Alt + P: Play

运行模式下

  • Shift + F1: 显示 Mouse cursor
  • Esc: Stop
  • F8: Process to Eject Player
  • Ctrl + Shift + ",": GPU Visualizer (编辑模式也适用)
  • ~: Show Command line

	for (TObjectIterator<UPrimitiveComponent> it; it; ++it)
	{
		it->SetVisibility(true);
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值