unity简单实现行为树控动画

匿名 (未验证) 提交于 2019-12-02 23:03:14

本篇博客将简单介绍用状态机制作行为树动画,我将用这个行为树去简单的控制人物移动,待机和后退,和左右转头。尽量用最少的代码,实现最丰富的功能。
行为树:又称为混合树,一个流行的AI动画技术,涵盖了层次状态机,事件调度,事件计划,行为等一系列技术。在高度模块化状态,去掉状态中的跳转逻辑,使状态变成一个行为,称之为行为树。
在博客中我会用实例去展现行为树的魅力和优势所在,好戏开始:
首先看一下最终效果:
行为树动画

普通Animator动画

通过上面两种动画的对比,我们可以看出其中的差距,行为树的动画看起来更加自然流畅一下,让人感觉不到切换的突兀感,觉得整个动画就像一个人物在做某些行为,而普通动画在切换的时候可以看到,非常突兀,当然也可以进行细节处理,但综合起来要比行为树麻烦太多。
这时有读者可能就会问,图一控制了前,后,左,右,左转头,右转头,并且转头和移动结合了起来,代码会不会很复杂? 不会,放心,当然不会!全程只有 四句 代码。 图一和图二同样都只用了 四句 代码,没错!就是 四句 代码,就轻而易举的控制了这么复杂的动画的切换,和移动。而普通Animator动画和行为树动画比起来却差了这么多,没有转头的动画,也没有移动转头的结合,更没有流畅自然的动画,所以,这就是行为树的优势所在。
呦,还不信?
回首~
掏~出来让你们看看
真的只有四句代码

下面贴出移动和控制动画神奇的源码:

    /// <summary>     /// 状态机     /// </summary>     private Animator animator;     //转换速度标签     private int SpeedID = Animator.StringToHash("Speed");     //把字符串转换为哈希ID     private int VerticalID = Animator.StringToHash("Vertical");     private int HorizontalID = Animator.StringToHash("Horizontal");     void Start () {         //获取状态机         animator = GetComponent<Animator>(); 	} 	 	void Update () {          //计算速度 播放动画         animator.SetFloat(VerticalID, Input.GetAxis("Vertical"));         animator.SetFloat(SpeedID, Input.GetAxis("Horizontal"));          //在动画树里  X代表Z轴  Y轴代表X轴          transform.localPosition += transform.forward * Time.deltaTime *Input.GetAxis("Vertical") * 3;         transform.Rotate(transform.up * Time.deltaTime * Input.GetAxis("Horizontal") * 90); 

核心代码只有Update里四句,好了下面一起来制作一个简单的行为树动画吧!
1.首先我们需要创建行为树,和创建float类型的参数,Vertical 代表前后 Horizontal代表左右。

2.双击Blend Tree行为树进去,会显示如下界面:
这里我们需要添加些动画,我这里添加了5个

3.我们选择Compute Position―X Position From―Angular Speed(Deg)把旋转设置为根据度数,通过人物的朝向来融合旋转动画。(这个千万要记得设置,不然旋转度数可能会出问题)

参数介绍:
Blend Type:选择动画的类型,1D代表一个参数,可通过一个参数控制动画。
2d代表两个参数,通过两个参数控制更多的动画融合。
Paeameters:参数选择,1D能设置一个,2D能设置两个。
至于为Pos x要取1到负一,因为轴系参数的取值就是1到-1,最大1 最小-1,默认为0,所以这里1为奔跑,0为待机,-1为后退。
第二个参数用来控制旋转,当Y的旋转度数大于等于-1时,播放向左转头动画,为1时,右转头。

回顾一下步骤,
1.创建脚本,写好神奇的四句代码。
2.创建行为树,设置参数。
3.调试参数。
试着跑起来吧!

原创出品,转载请注明出处。

喜欢我关注我,我是壹叶成名。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!