玩法框架
- 玩法需要和很多系统结合起来:动画、特效、音效、UI、摇杆、战斗系统
- 玩法多样性、可拓展性
- 快速迭代
事件机制
设计模式-观察者模式
- 事件定义
- 事件类型、事件参数
- 事件定义怎么做到可拓展?dll注入\C#挂载\脚本语言
- 回调事件的注册
- 注意回调事件的生命周期管理
- 强引用对象
- 弱引用对象
- 事件分发
- 立即分发
- 会造成时序问题
- 问题:可能造成掉帧问题:比如生成粒子
- 消息队列
- 序列化和反序列化(反射)
- 环形队列(ring buffer) 管理读写
- 分批(网络消息队列、战斗消息队列、动画消息队列)
- 问题1:消息执行顺序无法确定
- 问题2:会造成一帧的延迟,影响打击感
- 需要支持多种分发方式:preTick、postTick、Inmediately
游戏逻辑和脚本系统
脚本语言
- 支持快速迭代
- 易上手
- 支持热更新
- 在虚拟机上运行,崩溃不影响主线程
原理:脚本文本==》byteCode==》虚拟机
速度比较慢
脚本语言和引擎的对象管理
脚本语言创建的对象的生命周期,应该由脚本语言管理还是引擎管理
- 引擎管理
2. 脚本系统管理
GC系统来管理对象
游戏系统复杂的话,要进行GC优化,注意GC的产生
脚本系统的架构
- 引擎调用脚本
2. 脚本调用引擎
引擎提供服务
把引擎作为SDK来使用
脚本语言热更新实现原理
修改函数的指针
脚本语言的问题
- 慢
- Lua 的 JIT 模式,just in time 模式,动态解释,即时编译,是一种优化虚拟机运行的技术。即时编译器会将频繁执行的代码编译成机器码缓存起来,下次调用时将直接执行机器码。相比原生逐条执行虚拟机指令效率更高。而对于那些只执行一次的代码仍然逐条执行。
可视化脚本
关键点
- 变量
- 类型
- 作用域
- 表达式
- 使用节点来表达表达式
- 控制流
- 顺序
- 条件
- 循环
- 函数
- 传入参数
- 方法体
- 返回值
- 类
- 成员变量
- 成员方法
使用蓝图来定义类
可视化Debug
可以参考Behavior Designer的debug,高亮执行节点
脚本可视化的痛点
- merge hell,merge会哭
- 复杂起来就很恐怖
做原型的时候比较好用,真正写功能的时候,还是要翻译成C++或者脚本语言比较好管理
可视化脚本语言运行原理
游戏开发中的3C
Character
- 移动
- 看起来很简单,其实有很多细节
- 角色状态
- 与场景交互
- 需要接入物理系统来实现更加真实的效果:比如滑翔
- 一般用状态机实现
- 战斗
- 属性(血量、蓝量)
- 技能
- 天赋
- 等等
Control
- 不同输入设备
- 鼠标、手柄、模拟装置
- 不同输入
- 相机的拉近和拉远
- 瞄准辅助
- 从眼睛=》脑=》手=》输入设备=》机器反馈,整体有100-200ms的延迟,所以需要瞄准辅助
- 反馈
- 振动
- 组合键&按键序列
Camera
- 相机基本属性
- FOV(Field of view)
- POV(Point of view)
- 相机绑定
- 相机拉近,平滑处理
- 恐惧的时候,瞳孔会缩小,聚焦一个点,看的东西比较少
- 相机效果
- 相机抖动
- 相机后处理
- 多相机管理
- 第一人称和第三人称切换
- 双人游戏相机分屏处理
- 主观感受
- 比如加速,就用加速度线方式实现,动态模糊,拉近相机
- 相机惯性
AI
ai部分看了一下目录,
分为基础AI和高级AI,这部分比较有深度,有意思,所以打算先跳过哈哈哈。后面用到学到。
- 基础AI
- 寻路
- 集群
- 群体模拟
- 环境感知
- 基础ai算法
- 高级AI
- 基于目标,基于计划的AI
- 机器学习