Skip to content

Unreal 学习笔记(一)

概述 & 杂项小知识

Unreal Garden - 一些 C++ 宏定义Unreal 资产命名规范

  • Binaries 文件夹共享之后,美术就不需要装 MSVC 等编译环境了,可以开 C++ 项目
  • DerivedDataCache 文件夹共享可以减少烘培时间(烘培的资产在里面)
  • 项目名不要包括 Test 字段,容易出问题

Gameplay 框架

Unreal 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.)

正在更新/未来可期的:

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