大钊UE(1-3)

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 提供的一系列方便

操作函数的类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值