Unreal 学习笔记(一)
概述 & 杂项小知识
Unreal Garden - 一些 C++ 宏定义Unreal 资产命名规范
- Binaries 文件夹共享之后,美术就不需要装 MSVC 等编译环境了,可以开 C++ 项目
- DerivedDataCache 文件夹共享可以减少烘培时间(烘培的资产在里面)
- 项目名不要包括 Test 字段,容易出问题
Gameplay 框架
- AGameMode:维护当前 Level 的游戏规则
- AGameState:被复制到每个 Client,维护游戏的当前状态
- APlayerState:只有玩家有,其他 AI 没有
- APlayerController:每个玩家一个,处理输入并转换为 Pawn 行为
- APawn:Actor子类,一个生命体,没有输入、碰撞等事件
- ACharacter: 有移动和碰撞的 Pawn(移动开销比较大,NPC多的时候要谨慎使用)
- AGameInstance:游戏运行期间唯一存在的类,管理全局状态
- AGameSubSystem:由 GI 持有,生命周期和 GI 一致,可以做科技子系统、背包子系统等等
蓝图
- Level Blueprint:每个 Level 一个,生命周期和关卡完全一致
- 代码复杂(超过一页)的时候尽量不用蓝图 成员变量:
C++
UPROPERTY(Category = MyActor, EditAnywhere)
bool bIsEnabled;
UPROPERTY(Category = MyActor, EditAnywhere, meta = (EditCondition = "bIsEnabled"))
FVector SomeVector;只有Is Enable勾上的时候才会用
函数声明与实现:
C++
UFUNCTION(BlueprintCallable) // C++实现,蓝图调用
UFUNCTION(BlueprintImplementableEvent) // 蓝图实现,C++声明调用
UFUNCTION(BlueprintNativeEvent) // C++实现默认函数体,蓝图可以重载C++实现流程:先通过UHT到.generated.h替换宏定义,再通过C++编译器编译
脚本语言
脚本语言除了比蓝图写起来好看,另外一方面对热更新友好
两个没有维护的 Lua 插件(使用中的项目包括和平精英, etc.)
正在更新/未来可期的:
- Puerts-Unreal - TypeScript,鸣潮使用中
- UnrealSharp - C#,正在更新
U++ 基础
编码规范
必须遵循,否则过不了UHT
- T:模板类
- U:继承自UObject,如UTexture
- A:继承自AActor
- F:结构体等
- I:抽象接口类
- E:枚举类型
- b:布尔类型必须正确前缀才能编译
常用模板 & 宏
容器:
- TArray, TSparseArray
- TLinkedList, TDoubleLinkedList
- TMap
- TQueue
- TSet(Unordered Set)
- 在 Core 模块中
智能指针:
- 常规 C++ 对象必须被 Unreal 智能指针管理,否则会内存泄漏;有
UCLASS()宏的UE对象可被GC自动回收 - TSharedPtr, TSharedRef, TUniquePtr
- TWeakPtr
- TAutoPtr, TScopedPtr
其他常用:
- FBox, FColor, FGuid, FVariant
- FVector, FRotator, FTransform, TRange
魔法宏:
- UCLASS()
- USTRUCT()
- UFUNCTION()
- UPROPERTY()
其中 UPROPERTY() 宏可以让变量的默认值直接读取DefaultEngine.ini:
C++
UPROPERTY(globalconfig)
int32 MaxPlayers;INI
[/Script/Engine.GameSession]
MaxPlayers=6调试
日志
C++
UE_LOG(LogGameSettings, Log, TEXT("[Tech] Update Tech: [%d]"), bTechEnabled);可视化日志
相机渲染常用指令
- freezerendering: 冻结当前帧
- toggledebugcamera: 自由移动相机
- show bounds: 显示未被剔除(culling)的物体的bounding box