AI游戏技术选型

林一二2025年01月09日 00:01

技术实现

考虑在国外市场发行,结合 Web3 技术提高盈利能力。

用户端运行

  • 本地运行:游戏 AI 脚本主要在用户侧运行,提高运行效率和玩家的操控自由性,并节省服务器成本。由于客户端不需要运行物理规则,所以占用也比较小。
    • 用 Tauri 等技术,实现多端运行,只要能跑 TS/Lua/Python 解释器即可
    • 也支持直接用 GraphQL RPC 接入,让任何 AI 智能体都能参与进来,作为游乐场
  • 服务器限流:大部分操作会进行节流(有冷却时间),各种操作又归为几个大类,频繁的同类请求会被直接丢弃。
    • 限流是动态的,很多玩法和限流量有关
  • 服务器更新状态:服务器定义物理规则,限制所有状态更新需要符合物理规则
    • 由于是静态实现不支持脚本化,所以执行效率非常高
    • 中心化解决冲突,例如两人对砍谁先死就是服务端按操作接收顺序确定;类似交易所实时接受请求,而客户端就是各个量化交易员,有更快的网络连接是一种优势
  • UE专用服务器:播放特效、角色动作、受击特效伤害数字等由服务端返回给客户端播放,客户端只能知道这些结果,不过基本的角色移动等可以在客户端进行预测
    • 游戏循环:游戏服务器同时运行所有玩家的代码,并解决冲突,运行从开始到结束为一个游戏循环。等最慢的代码结束运行后再开始新的游戏循环。
    • 房间分配:UE服务器支持《堡垒之夜》这样100人左右的最佳,需要对大地图分块,并在块内人数过多时类似《EVE》时间膨胀减慢速度,但块外仍可以往块内施法

反作弊

  • 客户端可以随意计算,并调用命令式接口(例如按下上方向键。不提供直接传送到某个点这样的声明式接口)
    • 提供的 SDK 会通过 await 异步操作来等待操作冷却
  • 也考虑用 zk 提交结果:通过零知识证明(zk)的方式提交物理规则模拟结果,在客户端也能确保数据的安全和可靠性。
    • 通过 o1js 执行和周围环境的交互结果,难点是解决和其它玩家操作的冲突
    • 由于zk不便限制CPU用量,也可以对各api添加硬编码的消耗,类似EVM上每个操作码的消耗,从而限制每个循环内的总消耗量。
    • 由于计算实际上在玩家电脑上进行,这个只是作为平衡性限制,玩家可以在每个游戏循环内提交更多操作,但只有在消耗完毕前的操作被接收
  • RPG部分后期实现客户端预测,一开始可以纯服务端计算,限制只能走格子,走慢点但是补间动画做好
  • 可交易物品的获取需要事先抵押或充值,从而拉高开小号刷资源的成本

身份

  • 另开身份服务器

AI逻辑

  • 具体任务:使用UE的行为树、分层状态机等实现基本的生理需求类AI和战斗AI的参考实现,其使用的API会提供给脚本
  • 任务调度:使用UE的插件的效用AI
  • 任务是可以排列成树状的,称为意义之塔,根节点(如吃饱穿暖)效用最大,满足后,才会执行子节点
    • 本质上是行为树,总是先执行根节点,「满足」方法返回 true 后考虑执行子节点,否则执行节点的「执行」方法
    • 树中同级的子节点按父节点定义的顺序执行,可以是从左到右也可以是随机执行
    • 节点可以有「判断」方法,决定是进执行还是跳到下个节点
  • 同优先级的节点产生一个意义之塔的生成树,在意义之塔中联通的节点在生成树中也联通
    • 例如和战斗优先级P0,就会产生一个只有两个节点的树,角色优先做这两件事,忽视别的事情
    • 生理限制强制为P0,例如累极了不论如何都会晕倒
  • 玩家或语言模型可以自行为任何节点增加新的子节点,或替换现有节点为自定义节点。
    • 语言模型对角色自身的修改可以视为角色的成长进化。
    • 节点上可以挂载记录,保留最近的相关事件,供 AI 决策和聊天使用
    • 美术效果上,代码生成最初呈现一堆乱码,随着语言模型生成,这些乱码会逐渐被规整的代码和空行替换,仿佛在随机的书籍中找到了所需的内容。

NPC

  • AI主城中有大量的 NPC,平时为防卡顿不模拟它们,或在单独的服务器中粗粒度地模拟它们的交互,游戏进程中只输出最终的模拟结果,作为与他们交流时的背景信息