事关Animation Tree的工作随笔(一)
最近的业务上,又回到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的工作随笔(一)的更多相关文章
- 事关Animation Tree的工作随笔(二)
上回说到,游戏项目中客观会遇到逻辑状态的复杂性和动画状态的单一性之间的矛盾,那么Animation Tree是如何解决这个问题的呢? 这又需要引入一个定律:就是逻辑状态无论有多么复杂,但一套逻辑状态组 ...
- 一个HTML5培训班毕业生的找工作随笔
昨天刚参加完一个面试,通过了.写个随笔记录一下. 先介绍一下背景. 我是今年十月份的时候从某个培训机构的HTML5 Web前端培训班毕业的,是一个刚进入IT行业的新人. 本人毕业于某三流学校,在参加培 ...
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...
- 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层
web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...
- 工作随笔——xshell4安装后应该做的一些事
xshell4默认支持中文语言 选项→键盘和鼠标:设置快捷键,鼠标按键(可以提高工作效率) 1.选定文本自动复制到剪贴板 选择→将选定的文本自动复制到剪贴板(选上) 2.更高鼠标中间按钮和右键按钮的功 ...
- 工作随笔——selenium支持post请求,支持自定义header
背景: 最近在写一个小程序,发现博主所在的地区访问该网站时有防ddos功能验证导致程序不能正常工作. 经过试验发现可以用国外代理ip解决这个问题,但是程序走代理访问延迟高且不稳定. 思路: selen ...
- 工作随笔——ember框架去除url上的#号
因为工作原因,接触到了一套非常好的前端框架--ember. ember框架高度封装,学习曲线比较陡峭. ember对于url更新的配置在config/environment.js >> l ...
- 工作随笔—Java容器基础知识分享(持有对象)
1. 概述 通常,程序总是运行时才知道的根据某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型,为解决这个普遍的编程问题:需要在任意时刻和任意位置创建任意数量的对象,所以,就 ...
- vue 工作随笔
现在工作要做一个电商项目,将工3作的笔记记在这儿,以后方便结总 本套项目用的前端方案 是: vue vue-router Element -ui Axios Echarts 后端技术采用node.js ...
随机推荐
- js调用swift相册DEMO(网易新闻)
关键代码 window.location.href = 'tg:///openCamera' css body{ } img{ width:100%; } #mainTitle{ text-align ...
- linux 下执行.sh文件总是提示permission denied
linux 下执行.sh文件总是提示permission denied 如果你是root登陆的话(不是的话,切换到root用户,对*.sh赋可执行的权限) chmod 777 *.sh or ch ...
- 关于Emit中动态类型TypeBuilder创建类标记的一点思考
利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记. ...
- log4j参数说明
log4j.properties 使用 一.参数意义说明 输出级别的种类 ERROR.WARN.INFO.DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session ...
- 2015.4.2-SQL 简单语句(一)
1.创建一个student表 create table student_masen( sno char(4) not null primarykey sname nchar(10) not null ...
- php的一些小笔记--数学函数
通常我们使用的数学函数不多,经常出现的有 floor 地板->舍去 ceil 天花板->进一 round 四舍五入 rand 随机数 mt_rand 产生更好的随机数 pow 指数表达 ...
- 用IO流拷贝歌曲
package lianxi; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOEx ...
- C#基础之------控制台进程
/********************************************************************************* File:C#实现100以内两个数 ...
- 七、适配器(Adapter)模式--结构模式(Structural Pattern)
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 类的 Adapter模式的结构: 类适配器类图: 由图中可以看出,Adaptee ...
- 三星S5360(GALAXY Y)首次刷机尝试~
刷机包下载: http://www.romjd.com/Device/samsung-s5360 http://www.shuaji.com/rom/2033.htm#down http://www. ...