Unity3D基础42:AnyState大法

 

前文:https://blog.csdn.net/Jaihk662/article/details/88384315(状态机实现人物站立、跑步与后退动画切换)

一、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. 搞定,然后就是自己的代码功底了(非常建议使用状态设计模式),动画过渡也别忘了调整好

问题④:运行测试的时候,状态机窗口看不到效果

点下状态机所属的GameObject......

 

  • 25
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值