最近的业务上,又回到Animation Tree这块了。

众所周知的是Animation Tree这些概念已经提出很久了,但是使用有着AT支持的CE引擎的项目,却依然义无反顾地没有使用AT,而且,连某些引擎支持人员居然也没搞明白这是个什么东西,前因后果如何,也不去推行这个前期一旦定好后期一劳永逸的事情。

吭哧百度做了一年多,在游戏的上层几乎重新把AT做的事情做了一遍,用一种最糟糕的方式——拿状态机来做状态,谁说角色的状态就一定要状态机做的?那都是上世纪90年代和本世纪最早4、5年的游戏教材才会这么写好伐?状态机做状态我所见过的没有正面的例子,全都是血淋淋的教训。

果不其然,看到了一张似曾相识的长千列,宽千行的大表,技能1,一行一列,技能1受击,一行一列。Oh yeah,嗅到了作死的节奏,维护这样的东西?设计师自信满满的表示几万行的数据都处理了,这个问题不大……

行,问题是不大,问题是人家一个月出十个,你十个月出一个,我知道你能出来,等你出来的时候,永远的毁灭公爵都出3代了……

于是就动了个手术,把状态机和与之相关的Animation彻底废弃重来。

要解释清楚AT,先要解释一下状态机这个坑爹玩意儿。

之前的文章里这里就留了个尾巴,为什么状态不适合用状态机来做?先要从状态这个概念说起。

从逻辑意义上说,状态的组成关系一般不会特别复杂,但组成成分上却并不单纯,很可能不能用一个体系去说明,举个例子:角色技能与否,跟移动有关系吗?现今的大部分游戏,这个答案都是否定的。是否处于技能过程中,并不影响是否同时处于移动流程中,亦不影响死否处于下落过程中,亦不影响角色是否受击,亦不影响角色中毒与否、减速与否。你会说,中毒减速那是Debuff,但你能说清楚中毒减速是Debuff,为何技能不能算作同样的东西吗?当一个技能指令过来后,我需要判断的是什么呢?是否正处于受击,是否正被沉默,是否正被眩晕……也就是说,对于逻辑而言,你需要的只是一堆堆的标记,状态机?受击同时被沉默状态,受击同时正在技能状态,技能同时正在减速状态,技能带位移状态,位移带技能状态。就算把Buff那几个能去掉,最后这俩带Stance的,也是完蛋。

更有甚者,竟然还敢把AI状态也给整进来,再来几个寻路移动状态,攻击目标移动状态,回位移动状态……真实的故事。问题是寻个路、寻个的、接近个的、逃个跑什么的,这到底是跟移动互斥啊还是跟技能互斥啊?以人类的思路理解不能啊。

AI自己形成个状态机不就好了,本身AI就是Controller层面的概念,角色是Actor层面的概念,Controller control Actor,分成两套状态机再正常不过了,合到一起除了给自己添麻烦外有任何哪怕一点的好处吗?

单纯从逻辑上,真正可能到最后有跟状态机有很大关联的,一般只有Stance这种偏表现的逻辑状态:是否正在爬梯子跟是否在走路铁定是没有关系的,是否正在举起箱子跟是否正在走路也铁定没有关系。

从这一点引开来,你会发现真正适用于状态机的,可能只有动画部分了。没错,这个直觉是对的。

这是有道理的,状态机的特点是什么?无论有多少状态,同时可且尽可能处于一个状态。也就是说,从属于状态机的各状态之间,有很明确的互斥关系。技能和移动互斥吗?看游戏设计,有些可以很明确,有些不会很明确。格斗游戏表示技能和移动互斥,旋风斩表示我可以一边技能一边移动。逻辑上可以互斥,就做状态机,不可以,就不要做。有些游戏要做技能过程中仍然有一定的受击导致的IK效果,那这种情况下,逻辑就不互斥,技能和受击就必须作为独立的两个Trigger。

但是动画是基本很明显的,互斥性很强。上下半身融合,头部融合,受击融合,无论怎么融合,每个具体单元都是赤裸裸地互斥性。下半身在跑步的同时就不可能同时做出游泳的动作,非常好理解。

但是,你的逻辑状态很简单啊。即便逻辑上,技能、移动、受击是三个状态,那又怎么样呢?移动中还有中毒移动、减速移动、晕乎乎的移动,受击中还有中毒受击,Debuff特殊受击,这些难道要算逻辑状态吗?正常人都不会这样做的,中毒、减速、眩晕一定是Debuff,本来就是,这三个从逻辑意义上,根本就无法跟移动、技能互斥。怎么可能做成状态机呢?

但是,动画上,确实有着带毒移动,带减速移动这样的需求啊,逻辑上,不能做成状态机,但是动作上,却又需要状态机这样的机制,这样的矛盾怎么破?

灵活而复杂的逻辑结构和相对简单的动画结构的矛盾,这个矛盾客观存在,这就是AT诞生的理由。

事关Animation Tree的工作随笔(一)的更多相关文章

  1. 事关Animation Tree的工作随笔(二)

    上回说到,游戏项目中客观会遇到逻辑状态的复杂性和动画状态的单一性之间的矛盾,那么Animation Tree是如何解决这个问题的呢? 这又需要引入一个定律:就是逻辑状态无论有多么复杂,但一套逻辑状态组 ...

  2. 一个HTML5培训班毕业生的找工作随笔

    昨天刚参加完一个面试,通过了.写个随笔记录一下. 先介绍一下背景. 我是今年十月份的时候从某个培训机构的HTML5 Web前端培训班毕业的,是一个刚进入IT行业的新人. 本人毕业于某三流学校,在参加培 ...

  3. 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

    接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...

  4. 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

    web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...

  5. 工作随笔——xshell4安装后应该做的一些事

    xshell4默认支持中文语言 选项→键盘和鼠标:设置快捷键,鼠标按键(可以提高工作效率) 1.选定文本自动复制到剪贴板 选择→将选定的文本自动复制到剪贴板(选上) 2.更高鼠标中间按钮和右键按钮的功 ...

  6. 工作随笔——selenium支持post请求,支持自定义header

    背景: 最近在写一个小程序,发现博主所在的地区访问该网站时有防ddos功能验证导致程序不能正常工作. 经过试验发现可以用国外代理ip解决这个问题,但是程序走代理访问延迟高且不稳定. 思路: selen ...

  7. 工作随笔——ember框架去除url上的#号

    因为工作原因,接触到了一套非常好的前端框架--ember. ember框架高度封装,学习曲线比较陡峭. ember对于url更新的配置在config/environment.js >> l ...

  8. 工作随笔—Java容器基础知识分享(持有对象)

    1. 概述 通常,程序总是运行时才知道的根据某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型,为解决这个普遍的编程问题:需要在任意时刻和任意位置创建任意数量的对象,所以,就 ...

  9. vue 工作随笔

    现在工作要做一个电商项目,将工3作的笔记记在这儿,以后方便结总 本套项目用的前端方案 是: vue vue-router Element -ui Axios Echarts 后端技术采用node.js ...

随机推荐

  1. JS nodeType返回类型

    JS nodeType返回类型 前几天朋友正好问道 这个 js的nodeType是个什么概念(做浏览器底层的)正好遇到这篇文章可以向大家解释下 将HTML DOM中几个容易常用的属性做下记录: nod ...

  2. android自己定义ViewPager之——3D效果应用

    今天在github里看到一个3D效果的ViewPager,感觉做出来的ViewPager滑动的时候效果十分的炫,就check out下来研究了一下怎样实现的.以及怎样使用.将整个ViewPager稍加 ...

  3. [服务器运维][Minecraft服务器搭建]

    参考资料: http://neekey.net/2016/02/01/%E5%A6%82%E4%BD%95%E7%94%A8%E9%98%BF%E9%87%8C%E4%BA%91ecs%E6%90%A ...

  4. uva 1596 Bug Hunt

    In this problem, we consider a simple programming language that has only declarations of one-dimensi ...

  5. jxl读和取Excel文件

    请参看下面链接: jxl如何读和取excle中的数据

  6. 当nginx 500 伪静态错误时,记录解决方法rewrite or internal redirection cycle while processing

    错误日志::rewrite or internal redirection cycle while processing "/index.php/index.php/index.php/in ...

  7. [Zookeeper研究]一 Zookeeper技术简介

    最近的项目中使用到了Zookeeper.Kafka以及Storm.仔细研究了一下,觉得这几个开源项目对于搞分布式的人来说是非常有用的,所以想把自己的一点心得体会总结一下,希望能对大家有所帮助. 首先从 ...

  8. 循环与range

    Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来,看例子: names = ['Michael', 'Bob', 'Tracy'] for name ...

  9. MongoDB监控一 mongostat

    mongostat命令                                                               mongostat可以提供mongod和mongos ...

  10. h5 如何打包apk

    1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开MyEclipse2014,新建一 ...