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的创建
在这里插入图片描述
至此,从引擎主循环启动到创建玩家的流程就结束了。

<think>好的,我现在需要帮助用户解决在UE5.5的Lyra示例项目中集成UnLua的问题。首先,我需要了解UnLua是什么,以及它在UE项目中的作用。UnLua是一个用于Unreal Engine的Lua脚本插件,允许开发者使用Lua语言进行游戏逻辑的编写,提高开发效率和灵活性。 接下来,我需要考虑Lyra项目的结构。根据用户提供的引用,Lyra项目采用了模块化设计,各个功能模块独立存在,比如InputConfig、GAS(Gameplay Ability System)等。用户之前的问题中提到的引用[1]和[2]提到了输入配置和角色配置,这些可能与集成UnLua时需要处理的部分有关。 用户想将UnLua集成到Lyra中,可能需要修改项目的构建文件(如.Build.cs),添加UnLua的模块依赖。引用[4]中提到Lyra项目的结构是头文件和cpp文件混放在一起,并且Build.cs中的路径代码有限,所以需要确保UnLua的路径正确包含在项目中。 另外,UnLua需要与UE的蓝图和C++代码交互,可能需要修改Lyra的启动模块,初始化Lua环境。例如,在LyraGame模块的启动函数中初始化UnLua,并设置Lua文件的加载路径。同时,需要处理Lyra原有的GameplayTag、InputAction等系统与Lua脚本的绑定,可能需要通过UnLua的接口将蓝图中的逻辑替换为Lua脚本。 还需要考虑动画系统的集成,引用[3]提到Lyra的动画蓝图较为复杂,如果用户希望用Lua控制动画逻辑,可能需要将动画蓝图中的部分功能迁移到Lua脚本中,这涉及到动画蓝图和Lua之间的通信。 在测试阶段,需要确保所有修改后的模块能够正确编译,并且Lua脚本能够被正确加载和执行。可能遇到的问题包括模块依赖缺失、路径配置错误、或Lua与C++之间的数据类型转换问题。此时需要参考UnLua的官方文档,检查每一步是否正确配置,并利用日志输出调试信息。 总结步骤大致为:获取UnLua插件并放入项目目录,修改项目构建文件,配置启动模块初始化Lua,调整输入和游戏逻辑绑定,处理动画系统,最后测试并调试。需要提醒用户注意版本兼容性,尤其是UE5.5和UnLua的版本是否匹配,以及遵循Lyra的模块化设计原则,避免破坏原有结构。</think>### UE5.5 Lyra示例项目集成UnLua的步骤指南 #### 1. **环境准备** - 确保已下载UnLua插件(兼容UE5.5版本),可从GitHub仓库或UnLua官网获取。 - 将UnLua插件放置在Lyra项目的`Plugins`目录下(若没有则手动创建)。 #### 2. **修改项目构建配置** - 在Lyra项目的`.Build.cs`文件中添加UnLua模块依赖: ```csharp // LyraGame.Build.cs PublicDependencyModuleNames.AddRange(new string[] { "UnLua", // 添加UnLua模块 "LyraGame", "GameplayAbilities", ... }); ``` - 引用[4]提到Lyra的Build.cs路径配置较为简单,需确认插件路径已正确包含。 #### 3. **初始化Lua环境** - 在Lyra的**启动模块**(如`LyraGame`)中添加UnLua初始化代码: ```cpp // LyraGame.cpp #include "UnLua.h" void FLyraGameModule::StartupModule() { FUnLuaModule::Get().Startup(); // 初始化UnLua } ``` - 设置Lua脚本默认加载路径(如`Content/Script`)。 #### 4. **绑定输入与GAS到Lua** - **输入映射**:根据引用[1],Lyra使用`InputConfig`结构体关联输入与GameplayTag。可在Lua中重写输入响应逻辑: ```lua -- Input.lua local function OnInputAction(PlayerController, InputAction) if InputAction == "Jump" then -- Lua处理跳跃逻辑 end end BindInput(OnInputAction) ``` - **GAS集成**:引用[2]提到Lyra通过`AbilitySystemComponent`管理技能。通过UnLua覆写Ability激活逻辑: ```lua -- Ability.lua function ActivateAbility(Ability) if Ability:GetTag() == "Attack" then -- Lua实现攻击逻辑 end end ``` #### 5. **动画系统适配** - 根据引用[3],Lyra的动画系统通过动画蓝图控制。可将部分动画逻辑迁移到Lua: ```lua -- AnimBP.lua function UpdateAnimParams(Speed, Direction) AnimGraph:SetFloatParam("Speed", Speed) AnimGraph:SetFloatParam("Direction", Direction) end ``` #### 6. **测试与调试** - 在编辑器中启用UnLua插件(`Edit > Plugins > UnLua`)。 - 创建测试Lua脚本(如`Content/Script/Test.lua`),并在关卡蓝图中调用: ```lua Print("UnLua Integration Success!") ``` - 检查日志输出,确保无`Lua_State`初始化错误或路径问题。 #### 7. **注意事项** - **版本兼容性**:确认UnLua插件支持UE5.5,否则需从源码编译适配版本。 - **模块化设计**:避免直接修改Lyra核心模块,建议新建`LyraLua`模块管理集成代码[^2][^4]。 - **性能优化**:高频逻辑(如Tick事件)建议保留C++实现,Lua用于业务逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值