Unity3D基础42:AnyState⼤法
⼀、AnyState
哪怕是最简单的⾓⾊,⼀般来讲都可能需要6-7个动画以上,例如⼀些最基本的:跑步、后退、受击、跳跃、攻击、死亡等等,这个时候,状态机的规模就已经不能算⼩了,⽽更主要的是假设有n个状态,它们之间连线可能有n²个这么之多,不但难以维护,每次光看就头⽪发⿇,状态机变成了蜘蛛⽹
为了解决这种问题,往往有3种简单解决⽅法:
①减少⼀些连线:例如从跳跃到跑步,它们之间可以没有连线,也就是从跳跃状态到跑步状态,中间必须要经过站⽴状态等等,优点的话当然就是线的数量变少了,但是缺点也很明显:代码实现变复杂、优化效果不明显需要死扣细节、容易出现BUG、动画过渡之间不够⾃然等等等等……
②分层管理,也就是新建⼦状态,这个不想多说,看似管理的挺好,但是结构仍然复杂,会有种⾃⼰骗⾃⼰的感觉,当然也没什么⼈⽤就是了,往往⽤了也不是最终⽬的
③AnyState⼤法:也就是本篇⽂章所讲的⽅法,⼀句话说就是⼀个AnyState向所有状态连线,⼀个例⼦如下:
AnyState的⽤法前⾯其实已经讲过了,就是所有状态的代表,如果AnyState向状态B连线,条件为A,那么同等于所有状态都向B连了⼀条条件为A的线
说⽩了,AnyState⼤法就相当于是动画池,不管你当前的状态,我要你现在⼲什么,你就⽴刻去⼲什么
PS:其实在正常的⼤型游戏项⽬⾥,也就是⼀个⾓⾊甚⾄有50多种动画的情况,往往以上三种⽅法都仍然不适⽤,这个时候是另有更复杂解决⽅案的,当然这⾥就不提了。。
⼆、状态设置与冲突
问题①:假设状态A向状态B和状态C各有⼀条连线,当两个连线条件同时满⾜时,会执⾏哪⼀个呢?
解决⽅法:选择状态A,调整条件列表中的顺序即可,在前⾯的会先被判定
问题②:选⽤了AnyState之后,我怎么调整任意两个状态之间的动画过渡?
其实很简单,只不过这个问题还真的会有不少⼈问
问题③:因为AnyState也包含了⾃⼰,所以当满⾜某个状态条件时,动画会不停的⾃⼰切换到⾃⼰,从⽽出现⿁畜的情况
这也是实现AnyState⼤法的⼀个常规做法:
1. 定义⼀个枚举类代表当前⾓⾊的状态(这⾥可以参考前⽂的代码)
2. 所有条件全部设置为触发器触发
3. 如果必要的话可以编写⼀个状态转移矩阵,也就是⼀个⼆维数组,p[x][y] = true/false表⽰当前是x状态,是否可以转移到y状态,如
果可以则SetTrigger,当然p[x][x] = false
4. 搞定,然后就是⾃⼰的代码功底了(⾮常建议使⽤状态设计模式),动画过渡也别忘了调整好
问题④:运⾏测试的时候,状态机窗⼝看不到效果
unity3d入门
点下状态机所属的