第一个关卡:

L_DefaultEditorOverview是Lyra项目的默认关卡,我们打开以后如图

默认关卡.png

玩家是一个小小的棋子,面前有多个带着UI板的光圈。

触碰到它们以后,玩家会进入不同的世界,变成有不同能力的人,而不再是棋子。

玩游戏比较多的应该经常能看到这样来进入游戏。

在选择游戏模式或者角色这些方面有很多游戏都是用类似的方式来做的,有的也是触碰,有的则是用武器攻击等。

当时,我的大学毕设游戏其实也想做成这样,但因为时间原因,并没有那么丰富的游戏模式,最后便放弃了。

现在回头来看,lyra有个现成的功能摆在这,那lyra是怎么做的呢?

自己的想法:

先不看lyra是咋做的,假如当时大学毕业时的我来实现这个功能的话,想想我会咋做,之后再和lyra对比一下,看看哪不同,感觉这样才有更大的收获。

首先,面前这几个UI板肯定是同一个父类的actor,然后带有不同的参数,有些进去后让玩家玩射击的,有的是玩炸弹人的。

然后,actor周围搞一个包围盒啥的,触发overlap以后执行下相应的逻辑,玩家切换关卡,再根据参数传送到不同的关卡里开始游戏。

然后每种游戏搭一个场景写一套gamemode,再换一个角色啥的,赋予不同的能力。

其实这样实现起来还是挺直观的,也简单。

那Lyra是怎么做的呢?

Lyra的做法:

关于上面提到的参数部分其实Lyra也有,而且定义了一个新的高大尚的说法取名为:Experience

Experience:

Lyra这边主要用到了两个重要的Experience。

ULyraUserFacingExperienceToLoad

ULyraExperienceDefinition

首先第一个Experience:ULyraUserFacingExperienceToLoad,这个是绑在UI板actor上的

UserFacingExperienceToLoad.png

这里面记录了很多加载配置,各种名字,图标什么的。

其中比较关键的两个配置:MapID,ExperienceID

MapID主要是告诉你关卡信息,ExperienceID则是与上面提到的第二个Experience,ULyraExperienceDefinition相关,这个等会细说。

创建会话了.png

在玩家overlap的时候,蓝图会掉到这里,使用ULyraUserFacingExperienceToLoad来创建会话了

创建会话C++实现.png

也就是搞了些参数,给新创建的会话初始化了一下

然后正式启动会话

启动会话.png

继续往下找,我们可以发现在GameModeBase::ProcessServerTravel中,对World的NextURL进行了初始化

初始化NextURL.png

其中就包含了ULyraExperienceDefinition的内容

随后,在下一次tick到来时,引擎会在UEngine::TickWorldTravel时取得World的NextURL

获取NextURL.png

在InitGame时,将URL中的ExperienceName赋值给GameMode的OptionsString上

初始化OptionsString.png

然后便可用利用OptionsString去得到ULyraExperienceDefinition了,也就是第二个Experience

在HandleMatchAssignMentIfNotExpectingOne中获取到ExperienceId与ExperienceIdSource

ExperienceId.png

最后在StartExperienceLoad中,加载了Experience的资源

StartExperienceLoad.png

当所有资源加载完以后,便将Experience的actions生效

OnExperienceFullLoadCompleted.png

那这个Actions到底是什么呢?

我们找到代码

Actions.png

原来是存储的是GameFeature的actions,那么可想而知,这些actions的作用就让玩家进入新世界获得新的能力。

总结下:

lyra应用了两个Experience

一个绑在UI板actor上,保存的地图信息和下一个Experience的信息,当玩家触碰时打开新世界,并读取另一个Experience

另一个保存了,GameFeatureActions,但新世界load完以后,执行这些GameFeatureActions

而GameFeatureActions开启后,便开启对应的游戏玩法与角色能力。

这个Experience应用是lyra的特点,简单来看,他起到了一个配置表的作用,但又比配置表大,能独自管理读取配置,像是GameMode的子集。

相比把逻辑全堆在gamemode,这样的写法耦合更低。

灵活使用GameFeature也是Lyra的亮点,你仅仅需要增加一个新的配置,便可使玩家进入世界后获得相应的能力,而不用新增一个Gamemode子类,重写各种游戏玩法,赋予角色能力的内容。

最后修改:2024 年 03 月 26 日
如果觉得我的文章对你有用,请随意赞赏