1.创建动画混合树片段
混合树的级别和一个动画片段一样,只不过混合树里面包含了多个动作。
双击Blend Tree 进去混合树的编辑界面
这里面可以添加很多个动作,然后选定一个之前设置好的任意一个参数作为控制变量。
这个参数只能选用Float类型!我前面就定义了一个float类型的变量,叫run。因此它默认帮我选了run
2.使用动画混合树的原因:
当你有一套连续的动作,比如从走路、跑步、投射,他们可以用一个参数的变化来控制切换,并且实现非常自然的过渡。比如人物站立、小走、走路、快走和跑这几个动画,都有一个共同的变量-速度。那么我们可以用一个速度来控制不同的动画自动切换,虽然在状态机我们可以给多个片段设置触发参数来实现,但是,比如站立时速度=0,小走速度可以设置大于0小于2,正常走设置大于2小于5.。。。。。但是0 1 2这三个速度始终都是一个动作。
动画混合树的厉害之处就是,假如参数为0时,播放站立摆手打招呼
速度达到2播放走路动画
那么速度处于0-2之间的时候,他会把站立和走路的动画,混合到一起,就像两个图片半透明后融合在一起,类似图像混合模式,正片叠底、叠加等等!
Unity 混合树居然可以把两个动画混合到一起,参数为0-2 之间,就会一边站立摆手打招呼一遍走路动画。只不过两个动作各自取一般的速度
3.动画混合树参数的设置和理解
取消Automate Thresholds 美[ˈθrɛʃˌhoʊldz] 自动门槛设置
然后拖入对应的motion
设置每一个行为对应上面参数的门槛,也就是参数触发临界值
这里面依据的参数是run,这是我们在参数面板随便自定义的。所以说这个参数面板的参数是公用的。类似一个全局变量,过渡线可以使用,混合树也可以使用。代码控制方法也一样!
参数随便设置,但是跨度越大,动画过渡时间越长,越精细。剩下的就是我们在代码中实时控制run这个参数就可以了(例如 setFloat(“run”,0))
动画效果是跟随这个参数来变化,来融合的!
// 注意:以下示例代码是简化的,实际使用时需要根据项目需求进行调整和扩展。
using UnityEngine;
public class CharacterController : MonoBehaviour
{
private Animator animator;
private float speed;
void Start()
{
animator = GetComponent<Animator>();
}
void Update()
{
// 获取输入或其他方式的速度值
speed = Mathf.Clamp01(Input.GetAxis("Vertical"));
// 更新Animator的Speed参数
animator.SetFloat("Speed", speed);
// 触发过渡条件
if (speed > 0.5f)
{
animator.SetBool("IsRunning", true);
}
else
{
animator.SetBool("IsRunning", false);
}
}
}
```
动画融合是游戏开发中一个关键的技术,能够增强游戏角色的表现力和逼真感。在Unity中,动画混合树提供了一个强大而灵活的工具,通过合理使用Blend Trees和动画过渡,可以实现各种复杂的动画效果。通过深入了解这些技术,开发者能够在游戏中创造出更加生动、流畅的动画体验。
下面是个案例
控制一个参数让人物逐渐站立-走-跑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Blend : MonoBehaviour
{
//控制混合树实现连贯动作切换
// 程序逻辑 1.把组件拿到代码 2. 使用类调用setFloat()控制参数Blend即可 3.根据按键触发
public Animator GirlAnimator;
float Tempblend;
bool IsStop = false;
private void Start()
{
GirlAnimator.SetFloat("Blend", 0f);
Tempblend = 0;
}
void Update()
{
if (Input.GetKey(KeyCode.W)&& Tempblend<1)
{
Tempblend = Tempblend + 0.01f;
}
if (Input.GetKeyUp(KeyCode.W))
{
IsStop = true;
}
if (IsStop&&Tempblend>0)
{
Tempblend = Tempblend - 0.01f;
}
else
{
IsStop = false;
}
GirlAnimator.SetFloat("Blend", Tempblend);
}
}