Unreal游戏初始化流程

前言

本文主要是总结Unreal在游戏启动时的初始化流程,包括讨论PIE和Standalone的区别,避免把一些初始化逻辑放在不合适的位置,比如我希望在所有Actor BeginPlay后执行某个逻辑,那我如果把它放在Subsystem的initialize中显然就会搞砸
在这里插入图片描述

启动入口

当我们PlayStandalone或者打包后启动后使用的Engine类型是GameEngine,在编辑器中的Engine类型是EditorEngine,Standalone状态下分两步Init和Start,PIE则只有一步StartPlayInEditorSession但内部其实也可以拆成Init和Start。

GameInstance

Init

两者分别通过GameInstance的InitializeStandaloneInitializeForPlayInEditor初始化GameInstance,区别在于Editor状态下在初始化GameInstance前我们其实已经有了World,所以会先通过PostCreatePIEWorld触发World的初始化,也就是说PIE的InitWorld是在InitGameInstance之前的,WorldSubsystem的Initialize会优先于GameInstanceSubsystem
在GameInstance的Init中会先执行ReceiveInit,对于Unlua游戏这里往往是lua侧的初始化入口(初始化lua侧的一切系统)。然后初始化Subsystem

Start

入口分别是StartGameInstanceStartPlayInEditorGameInstance,对于PIE因为World已经初始化好,所以在OnStart后会立刻对World进行InitializeActor和BgeinPlay。而Standalone会通过LoadMap进行异步加载地图,DS联机的话客户端会等待Server广播的加载地图消息,待地图加载完毕后依次对World执行Init、InitializeActor和BeginPlay

World

Init

这步只包括Subsystem初始化

InitializeActorsForPlay

这里首先会初始化所有世界中所有的Component,具体方式是对每个Actor进行PreRegister->Register->PostRegister,在Register中每个Actor会依次注册自己的TickFunction->注册RootComponent->注册其他Component。
然后会初始化GameMode调用InitGame,并广播OnActorInitialized,这里MatchState也会进入EnteringMap阶段

BeginPlay

这里会分别调用WorldSubsystem的OnWorldBeginPlay和广播OnWorldBeginPlay事件,此外会调用GameMode的StartPlay
在StartPlay中会遍历场景中所有Actor调用BeginPlay,然后广播OnWorldMatchStarting事件
这里MatchState会进入WaitingToStart,如果ReadyToStartMatch的话则进入InProgress

小结

所有组件注册后 OnActorsInitialized
所有Actor BeginPlay后 OnWorldMatchStarting或者OnWorldBeginPlay
WorldSubsystem的OnWorldBeginPlay在所有Actor BeginPlay前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值