最近的业务上,又回到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. redis安装配置和使用;tomcat安装和使用

    virtualbox主要有以下几种方式(不同版本号称法不一样,但实质是一样的): 1.Intelnal Network:利用主机上的全部的虚拟机构建一个虚拟网络 2.NAT:能訪问互联网,不能訪问主机 ...

  2. 无法登陆mysql服务器

    解决 .#2002 无法登录 MySQL 服务器 将config.sample.inc.php复制成config.inc.php 出现这个错误,表示没有连接到数据库.修改config.inc.php文 ...

  3. Linux UGO和ACL权限管理

    自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序.文件.进程)的拥有者可以任意修改或者授予此对象相应的权限.Linux的UGO(User, Grou ...

  4. 部分GDAL工具功能简介

    主要转自http://blog.csdn.net/liminlu0314?viewmode=contents 部分GDAL工具功能简介 gdalinfo.exe 显示GDAL支持的各种栅格文件的信息. ...

  5. solr热身

    入博客园快满一年,居然没写一篇博客,好惭愧. 公司的搜索系统需要从Lucene.net(更新相当不给力)换成solr了,最近一直在学习solr,相关资料是相当的少啊,特别是还要在.net环境下开发.准 ...

  6. Git应用于Android项目的入门知识:我的理解

    Git应用于Android项目的基本知识.     常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要.     repo是Go ...

  7. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  8. asp.net js 获取服务器控件值

    最近在弄js 但是设计到获取服务器控件的值,有点模糊.百度查了资料都达不到效果.现在看看这个,希望朋友们能用上!! <asp:Label ID="lbDepartName" ...

  9. Android中对手机文件进行读写

    参考张泽华视频 (一)读写手机内存卡中的文件 对手机中的文件进行读写操作,或者新增一个文件时,可直接使用openFileOutput  /  openFileInput 得到文件的输出.输入流. Fi ...

  10. PHP PSR-3 日志接口规范 (中文版)

    日志接口规范 本文制定了日志类库的通用接口规范. 本规范的主要目的,是为了让日志类库以简单通用的方式,通过接收一个 Psr\Log\LoggerInterface 对象,来记录日志信息. 框架以及CM ...