[Unity] LQ转载--Unity3D基础42:AnyState大法

查看:524 |回复:3 | 2021-6-12 22:21:51

您需要 登录 才可以下载或查看,没有账号?注册

x
一、AnyState
哪怕是最简单的角色,一般来讲都可能需要6-7个动画以上,例如一些最基本的:跑步、后退、受击、跳跃、攻击、死亡等等,这个时候,状态机的规模就已经不能算小了,而更主要的是假设有n个状态,它们之间连线可能有n2个这么之多,不但难以维护,每次光看就头皮发麻,状态机变成了蜘蛛网

为了解决这种问题,往往有3种简单解决方法:
减少一些连线:例如从跳跃到跑步,它们之间可以没有连线,也就是从跳跃状态到跑步状态,中间必须要经过站立状态等等,优点的话当然就是线的数量变少了,但是缺点也很明显:代码实现变复杂、优化效果不明显需要死扣细节、容易出现BUG、动画过渡之间不够自然等等等等……
分层管理,也就是新建子状态,这个不想多说,看似管理的挺好,但是结构仍然复杂,会有种自己骗自己的感觉,当然也没什么人用就是了,往往用了也不是最终目的
AnyState大法:也就是本篇文章所讲的方法,一句话说就是一个AnyState向所有状态连线,一个例子如下:

20190310233009908.png


AnyState的用法前面其实已经讲过了,就是所有状态的代表,如果AnyState向状态B连线,条件为A,那么同等于所有状态都向B连了一条条件为A的线
说白了,AnyState大法就相当于是动画池,不管你当前的状态,我要你现在干什么,你就立刻去干什么

PS:其实在正常的大型游戏项目里,也就是一个角色甚至有50多种动画的情况,往往以上三种方法都仍然不适用,这个时候是另有更复杂解决方案的,当然这里就不提了。。


二、状态设置与冲突

问题①:假设状态A向状态B和状态C各有一条连线,当两个连线条件同时满足时,会执行哪一个呢?

解决方法:选择状态A,调整条件列表中的顺序即可,在前面的会先被判定


2019031023373532.png


问题②:选用了AnyState之后,我怎么调整任意两个状态之间的动画过渡?

其实很简单,只不过这个问题还真的会有不少人问



问题③:因为AnyState也包含了自己,所以当满足某个状态条件时,动画会不停的自己切换到自己,从而出现鬼畜的情况

这也是实现AnyState大法的一个常规做法:

1)定义一个枚举类代表当前角色的状态(这里可以参考前文的代码)

2)所有条件全部设置为触发器触发

3)如果必要的话可以编写一个状态转移矩阵,也就是一个二维数组,p[x][y] = true/false表示当前是x状态,是否可以转移到y状态,如果可以则SetTrigger,当然p[x][x] = false

4)搞定,然后就是自己的代码功底了(非常建议使用状态设计模式),动画过渡也别忘了调整好


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


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

————————————————
版权声明:本文为CSDN博主「Jaihk662」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jaihk662/article/details/88386042



2021-6-12 22:21:51  
 赞 赞 0

使用道具 登录

3个回答,把该问题分享到群,邀请大神一起回答。
2#
感谢分享
回复 收起回复
2021-6-13 16:31:52   回复
 赞 赞 0

使用道具 登录

3#
感谢分享
回复 收起回复
2021-6-13 16:31:54   回复
 赞 赞 0

使用道具 登录

4#
谢谢楼主共享!!
回复 收起回复
2021-6-14 16:19:30   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

手机游戏引擎手游引擎Unity3D技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表