UE官方示例项目Lyra Game拆解(三)

本次我们梳理Lyra的角色生成。我们从引擎的加载流程开始。

引擎主循环类LaunchEngineLoop.cpp初始化
在这里插入图片描述
创建编辑器运行的引擎实例
在这里插入图片描述
调用引擎实例的初始化方法
在这里插入图片描述
调用引擎实例的开始方法开始游戏
在这里插入图片描述
UGameEngine是继承自UEgine的在其中重写了Init函数,在该函数中创建GameInstance实例

在这里插入图片描述
在这里插入图片描述
再次重写父类的Start函数,在其中启动游戏实例
在这里插入图片描述
在StartInstance中调用UEngine的Browse方法处理传入的URL并尝试加载地图
在这里插入图片描述
在这里插入图片描述

在地图加载函数UEngine::LoadMap中设置GameMode
在这里插入图片描述
GameMode创建后会自动调用生命周期函数PreInitializeComponents在这个函数里创建了游戏状态类ALyraGameState
在这里插入图片描述
在构造函数中创建了能力系统组件和资源管理器组件
在这里插入图片描述
以上就是引擎启动流程进行的一系列初始化。
接下来就是用户登录流程,从入口组件ULyraFrontendStateComponent开始。在第一篇博客中我们提到了lyra在初始场景的蓝图B_ExperienceList3D中加载了所有资产,其中就有B_LyraFrontEnd_Experience,在这个资产配置中对ULyraFrontendStateComponent组件进行了绑定:
在这里插入图片描述
在资源加载时隐式的把该组件添加到了LyraGameState中,已完成了组件的初始化。我们回到组件内部逻辑:
在这里插入图片描述
在beginPlay函数中注册了一个监听,监听资源加载完成的事件。在OnExperienceLoaded函数中,创建了一个控制流,用于处理一些列阶段性的逻辑:
在这里插入图片描述
FlowStep_WaitForUserInitialization(检查是否发生硬断开连接)
->FlowStep_TryShowPressStartScreen(是否显示PressStart界面)
->FlowStep_TryJoinRequestedSession(尝试加入用户请求的游戏会话)
->FlowStep_TryShowMainScreen(尝试显示主界面)
这里我们只着重看FlowStep_TryShowPressStartScreen函数,

在这里插入图片描述
此处调用了UCommonUserSubsystem的TryToInitializeForLocalPlay函数,进入到
UCommonUserSubsystem内部逻辑,内部代码片段太多,所以只写出简单的调用栈:
TryToInitializeForLocalPlay->TryToInitializeUser->LoginLocalUser(创建了登录完成回调作为参数传入)->ProcessLoginRequest,在ProcessLoginRequest中处理登录请求,因为在PIE以Standalone模式运行实际未触发登录请求,直接执行了之前传入的回调函数UCommonUserSubsystem::HandleLoginForUserInitialize创建本地玩家:
在这里插入图片描述
在gameInstance的CreateLocalPlayer中创建了LocalPlayer同时创建了PlayerController
在这里插入图片描述
在LocalPlayer中调用world的SpawnPlayActor函数
在这里插入图片描述
在World的SpawnPlayActor中对控制器进行了一些设置,最后调用gameMode的PostLogin函数处理登录后的逻辑
在这里插入图片描述
在PostLogin中创建玩家Pawn并开始游戏
在这里插入图片描述
我们继续跟代码,看它是如何创建Pawn的
在这里插入图片描述
此处函数以_Implementation后缀结尾,因为它使用了函数说明符BlueprintNativeEvent,支持C++默认实现和蓝图覆盖,一下是它的声明
在这里插入图片描述
从RestartPlayer调用到RestartPlayerAtPlayerStart在其中完成了Pawn的创建
在这里插入图片描述
至此,从引擎主循环启动到创建玩家的流程就结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值