GAMES104:15 游戏引擎的玩法系统基础-学习笔记

news2024/9/20 1:52:28

文章目录

  • 0,游戏性课程框架
  • 一,事件机制
    • 1.1 事件的定义
    • 1.2 callback的注册
    • 1.3 事件的分发系统
  • 二,游戏逻辑与脚本系统
    • 2.1 特点和常见脚本语言
    • 2.2 脚本语言的GO管理
    • 2.3 脚本语言的架构
    • 2.4 可视化脚本
  • 三,Gameplay 开发中的3C :Character、Control、Camera
    • 3.1 角色
    • 3.2 控制
    • 3.3 相机
  • QA


0,游戏性课程框架

在这里插入图片描述

  • Gameplay 的挑战:
    1. 玩法系统要和动画、特效、UI、声效、Audio、外设等多个系统共同合作,因此岗位涉及面很多
    2. 同一个游戏也有很多不同的玩法,比如巫师三和昆特牌,对玩法系统的可拓展性要求高
    3. 玩法的快速迭代

一,事件机制

事件机制就是让GameObject 互相交互的机制,比如走到哪里发生爆炸。这种机制如果全都使用ifelse语句写死条件,系统会崩溃掉,所以一般使用event或者message的形式来实现。

想应对比较复杂的游戏机制时,事件机制一般采用发布-订阅模式(Publish-subscribe Pattern):不同的发布者发送不同类型的事件给事件调度者(event dispatcher),可以理解为一个调度公司,事件调度者把事件告诉对应的订阅者(不知道发布者是谁),然后订阅者作出相应的动作(callback)

  • 该模式的三个关键点分别是 事件的定义、callback、事件的分发系统
    在这里插入图片描述

1.1 事件的定义

Event Type + Event Argument(配置)

Event虽然可以使用基类去继承, 但如果不断加入新的事件类型和对应编辑性,则每次都需要重新编译(与上节课的代码反射相关),这时常见解决方法有:

  1. 将新事件新编译成的C++代码当成 DLL,加入到系统中(UE)
  2. 上层采用 C# 语言,方便动态挂接和扩展
  3. 用脚本语言

1.2 callback的注册

回调函数或触发函数(invoke)。回调函数的注册和触发有一个时间差,在这段时间有可能发生意外,比如订阅者被销毁,因此对象的生命周期和回调函数的安全性是非常重要的。

可以使用c++11中类似智能指针的技术解决:

  1. 强引用:使订阅者在有事件注册时不能销毁。但是会导致系统内存越来越大,所以很少这么用,只有部分情况,比如物体之间有父子关系时使用。
  2. 弱引用:在执行回调函数前,判断订阅者是否存在即可。但是性能会下降一些。

1.3 事件的分发系统

如果分发系统把所有的消息都从头到尾扫一遍的分发效率很低,需要专门的管理。

  • 立即执行:消息来了马上就分发。(但是可能会在线程中打断父函数的调用)

问题:

  1. 当发生连锁反应时,比如手雷引爆其他手雷,会造成回调函数的层数过深的问题。
  2. 如果事件回调本身很耗时,比如粒子系统,帧率会骤降
  3. 调用一层套一层,很难并行
  • 事件队列:把事件存储到Queue中,后续统一处理;并且需要序列化后存储,用到时候再反序列化(c++反射)—跨进程夸网络需要

具体实现:

  1. 使用循环队列Ring Buffer来管理内存(申请一次内存即可)
  2. 使用Batching分批管理:将事件分类,比如网络事件、动画事件、战斗事件等,每一类别分别采用一个队列。

问题:

  1. 不能保证消息执行的顺序(比如先动画后物理等逻辑关系),所以为了保持系统健壮性需要同时支持 PreTick、ImmediateTick,PostTick(这块是bug高发地)
  2. 是one-frame delays系统,会导致一帧左右的延迟(及时性差),因此在需要及时性的地方,比如战斗打击,就要hardcode一下专门处理

二,游戏逻辑与脚本系统

  • 早期游戏逻辑都是直接用c++写的,但这样不可持续,因为:

    1. 每次对游戏逻辑进行修改都要重新编译;
    2. 当遇到错误代码时,很容易导致程序崩溃;
    3. 当已发布游戏遇到 bug 时,难以进行热更新。(现在游戏遇到bug,官方更新一个补丁就能解决,就是用到热更新)
    4. 玩法基本是由设计师负责的,不会写代码,而用脚本语言更容易。
  • 脚本语言运行时会先被编译为bytecode,再到虚拟机上运行,代价是速度慢一些

2.1 特点和常见脚本语言

  • 脚本热更新:可以快速迭代、线上解决bug–其实就是更新函数指针(但需要考虑工程鲁棒性)

  • 脚本语言优点:

    1. 好学易上手
    2. 热更新方便
    3. 脚本语言一般运行在虚拟机沙盒上,可以自己crash而不会导致系统crash,更稳定(大型游戏一旦某个功能crash掉,会立马重新启动脚本重新接入)
    4. 可以快速迭代
  • 脚本语言的问题:

    1. 慢,比如lua就慢很多。可以使用JIT优化—一边解释一边编译
    2. 需要虚拟机去运行脚本语言
    3. 调试不方便
  • 几个受欢迎的脚本语言:

    1. Lua(魔兽世界),轻量内存少,但内库少需要自己写
    2. Python,库强大丰富,不轻量,占用内存多
    3. C#(Unity、暴雪),学习成本低,本身就是编译语言,内存占用中等

2.2 脚本语言的GO管理

脚本语言汇总最难的事对象的管理,但是由谁管理 GO的生命周期呢,是代码还是脚本呢?

  • 引擎代码管理

引擎生命周期管理器–更严谨也有没写好内存泄漏的可能
当脚本涉及到本地对象的时候不安全
当玩法复杂需要创建对象时,在脚本中创建更简单。

  • 脚本管理

GO的生命周期可以被脚本的GC系统(Garbage Collection垃圾回收器)自动管理-----省事但慢,甚至用到10%时间
对象释放的时间不可控(GC 控制)
脚本中如果引用关系过于复杂容易发生内存泄漏

  • 因此一般大型单机都是引擎直接管理,而玩法复杂的比如mmorpg一般用脚本管理GO

2.3 脚本语言的架构

  1. 引擎包脚本:主要玩法写在native code里,把组件扩展成脚本
    在这里插入图片描述
  2. 脚本包引擎:主要玩法写脚本里,把引擎当成 SDK库提供各种服务。(迭代快,需要认真设计接口,但现在用的少—弹幕说网易的自研引擎就是这样)
    在这里插入图片描述

2.4 可视化脚本

  • 比如UE的蓝图,Unity的Visual Scripting、Shader Graph就是可视化脚本,这种形式对艺术家友好,并且可视化更不容易产生错误。
  • 并且可视化脚本debug十分方便,每个节点的输出都可以看到
  • 可视化脚本的问题:
    1. 团队工作时,可视化脚本很难合并,会丧失语义且效率低下(因此很多团队前期用可视化脚本,成熟后会翻译为代码)
    2. 有时候可读性很差,一团乱麻
  • 可以把可视化脚本翻译为脚本,然后再执行(再一次应征可视化脚本就是脚本)

三,Gameplay 开发中的3C :Character、Control、Camera

  • 3C系统是游戏体验的核心
  • 要了解什么是3C系统,《双人成行》可以作为最好的案例。

3.1 角色

  • 角色移动:障碍、上下坡、起步和停下等,要处理非常多细节和复杂状态,比如滑行、滑冰、飞等
    在这里插入图片描述
  • 与环境互动:雪地系统、音效、粒子等等
  • 真实物理互动:状态机控制下的各种状态

3.2 控制

控制系统是游戏丝滑手感的由来

  • 输入设备控制:鼠标键盘、手柄、方向盘、甚至飞行控制器等的控制,比如自动吸附、调整相机等(瞄准辅助也是类似)
  • 反馈感:比如振动或力反馈,键盘背光也算吧
  • 按键组合:拳皇

3.3 相机

  • 相机并不是固定在角色身后的,而是随着角色跑动、走动等状态变化,相机远近大小都跟着变化,或者Camera Track(模仿电影视角更有代入感)
  • Spring Arm:当靠近墙时,保证相机不穿墙。
  • 相机效果:互动抖动、滤镜、各种后处理等
  • 视角变化:第一、三人称切换、武器不同变化、载具不同变化,这个变化还需要插值
  • 除了上述要求,还需要提供一个可视化脚本系统,让设计师能对相机参数进行调整设计。

QA

  • 接入可视化脚本是不是就不需要传统脚本了?不是,很多时候传统脚本效率更高,一般两者都需要
  • 未来平台会不会趋向禁止热更?现在确实一些平台比如ios、ps不喜欢热更,未来会不会变化不能确定
  • 会不会用逻辑和表现分离的模式开发?实际上大部分是分离的,比如一些修仙类游戏的表现比较简单,表现和逻辑可以分的非常开,这样团队规模也可以做得很大,开发效率也会高。但现在更多玩家喜欢互动更多的3A游戏,这样逻辑和表现联系就更紧密,需要糅合去做,对开发者要求也更多。

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

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

相关文章

关雅荻发文批评某脱口秀节目审核问题:为博流量乱搞事情?

最近,针对某脱口秀节目中引发的网络舆情,电影制片人关雅荻发文严厉批评该视频平台的审核问题,指出“这家视频网站对应的节目审核环节严重失职,或者有意渎职,这个脱口秀节目制作方在自己内容策划和制作也有明显失职、严…

一招有效清理宠物浮毛,养宠搭子——质量好的宠物空气净化器推荐

害,好不容易毕业找到了工作进入社会,我以为可以自己决定事情了,结果上周又被我妈臭骂一通。因为我瞒着他们养猫了,他们来看我的时候才知道,说我刚出来养活自己都够呛,哪里还能照顾猫。在我好说歹说下&#…

数字电路与逻辑设计-触发器功能测试及其应用

一、实验目的 1.验证基本RS、JK、D、T和T’触发器的逻辑功能及使用方法; 2.能进行触发器之间的相互转换; 3.学习触发器的一些应用。 二、实验原理 触发器具有两个能够自行保持的稳定状态,用以表示逻辑状…

使用llama.cpp 在推理MiniCPM-1.2B模型

llama.cpp 是一个开源项目,它允许用户在C中实现与LLaMA(Large Language Model Meta AI)模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型,虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重,但它…

vmware中的ubuntu系统扩容分区

1.虚拟机关机 右击虚拟机/设置,进入虚拟机设置 3.启动虚拟机,进入命令行 4.fdisk -l查看要扩展的分区名 5.resize要扩容的分区 su root parted /dev/sda resizepart 3 100% fdisk -l resize2fs /dev/sda3 df -T完成 6.其他 进入磁盘管理 fdisk /d…

MYSQL解说

MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛用于网站和应用程序的后端数据存储。 MySQL的基础知识: 1. 数据库和表 数据库(Database):存储数据的逻辑容器。表(Table&…

JAVA——打印流

目录 一、printStream 二、printWriter 三、打印流的应用——输出重定向 输出语句重定向的意义 一、printStream 1. 作用: 打印流可以实现更方便、更高效的打印数据出去 跟着黑马实现一下:printStream 的底层实现效率更高,println输什么…

关于实时数仓的几点技术分享

一、实时数仓建设背景 业务需求的变化:随着互联网和移动互联网的快速发展,企业的业务需求变得越来越复杂和多样化,对数据处理的速度和质量要求也越来越高。传统的T1数据处理模式已经无法满足企业的需求,实时数据处理成为了一种必…

floodfill+DFS(2)

文章目录 太平洋大西洋流水问题扫雷游戏迷路的机器人 太平洋大西洋流水问题 class Solution { public:vector<vector<int>> res;int m 0, n 0;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m heights.size…

35.贪心算法2

1.按身高排序&#xff08;easy&#xff09; 2418. 按身高排序 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public String[] sortPeople(String[] names, int[] heights) {// 1. 创建⼀个下标数组int n names.length;Integer[] index …

tair性能挑战赛攻略心得-Zzzzz

关联比赛: 第二届数据库大赛—Tair性能挑战 赛题分析 赛题要求实现一个基于persistent memory&#xff08;AEP&#xff09;的持久化键值存储系统&#xff0c;并要求从数据正确性和系统读写性能两个方面来考虑系统设计。 正确性 数据正确性包括数据写入的持久性和原子性两个…

计算机三级网络技术总结(五)

HTTP端口号为80 三平台一出口&#xff1a;网络平台、业务平台、管理平台和城市宽带出口IEEE802.16最高传输速率为134Mbps链路状态数据库中保存的是全网的拓扑结构图&#xff0c;而非全网完整的路由表在无线局域网中&#xff0c;客户端设备用来访问接入点&#xff08;AP&#xf…

MySQL 中的索引覆盖扫描:加速查询的秘密武器

在 MySQL 数据库的使用中&#xff0c;索引是提高查询性能的重要工具。而索引覆盖扫描&#xff08;Index Covering Scan&#xff09;更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…

将有序数组——>二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…

Python编码系列—Python桥接模式:连接抽象与实现的桥梁

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【C语言二级考试】循环结构设计

C语言二级考试——循环结构程序设计 五.循环结构程序设计 1.for循环结构 2.while和do-while循环结构 3.continue语句和break语句 4.循环的嵌套 知识点参考【C语言】循环-CSDN博客 文章目录 1.for循环2.while和do-while循环结构3.continue语句和break语句4.循环的嵌套 1.for循环…

ORA-28032 Your password has expired and the database is set to read only

做个记录。 non-cdb 处于只读状态&#xff0c;CDB创建到noncdb的dblink后产生的报错&#xff0c;dblink可以成功创建&#xff0c;但无法连接到non-cdb。 解决&#xff1a;一开始以为是cdb的密码不正确&#xff0c;mos上找到问题&#xff0c;non-cdb的密码过期了&#xff0c;并且…

m4a怎么转换mp3格式?给你推荐八种m4a转MP3的转换方法

m4a怎么转换mp3格式&#xff1f;在数字音乐的世界中&#xff0c;音频格式的多样性常常让人感到困惑。m4a作为一种流行的音频格式&#xff0c;以其优良的音质和较小的文件体积受到许多用户的青睐&#xff0c;尤其是在苹果设备上。然而&#xff0c;尽管m4a文件在现代设备中表现良…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义&#xff0c;如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…

ShouldSniffAttr在自动化测试中具体是如何应用?

在自动化测试中&#xff0c;ShouldSniffAttr 这样的函数名通常暗示它是一个用于断言&#xff08;assertions&#xff09;的工具&#xff0c;用于检查某个元素或属性是否符合预期的条件。 虽然这不是一个标准的函数名&#xff0c;但我们可以根据命名推测其用途。 例如&#xf…