UObject:GC(垃圾回收) MetaData(元数据) Serialization(编辑器可见) Editable(序列化) ClassDefaultObject
AActor:继承于UObject
附加Replication(网络复制) , Spawn(生存) , Tick
Actor并不附加Transform 例 : AGameMode , AGameSession 主要用于节约资源 不需要Transform的类
处理输入 使用 UInputComponent
TSet<UActorComponent*>OwnedComponents 存储Actor所拥有的所有Component
对于UE中的Level(.map) 中存储着大量的Actor 和 UObject
Actor: TSet<UActorComponent*> OwnedComponent 组件集合
UScenceComponent* RootComponent 根组件
void Tick(float DeltaSeconds) 每时每刻做的事情
TArray<AActor*> Children
AActor* Owner.(weak)弱指针
TSet<USetComponent*> ReplicatedComponent 可复制
TArry<UActorComponent*> InstanceComponent 可实例化的
UInputComponrnt InputComponent 控制输入
ULevel继承与UObject 包含大量UActor
Tarray<AActor*> Actors
TLevelScriptActor* LevelScriptActor 场景脚本
TArray<UModelComponent*> ModelComponent 模型构建
AWorldSettings* WorldSettings(Actor[0])世界设定
UE给所有Level提供了Info 用来记录一些当前Level的规则
有一些Actor是不包含ScenceCompnent 这样的Actor不能摆放在Level中
ALevelScriptActor本身为一个Actor UE为减少在Level中写过于复杂的逻辑 不愿意让他作为一个Actor
World将多个Level组成起来
可以一开始加载world中 或者通过Streaming动态加载
World中拥有PresistentLevel 因为一个world中必须要有一个level给玩家提供出生环境
对于每一个Leve都拥有一个WorldSettings 当world将多个Level连接在一起 就拥有多个WorldSettings 此时整个World 配置就是以PresistentLevel的WorldSettings 为主
World与Actor其实并无直接关系
当其他Level被添加到World中时 可以从WorldOutliner(世界细节)中显示Level中的Actor
World中使用TActorIteratorBase迭代器来访问每个Level的Actor
World为了高速访问Pawn和Controller 保存了引用
在世界中物理碰撞是全局的 Level共享着World的一个PhysicsScence
对于World UE的World 不仅仅是游戏场景 编辑器本身也是World
因此UE通过FWorldContext对world进行管理 从一个world切换到另一个world(比如点击播放,从Preview切换到PIE)
FWorldContext用来保存切换过程信息和目标World上下文信息
UE在OpenLevel时,先设置world的Context上的TravelURL,在UEngine::TickWorldTravel时判断TravelURL 是否为空来执行Level的切换
为什么Level切换的信息不在world里?
在Open一个PresistententLevel 的时候 先释放当前的world 再创建一个新的World 如果把信息放在World中 则在切换的时候需要备份上一个World的数据
为什么World和Level的切换需要在下一帧进行切换?
Level的加载是比较缓慢的,需要载入map mesh material 所以需要做到异步化加载
如果要异步加载 仅有两种方法 一种是记录下信息再执行 另一种是使用命令模式 向队列中压入命令再执行。因为OpenLevel 需要加载对应的Actor 所以有部分还是需要在主线程中加载
两种方式均可
WorldContext 是保存在GameInstance中。GameInstance 是高于World的存在。独立于Level的数据就要存储在GameInstance中 。
GameInstance是继承与UObject 可以动态创建。
我们自然可以通过GameInstanceClass来创建 GameInstance的子类。使用这个类进行整个游戏的逻辑
那么是什么存储GameInstance
UGameEngine来存储
UEngine分化出了两个子类UGameEngine UEditorEngine. UE的编辑器也是由UE的引擎渲染出来的,采用Slate的UI框架。
使用该框架可以达到基本跨平台统一,可以复用一套控件库。从本质上来说UE编辑器本身也是一个游戏
UE不支持同时运行多个World,所以GameInstance 是唯一的。比如在Editor中进行MultiplePlayer测试的时候 两个World 是同一个
GamePlayStatic是UE 提供的一系列方便
操作函数的类