一些概念
Pawn
Pawn 是一个演员,可以是世界上的“代理人”。一个控制器(Controller)可以拥有一个Pawn,他们被设置为容易接受输入,他们可以做各种各样的其他类似玩家的东西。请注意,一个Pawn不被认为是人形。
Character
Character 是一个人形的 Pawn.它带有一个用于碰撞的CapsuleComponent和一个CharacterMovementComponent。它可以做基本的类人动作,它可以在整个网络上流畅地复制动作,并且具有一些动画相关的功能。
是一个负责指挥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: 支持自动本地化
Source | Target | Example | Note |
---|---|---|---|
FName | FString | FName name = FName(TEXT("test")); FString str = name.ToString(); | |
FName | FText | FName 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". |
FString | FName | FString str = "test"; FName name = FName(*str); | FString -> FName is dangerous as the conversion is lossy as FName's are case insensitive. |
FString | FText | FString 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". |
FText | FString | FText text = FText::FromString(TEXT("test")); FString str = text->GetText().ToString(); | FText -> FString is dangerous as it is a potentially lossy conversion for some languages. |
FText | FName | NA | There 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. |
FString | TCHAR* | FString str = "test"; TCHAR char = *str; | |
std::string | FString | std:string stdStr = "test"; FString str(stdStr.c_str()); | |
FString | Std::string | FString str = "test"; Std::string stdStr(TCHAR_TO_UTF8(*str)); | |
FString | int | FString str = "123.456"; int32 value = FCString::Atoi(*str); | |
FString | float | FString str = "123.456"; float value = FCString::Atof(*str); | |
int/float | FString | FString 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);
}