类型
int8 / uint8 :8位有符号/无符号整数
int16/ uint16 :16位有符号/无符号整数
int32/ uint32 :32位有符号/无符号整数
int64/ uint64 :64位有符号/无符号整数
字符串:String Handling
auto关键字不会自动为您指定指针/引用,需要自己添加
容器:
TArray:类似于std :: vector
TMap
TSet
更多容器参考Containers
迭代器:TObjectIterator
UE4类
类的前缀:
从Actor派生的类以A为前缀(例如,AController)
从Object派生的类以U为前缀(例如,UComponent)
枚举前缀为E(例如,EFortificationType)
接口类通常以I为前缀(例如,IAbilitySystemInterface)
模板类以T为前缀(例如,TArray)
从SWidget(Slate UI)派生的类以S为前缀(例如,SButton)
其他所有内容都以字母F为前缀(例如,FVector)
宏:
带参数的宏定义可以看做是函数
UCLASS():用于告诉Unreal为类生成反射数据。 该类必须派生自UObject。
说明符:Class Specifiers
UCLASS([specifier, specifier, ...], [meta(key=value, key=value, key, key, ...)])
USTRUCT():用于告诉Unreal为结构生成反射数据。
说明符:Struct Specifiers
UPROPERTY():修饰UCLASS或USTRUCT的成员变量。
说明符:Property Specifiers
UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])Type VariableName;
eg:
UFUNCTION():允许将UCLASS或USTRUCT的类方法用作UFUNCTION。
Function Specifiers:参考文档
UFUNCTION([specifier, specifier, ...], [meta(key=value, key=value, ...)])
ReturnType FunctionName([Parameter, Parameter, ...])
UENUM():用于告诉Unreal为枚举生成反射数据。
GENERATED_BODY():
在反射的类或结构中需要GENERATED_UCLASS_BODY()/ GENERATED_USTRUCT_BODY()宏,将附加函数和typedef注入到类体中。
Unreal Property System:
反射是程序在运行时检查自身的能力。
C++本身并不支持任何形式的反射
变量在动态生成时需要使用宏才支持垃圾收集
Actor通常不会被垃圾收集,需要调用Destroy()
USTRUCT从FGCObject派生并覆盖其AddReferencedObjects函数才能垃圾收集
基础类:
默认情况下,UObjects和AActors都有基本的内存管理,包括垃圾收集。
大多数游戏玩法开发不涉及直接从UObjects派生,而是从AActor和UActorComponent派生。
每个Actor或UObject对象都是一个类的单个实例。每个Actor实例都获得其自己的组件唯一实例。
•UObject
虚幻引擎中的基础构建块称为UObject。 这个类与UClass一起提供了引擎中许多最重要的基本服务:
1.垃圾收集
2.属性的可配置值
3.对属性和方法的网络支持
•AActor
包含Component对象的容器。例如,汽车上的轮子,方向盘,汽车车身,车灯等都将被视为组件,而汽车本身就是演员。
Actor可以访问并使用Component提供的功能。
AActor是所有Actors的基类。 AActor派生自UObject。
在将AActor放置在某个级别之前,该AActor必须至少包含一个USceneComponent,其中包含该AActor的平移,旋转和比例。
1.可放置在世界中的物体
2.充当层次结构的组件容器
3.网络中可以复制的基本类型
Pawn:Pawn不被假定为人形。
在多个Pawn切换可以参考Possessing Pawns in Blueprint
Character:是一个人形风格的Pawn。(Pawn的派生类)比Pawn多了1个CharacterMovementComponent,CapsuleComponent和SkeletalMeshComponent
UWorld :: SpawnActor()专门用于产生AActor,自动调用BeginPlay和Tick
Destroy()会调用EndPlay
BeginPlay - 当对象首次进入游戏存在时调用
Tick - 每帧调用一次以便随着时间的推移完成工作
EndPlay - 当对象离开游戏区域时调用
•UActorComponent
必须是AActor的父级,组件只能附加到一个父组件或Actor,但它可能有许多子组件附加到自身,形成一个树。
UActorComponents有自己的行为,通常负责在许多类型的AActors之间共享的功能。
actor中的子组件相对于其父组件或Actor具有位置,旋转和缩放。
1.提供可视网格
2.粒子效应
3.相机视角
4.物理互动
5.运动逻辑
•UStruct
不必从任何特定类扩展为使用UStruct。 您只需要使用USTRUCT()标记结构。
UStructs不是垃圾收集的。 如果创建它们的动态实例,则必须自己管理它们的生命周期。
Game Mode和Game State管理游戏运行的相关信息。
Game Instance:用于存储程序运行时需要持久保存的信息。 不会在关卡加载之后被删除。
Game Mode负责制定游戏规则,例如玩家人数,进入游戏的方式,暂停游戏,level的转换。
AGameModeBase——》AGameMode(查看文档)
游戏模式只存在于服务器上,因此本地客户端无法访问模式实例。如果玩家需要与当前游戏模式相关的更新信息,则该信息可以存储在AGameStateBaseActor 保持同步(RPC)。
在蓝图中设置游戏模式
1.创建GameMode蓝图并为其设置(类)默认值
2.为游戏分配默认游戏模式
编辑——》项目设置——》地图和模式
默认GameMode下拉框指定要使用的GameMode
GameMode:游戏规构成了游戏模式。只存在于服务器上。绝对不应该有客户需要了解的瞬态数据。
1.新建以Game Mode Base为基类的蓝图
AGameModeBase的派生类AGameMode实现了匹配状态的概念,因此更适合标准游戏类型,如多人射击游戏。
2.打开并设置Classes选项卡中的默认类
3.设置默认的游戏模式
4.覆盖默认的游戏模式
在编辑器的右侧
GameState:
当游戏中发生与规则相关的事件并需要跟踪并与所有玩家共享时,该信息将通过GameState进行存储和同步,例如排行榜。
GameState存在于服务器和所有客户端上,可以自由复制以使所有计算机保持最新状态。
PlayerState:
参与者的状态(例如玩家姓名和分数)
作为游戏的一部分存在的非玩家AI将不具有PlayerState
所有玩家的PlayerStates都存在于所有机器上(与PlayerControllers不同),并且可以自由复制以保持同步。