玩法框架

  • 玩法需要和很多系统结合起来:动画、特效、音效、UI、摇杆、战斗系统
  • 玩法多样性、可拓展性
  • 快速迭代

事件机制

设计模式-观察者模式

  • 事件定义
    • 事件类型、事件参数
    • 事件定义怎么做到可拓展?dll注入\C#挂载\脚本语言
  • 回调事件的注册
    • 注意回调事件的生命周期管理
    • 强引用对象
    • 弱引用对象
  • 事件分发
    • 立即分发
      • 会造成时序问题
      • 问题:可能造成掉帧问题:比如生成粒子
    • 消息队列
      • 序列化和反序列化(反射)
      • 环形队列(ring buffer) 管理读写
      • 分批(网络消息队列、战斗消息队列、动画消息队列)
      • 问题1:消息执行顺序无法确定
      • 问题2:会造成一帧的延迟,影响打击感
    • 需要支持多种分发方式:preTick、postTick、Inmediately
实时分发会造成时序问题

游戏逻辑和脚本系统

脚本语言

  • 支持快速迭代
  • 易上手
  • 支持热更新
  • 在虚拟机上运行,崩溃不影响主线程
原理:脚本文本==》byteCode==》虚拟机
速度比较慢

脚本语言和引擎的对象管理

脚本语言创建的对象的生命周期,应该由脚本语言管理还是引擎管理

  1. 引擎管理

2. 脚本系统管理

GC系统来管理对象
游戏系统复杂的话,要进行GC优化,注意GC的产生

脚本系统的架构

  1. 引擎调用脚本

2. 脚本调用引擎

引擎提供服务
把引擎作为SDK来使用

脚本语言热更新实现原理

修改函数的指针

脚本语言的问题

  • Lua 的 JIT 模式,just in time 模式,动态解释,即时编译,是一种优化虚拟机运行的技术。即时编译器会将频繁执行的代码编译成机器码缓存起来,下次调用时将直接执行机器码。相比原生逐条执行虚拟机指令效率更高。而对于那些只执行一次的代码仍然逐条执行。
蓝色Lua,红色Python,绿色C#,左时间,右内存

可视化脚本

关键点

  • 变量
    • 类型
    • 作用域
  • 表达式
    • 使用节点来表达表达式
  • 控制流
    • 顺序
    • 条件
    • 循环
  • 函数
    • 传入参数
    • 方法体
    • 返回值
    • 成员变量
    • 成员方法
控制流
使用图来表达函数

使用蓝图来定义类

使用蓝图来定义类

可视化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
    • 机器学习