Lyra游戏框架宏观框架梳理

news2024/11/18 11:42:47

想象一下一个完整游戏流程。

  1. Loading界面。

  2. 进入场景。

  3. 弹出Menu菜单

  4. 加载角色。

    1. 角色动画系统-切换动画系统(默认-剑客-拳手)

    2. 角色皮肤切换

  5. 相机

  6. 角色可以接收到用户输入,然后进行前后左右移动。

  7. 角色可以接收到用户输入,释放技能,开枪。

  8. 物品交互,背包。

  9. 场景中还有其它的敌人,怪物AI。

游戏不断迭代,推出不同活动后。这时候需要一种插拔式的功能模块。

        10. GameFeature

接下来讲解一下Lyra是如何实现以上的功能点的。

接下来讲解一下Lyra是如何实现以上的功能点的。

  1. 场景

  2. 通过AssetManager,获取到所有的FacingExperience资产,罗列出所有场景

GameModeEperience)的加载流程

  1. GameMode通过命令参数,WordSettingsd等方式来寻找 Experience

  1. 加载对应的GameMode下所有的重写类

  1. ULyraExperienceManagerComponent 来加载Experience中配置的所有参数。

  1. 执行Experiece中所有的Action

  1. 加载并且执行完所有的Acton。后调用加载完成的回调。

  1. 在完成必备的Experience后。加载GameFeature。

切换场景

  1. 根据FacingExperienceName创建场景Request。

  1. 创建Session。然后切换场景。

  1. 切换场景后加载GameMode的时候会通过第一步的Requeset中读取到对应的experience。来执行初始化流程。

UI

加载界面

采用CommonLoadingScreen插件完成。

  1. 在切換地图的时候注冊播放加载动画的事件。

[/Script/CommonLoadingScreen.CommonLoadingScreenSettings]

LoadingScreenWidget=/Game/UI/Foundation/LoadingScreen/W_LoadingScreen_Host.W_LoadingScreen_Host_C

UI框架

采用CommanGame插件+UIExtension插件一起实现。

UE5 Lyra项目UI框架拆解 - 知乎

  1. 配置文件中配置UIPolice。

[/Script/LyraGame.LyraUIManagerSubsystem]

DefaultUIPolicyClass=/Game/UI/B_LyraUIPolicy.B_LyraUIPolicy_C

  1. UIPolice指定对应的UI Layout 。主要用栈的结构来push或者pop layout。
  • W_OverallUILayout -  PrimaryGameLayout 设置所有UI Layout。

  1. 将ULyraActivatableWidget绑定到PrimaryGameLayout中。

  1. ULyraActivatableWidget 可以添加slot。后续可以动态将widget注册到对应的slot下面

角色

角色动画

UE5 白话Lyra动画系统 - 知乎

角色换装

Input

UE5 Lyra项目学习(四) 输入系统 - 知乎

  1. LyraSettingsLocal去注册输入的配置文件。

  1. Player Controller中调用SetupPlayerInputComponent

  1. 角色加载完成的时候调用加载HandleChangeInitState。在HandleChangeInitState调用InitializePlayerInput

  1. 注册InputMapping上下文。

  1. 绑定IA给对应的函数。

基础移动函数

技能函数

相机

TODO

GAS

[UnrealOpenDay2020]深入GAS架构设计 | EpicGames 大钊_哔哩哔哩_bilibili

https://gitee.com/gunsun/gas0

【Unreal】虚幻GAS系统快速入门 - 知乎

ASC

是整个GAS的基础组件。所有需要应用GAS的对象(Actor),都必须拥有GAS组件。也可以被赋予PlayerState(可以保存死亡角色的一些数据)一般只放在Character or PlayerState上

  1. 给角色注册能力ASC。通过ASC注册能力。

GA

 角色的技能,包括攻击、疾跑、施法、翻滚、使用道具等,但不包括基础移动和UI

  1. 创建GA

  1. 接收输入激活能力GA。

GE

 Ability对自己或他人产生影响的途径。 GE通常可以被理解为我们游戏中的buff。比如增益/减益效果(修改属性)。.用于修改属性,如增加50移动速度10s;还能配合GA实现更多玩法

GA能够绑定GE

AS

角色身上可以用float表示的属性,如生命值、体力值、魔力值等

GC

执行非游戏性相关的事情,比如音效,粒子特效,震屏等。

Ability Task

GA是在一帧内完成的,如果想要实现类似Wait的异步逻辑需要使用Task。

Gameplay task

Gameplay tag

完整的做一个GA

  1. 制作一个IA

  1. 绑定IA到IMC中。

  1. IMC注册到Input Subsystem中
  1. Input Subsystem来对IA逐个绑定对应的GA(通过GameTag来进行动态绑定)

  1. 制作一个GA。

  1. 将GA和IA绑定(通过Gametag进行动态绑定)

GameFeature

以Epic的自家游戏《堡垒之夜》为例,在其开发过程中随着每次赛季更新和活动内容迭代,也会很快就发现在玩家的Pawn类里开始充斥了几千行代码和上百个方法。逐渐就变得难以维护和难以查错。每次要做个活动加点新内容,就得在Pawn里添加特定的方法,开发过程逐渐就变成一种苦痛负担。

GameFeatures更进一步,允许在“游戏功能”这个颗粒度上进行解耦。

  • 团队内新人更易上手,因为无需了解项目内其他内在工作机制,就能开发这些独立功能。他可以创建一个GameFeature然后独立的开发和测试。
  • 更少漏洞,更易读代码。因为GameFeature本身是独立自包含的,因此代码天然更易于进行单元测试,可以自然地避免在构建时意外或偶然地依赖其他代码。
  • 更轻松的在多个团队或项目中共享功能,可以更容易的迁移插件模块。在以往我们虽然也幻想一个游戏功能模块可以从一个项目复用到另一个项目,但这些一般都是偏向玩法无关的功能模块。因为游戏玩法模块一般来说都合作得很“紧密”,耦合得很深,一般也很难干净拆出来复用。而GameFeatues则至少为我们提供了一个解决方向,把一些独立玩法封装成GameFeatue,则至少大大增大了复用的可能。
  • 更容易在大型或分布式开发环境中协作,模块化总是能促进团队协作,更少的担心自己的修改会干涉到别人的功能。
  • 更容易在“快迭代更新”游戏中迭代功能,也能快速安全的删除出现问题的功能。当前游戏业是越来越多的网游了,因此这些长运营的游戏一般也都得不停的迭代更新功能,在开发过程中,把这些要更新出去的功能以GameFeature的方式一小包一小包的模块化分发出去,显然更容易开发和管理。万一哪个玩法包出错了,也可以及时动态的关闭它,而不影响游戏本体的功能。我知道有些小伙伴到这可能已经想到可以把GameFeature利用到热更新去了,但这就是另一个大话题了。提前来说,GameFeatues从机制上来说已经支持从网络上下载来加载,但目前来说实现还不够完善。当然把一个GameFeatue打包成pak,再下载加载也是可以的。

《InsideUE5》GameFeatures架构(二)基础用法

GeneralSetting

  • UGameUserSettings
  •  Stores user settings for a game (for example graphics and sound settings), with the ability to save and load to and from a file.
  • AssetManager:
  • A singleton UObject that is responsible for loading and unloading PrimaryAssets, and maintaining game-specific asset references
  • Games should override this class and change the class reference
  • AWorldSettings
  • The default world settings object, used primarily to set the default gameplay experience to use when playing on this map
  • Game Viewport Client Class
  • 修改客户端Viewport显示

  • Local Player Class
  • 在开发的时候玩家登陆服务器发送的默认数据可以通过复写LocalPlayer中的某些方法来实现(e.g GetGameLoginOptions),在继承LocalPlayer复写完成后在项目设置中修改LocalPlayerClass来进行替换默认的LocalPlayer类

实用技巧

  1. bool标识的一种表达方式

SQL
/** is fire animation looped? */
        UPROPERTY(EditDefaultsOnly, Category=Animation)
        uint32 bLoopedFireAnim : 1;

  1. UPROPERTY(config)。配置默认参数。

  1. 继承父类,修改父类中的变量类型。

文章引用

  • https://www.bilibili.com/video/BV14N4y1b7ym/?spm_id_from=333.788&vd_source=f91b86a9db5d272fcc792e207e0f6f89

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言----联合体

不知道大家是否听说过联合体这个名词。但其实大家不用觉得联合体有多特殊,大家可以想象结构体是一栋楼,里面有很多房间,住了形形色色的住户(不用或者相同的数据)。但联合体只有一个房间,所有的住户都挤在这…

半小时到秒级,京东零售定时任务优化怎么做的?

导言: 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法,除了供大家借鉴参考之外,也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源,避免在流量突增时给系统…

认证模式~

认证方式 基于Cookie和Session的认证方式 基于Cookie和Session的认证是传统的Web应用认证机制。它依赖于HTTP协议无状态的特性,在客户端(浏览器)和服务器之间保持用户的状态。 工作原理 用户登录:用户通过输入用户名和密码来登…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora?工作原理:算法原理:应用场景展望与其他视频生成模型相比有哪些优势和不足?优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因,以及介绍名为ZString的库,它可以将字符串生成的内存分配为零。 在C#中,字符串拼接通常有三种方式: 直接使用号连接;string.format;使用StringBuilder; 下面分别细…

table展示子级踩坑

##elemenui中table通过row中是否有children进行判断是否展示子集,通过设置tree-prop的属性进行设置,子级的children的名字可以根据自己的子级名字进行替换,当然同样可以对数据处理成含有chilren的子级list。 问题: 1.如果是根据后…

java大数据开发面试题,完美世界java面试题

02 JVM 线程JVM内存区域JVM运行时内存垃圾回收与算法JAVA四种引用类型GC分代收集算法 VS 分区收集算法GC垃圾收集器JAVA IO/NIOJVM类加载器 03 JAVA集合 接口继承关系和实现LISTSETMAP 04 JAVA多线程并发 JAVA并发知识库JAVA线程实现/创建方式4种线程池线程生命周期&#xf…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 :递归链表 简直是好题啊好题多做做 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 :递归链表 简直是好题啊好题多做做 >>>…

Time Travel

题目链接 解题思路 由于所有边集中的边加起来的总和至多为,无向图即,可以存下所以直接对所有边集中的边进行建边,同时对于每条边,记录其所在边集号对于每个边集,由大到小维护其能通过的时间点然后从1号跑最短路到当前…

javaWeb个人学习03

事务管理: 概述: 一个事务里面的操作 要么同时成功, 要么同时失败例子: 比如在根据id 删除部门的时候 当部门删除成功了 但是遇到了异常 导致下面的代码没有继续执行下去 就没法根据id删除员工的信息了 这个时候 事务就很重要了 开启回滚 或者提交事务 要么同时成功 要么同时…

【考研数学】《汤家凤 1800 》《张宇 1000 》《李永乐 660 》《李林 880 》应该如何选择?

本人数学逆袭的路上,深知选对一本题集对我的重要性!!! 我本科期间,数学并不是我的强项,但是我却能够在考研的时候靠数学甩开别人几十分成功上岸,一本优秀的题集起到了关键的作用。 1800题&…

MySQL的事务与隔离级别

1. 什么是事务? 数据库中的事务是指对数据库执行一批操作,而这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。这个时候就需要用到事务。 最经典的例子就是转账,你要给朋友小白转 1000 块钱&…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子…

RK3568 android11 调试陀螺仪模块 MPU-6500

一,MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动…

计算机网络——IPV4数字报

1. IPv4数据报的结构 本结构遵循的是RFC 791规范,介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本(Version):指明了IP协议的版本,IPv4表示为4。 b. 头部长度(IHL, Internet Header Length&…

web组态软件

1、强大的画面显示web组态功能 2、良好的开放性。 开放性是指组态软件能与多种通信协议互联,支持多种硬件设备,向上能与管理层通信,实现上位机和下位机的双向通信。 3、丰富的功能模块。 web组态提供丰富的控制功能库,满足用户的测…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

《互联网的世界》第二讲-最短路径优先

昨天讲 dns 时讲过,“你问一个当地人最近的厕所在哪,路人给你一个地址…”,可是只有地址还不够,如何到达那里呢?这是本节的内容。 自然的方式是,一边走一边问,根据路人的指示继续一边走一边问…

pikachu之xss获取键盘记录

前备知识 跨域 跨域(Cross-Origin)是指在互联网中,浏览器为了保护用户信息安全而实施的一种安全策略——同源策略(Same-Origin Policy),即浏览器禁止一个域上的文档或者脚本(如通过JavaScript发…