Componential Tree, 一种行为树模块化的组织框架
前言
在找资料阶段,我意外地发现中文环境下居然几乎没有关于策划应该怎么组织行为树的文章。大部分都是从程序的视野出发讨论Game
AI框架怎么设计。虽然基于现在的生产关系来说,程序做个封装得当的架构然后教给策划怎么在小框架里自定义配置就足够应付手游级别复杂度的项目了。但是只有策划自己掌握了AI的细节,才能自底向上推动项目,从AI设计出发影响玩法。举个例子,前几天我在看AI的资料,2022年,日本的游戏AI研究已经在考虑多智能体如何通过传递信息来让临近单位为己方提供帮助。
根据那篇论文我自己琢磨了一个场景并画了一个草图如下,下方小人的门需要上方X按钮开启,而上方的门需要下方O按钮开启,请问AI逻辑应该如何组织能让下方小人正常寻路进门内?
这个问题的关键在于:
如何描述问题的条件,AI能否理解开门的条件是需要另一个AI执行某个操作(甚至这个操作的前提是己方执行某个操作)
如何让其他AI在不硬写脚本的前提下,通过自主的AI规划达成挑战
上面这个问题只是一个引子,希望能激起读者的思考。尽管国内手游界一片欣欣向荣的样子,但我们在游戏行业的积累还是太少,离欧美日的大厂还是有着 ...
酒馆战棋段位算法重建与系数推导
算法猜想
在[上一篇文章]中,我们得出的几个基本的结论就是:
水平评估模型为高斯模型
分数结算算法原本为1V1所用的,通过与每名对手计算一次来拓展为多人混战算法
那么很容易猜到酒馆战棋用的算法是ELO+加权平均。 计算公式如下:
\[Result_i \in {1,2,...,8}\]
\[
Result_{i,j}=
\begin{cases}
\ \ \ 1\ \ \ Result_i<Result_j,\\
-1\ \ \ Result_i>Result_j.
\end{cases}
\]
\[Expect_{i,j} =
\frac{1}{1+10^{\frac{Score_i-Score_j}{-\alpha}}}\]
\[\Delta
Score_{i,j}=\eta*(Result_{i,j}-Expect_{i,j})\]
\[Final_i=\frac{\sum_j^{n-1}(\Delta
Score_{i,j})}{n-1}+\beta\]
公式说明: 第一个公式 \(Result_i\)
表示玩家 ...
谈谈动作游戏中的自动索敌
前言
最近玩了下勇仕的深空之眼,发现里面角色的攻击突击效果过于夸张,于是开始思考自动索敌机制中的设计思路。
本文将结合自己玩过的一些动作游戏总结一下自己的思考。
什么是自动索敌?
首先我们定义一下什么是自动索敌。
在无锁定状态下,如果系统修正玩家的攻击方向、所处位置来使攻击变得更为容易命中一个目标,那么这个机制称为自动索敌。如果我们考虑上形如射击游戏中的远程武器的话,自动瞄准(准星修正)、弹道调整(例如追踪导弹)也可以被定义成一种广义上的自动索敌机制,但本文这里只谈打击范围与角色动画数据相关联的自动索敌机制(一般为近战)。
原神中的自动索敌
自动索敌有哪些组成部分?
朝向修正
将角色通过旋转朝向或插值朝向目标方向
距离修正
将角色置于或推向能够打击到目标点的期望位置
其他游戏在自动索敌或“主动索敌”的机制表现如何?
先看看端游,手感比较厚重的FS社系列和怪猎系列是没有做自动索敌的。
而主动索敌方面:
在位移上,法环和怪物猎人世界在招式过程中仅允许特定技能机制上的移动(例如法环的难耐癫火);
在朝向上,通常在两个招式之间通过“左摇杆 ...
GDCVault中的原神AI方案
前言
本文根据原神组在GDCVault上进行的分享进行AI的细节拆解与分析,希望能对AI策划有一些系统性的帮助。
GDCVault原PPT链接: 'Genshin
Impact': Building a Scalable AI System
Pipeline
Fig.1. AI Pipeline
Reasoning:
subsystem各自管理各自的参数,以不同的Tick频率,符合ECS架构
感知(对WorldState进行采样)
选择目标(基于策划设计的一系列逻辑决定仇恨、技能目标等)
响应外部事件(受击、听觉等,原神内特化的Feature还有元素状态Buff)
基于关卡的固定行为脚本(演出需要或特定Gameplay需求)
集群(与其他AI互动的需求)
战术位置(出于战术需要被高层AI要求前往某个位置,通常和集群相关)
Decision Tree:决策树
这里说轻量级,估计是十个节点左右,无状态,通过bool状态选择分支的简单决策
Actions:执行具体的行为逻辑
Skills:释放技能,对标GameplayAb ...
Lyra中的Distance Matching
一、前言
关于游戏的角色位移与角色动画中一直有一个值得争议的问题,那就是应该让代码/运动学驱动位移还是动画数据驱动位移。
代码/运动学驱动就是我们常见到的通过赋予一个角色速度、加速度、冲量,来增量地作用于角色的transform。
而动画数据驱动则是通过读取动画片段中存储的根骨骼偏移量,随着时间而对应地赋予角色transform以增量。
单独使用它们都会有各自的问题,代码/运动学驱动会使移动更有规律更符合玩家预期,但是往往代码驱动的位移与动画中表现的位移量会有偏差,导致滑步等现象。而动画数据驱动的位移质量取决于动画的数量,如果动画数量过少会导致在过渡区由于没有合适的动画,无法产生符合玩家直觉的位移量,从而导致玩家感觉角色“笨拙”、“不好操作”。
二、Motion Matching
目前动画数据驱动这个方向的极致方案是Motion
Matching(Code-Driven同样可以使用!),通过对一个庞大的姿势库进行采样和特征提取,在运行时匹配特征最相近的姿势进行播放。
尽管在很多3A级端游中,Motion
Matching已经斩获了亮眼的表现。但是对于手机游戏而言, ...
破晓传说游玩笔记
前言
周末有空,玩下破晓传说,并记录一下游玩过程中的思考。
正文
1. 目标点引导
现在比较常见的小地图标点加主界面悬浮Icon的形式。
2. 软强制引导-镜头参数接管
在即将到达目标点时(仅首次进入该区域),允许玩家移动,但接管玩家的镜头方向。作为新手引导的部分,告知玩家关注点。
这是比较大胆的尝试,相比于强制的接管全部控制的即时演算动画,仅仅将镜头强制指向目标点一段时间,保留玩家的操控力,在起到引导作用的同时也没有打断玩家的体验。
但限制也很大,首先场景必须够简单,避免强制镜头控制看不到合适的地方;其次是移动能力要弱,在新手阶段跑跳攻击没有解锁的情况下使用这一套比较合适,避免出戏。
3. 寻路卡死妥协
破晓传说做了个很新奇的功能,当玩家长时间处于移动状态并与NPC碰撞体接触时,会直接关闭NPC的碰撞体一段时间。然后就可以穿过NPC的模型。
我估计是由于加入了跳跃功能,并且NPC本身可以巡逻移动,角色总能莫名其妙被NPC卡住,关卡策划顶不住了。做了个这个奇奇怪怪的功能保底,不让玩家被完全卡死。
4. NPC对话条件限制
NPC必须处于角色正前方扇 ...
酒馆战棋积分系统解读
前言
酒馆战棋,多多之后唯一的一款原创自走棋。今天刚好顺手看到了这篇文章,又因为我自己也是做匹配系统的,所以对这篇来自暴雪的分享进行一下解读。
开发者访谈:《酒馆战棋》中的个人等级积分
正文
用数学术语来说,就是等级积分的分布应该是一个正态分布的“钟形曲线”。
结论1:积分分布模型是高斯分布
方差是一个与你的等级积分相关的数值,但是不会对你明确显示。这个数值代表了我们对你等级积分的取信程度。如果你是初来酒馆战棋的新手,我们并不知道你的实际水平,因为你并没有进行多少场对战。我们也没有太多数据去反映你在多场对战中表现的变化,所以你的方差会很高。而在你进行一定数量的对战之后,你的方差可能就会降低,我们就能确定这就是你应有的实际等级积分。但是,如果你在单场对战中的结果与我们预期的大相径庭,那么你的方差就又会增高。例如,如果一位高分段玩家在一场有许多低分段玩家参加的对战中败下阵来,那么这位玩家的方差就会提高。
结论2:方差会在失败时提高,符合直觉,但与ELO/GLICKO/TRUESKILL都不一样,是暴雪自创的Feature,之后有空可以模拟一下效果。
当我 ...
如何为决斗链接设计一个更智慧的AI
前言:本文的目标
游戏王:决斗链接是一款DBG手游,其核心策略体现在卡牌资源(手卡、场上卡)与环境资源(通招点、卡位、生命值)的管理与合理运用。
如果想要为决斗链接设计一个AI,这个AI需要有能力“理解”卡牌的两项内容:
卡牌效果
连锁响应
1决定了AI如何定义卡牌的价值,最大化地利用自己的卡牌;
2决定了AI如何安排卡牌的使用顺序以及对抗对手的卡牌效果。
由于当前版本的决斗链接的AI机制还相当原始,所以本文主要针对游戏王:决斗链接的AI机制进行一定的分析并提出一个更优地运用卡牌的AI方案。
以下是两点前置说明:
游戏AI并不是越聪明越好,在对战中“适当地”输给玩家,也是一种游戏设计思路(AI卡牌强度高于玩家却由于运营失误告负,可以给玩家带来智力上的优越感。)
本文中的AI指的是脚本、程序控制策略,如何用规则描述卡牌使用方法,而非基于机器学习的胜率最大化模型。
炉石传说与决斗链接:炉石传说AI策略设计
横向对比炉石传说与决斗链接的AI,由于炉石传说具有两个特点: 1.
基本没有回合外反制 2. 大部分随从卡在放置后次回合才可以进行攻击
因此, ...
线性规划在明日方舟基建系统中的应用
前言
接触过明日方舟NGA社区的人大概都知道一个工具叫ArkPlanner,用来求解最优的刷图线路,其用到的理论工具便是线性规划。
如果要让我用一句话来向对此不太熟悉的人介绍线性规划的作用,我会这样说:如果你需要100个苹果和100个梨,A副本掉落5苹果,B副本掉落5梨,C副本掉落3苹果3梨,那么最优解就是刷C副本,而这个最优方案可以用线性规划来求得。
也许有人会说,我肉眼都看出C副本掉得多,这还要求解吗?然而大部分真实情况下,苹果和梨的价值不统一,如果我们每天最多可消耗100个苹果和6个梨,多余的梨没有使用途径,这时候是否A、C副本的组合成了最优解?又或者,5个梨在商店可以卖100元,然后100元可以购买10个苹果,商品买卖不限量,此时B副本是否又成了最优解?
下面这个链接是我利用线性规划求解基建最优方案的的Python代码,挂在谷歌的Colab线上环境中,可以直接登录运行:
https://colab.research.google.com/drive/10p6xC-R8Mmue-Ra-pCP35LWoPjL-9Fuq?usp=sharing
当你对物品的期望价值不同时 ...
原神NPC动作机制反推
前言
主角与NPC之间的交互,是虚拟世界中为NPC赋予灵性的重要环节。在传统RPG游戏中,往往通过对话、剧情演出等方式塑造NPC的人物形象,而在动作游戏中,NPC的动作表现受环境的反馈而对应变化也是其真实性的表现。
本文的主要内容是根据《原神》游戏内的实机表现,来反推其NPC动作系统中人物碰撞动作、人物受惊动作的实现机制。
从人物碰撞动作说起:
碰撞检测
首先,根据我对角色技能动作/表现动作的观察,原神的动作实现机制应该是网游中比较常见的Code
Driven Locomotion,只是IK做的比较好,另外估计还自研了Root Motion
Extractor将动画数据提取并应用到角色身上。这一方案下,对于角色位置信息的维护应该都是基于模型中心点来判断,那么关于角色碰撞大概率就是直接以空间距离来进行判定。
经测试,
案例1:从墙上往NPC头上跳/飞行时,如果按住方向轮盘触发输入则会触发碰撞动画,否则不会触发碰撞动画
案例2:当NPC主动朝你的方向走来并进入碰撞距离时,不会触发碰撞动画
案例3:当角色处于碰撞范围内时,朝任意方向发起跑步指令不会触发碰撞动画
案例4 ...






