Skip to content

Blend Tree

unity-blend-tree-deep-dive

一句话理解

Blend Tree 是 Animator 里的“混合动画状态”。

它不是从一个状态切到另一个状态,而是在同一个状态内部,把多个相似动画按比例混合。

比如:

Idle + Walk + Run

根据 Speed 自动混合:

Speed = 0    播 Idle
Speed = 2    主要播 Walk
Speed = 6    主要播 Run
Speed = 3    Walk 和 Run 混合

它和 Transition 的区别

Transition 用来切换不同状态:

c
Idle -> Jump
Run -> Attack
Attack -> Idle

Blend Tree 用来混合同类动作:

c
Idle / Walk / Run
Up / Down / Left / Right
WalkForward / WalkLeft / WalkRight

官方文档也强调:Blend Tree 适合混合多个性质和时机相近的动画,Transition 适合状态之间切换。

1D Blend Tree

1D 表示用一个参数控制。

最常见参数:

Speed

配置例子:

Idle.anim   Threshold = 0
Walk.anim   Threshold = 2
Run.anim    Threshold = 6

代码:

c
using UnityEngine;

public class PlayerAnimator : MonoBehaviour
{
    private Animator animator;
    private Rigidbody2D rb;

    private void Awake()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        float speed = Mathf.Abs(rb.linearVelocity.x);
        animator.SetFloat("Speed", speed);
    }
}

适合:

c
待机 -> 走路 -> 跑步
慢速飞行 -> 快速飞行
轻微受伤 -> 严重受伤

2D Blend Tree

2D 表示用两个参数控制。

最常见参数:

c
MoveX
MoveY

用于 2D 八方向移动:

c
Idle      0, 0
MoveUp    0, 1
MoveDown  0, -1
MoveLeft -1, 0
MoveRight 1, 0

代码:

c
using UnityEngine;

public class TopDownAnimator : MonoBehaviour
{
    private Animator animator;

    private void Awake()
    {
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        animator.SetFloat("MoveX", x);
        animator.SetFloat("MoveY", y);
    }
}

适合:

c
俯视角八方向移动
3D 角色前后左右移动
瞄准方向动画
飞行方向动画

怎么创建 Blend Tree

在 Animator 里:

c
右键空白处
Create State > From New Blend Tree

然后:

c
双击 Blend Tree
Inspector 里选择 Blend Type
1D:选择 Speed
2D:选择 MoveX / MoveY
点击 + 添加 Motion
把 Idle、Walk、Run 等 Clip 拖进去
设置 Threshold 或 Position

新手重点规则

Blend Tree 里混合的动画要“相似”。

适合混:

c
Idle / Walk / Run
/// 右移动
轻攻击 / 中攻击 / 重攻击,前提是时机相近

不适合混:

c
Idle + Attack
Run + Death
Jump + OpenDoor

这些动作性质差太多,应该用 Transition

常见坑

c
Blend Tree 参数没有在代码里更新
Speed 默认一直是 0,所以永远待机
2D 移动忘记加 Idle 的 0,0
Walk 和 Run 脚步时间对不上,导致滑脚
Threshold 填乱,动画混合区间怪
把攻击动画放进移动 Blend Tree

记住这句:

c
Transition 管状态切换,Blend Tree 管同类动作混合。
1D 用一个参数,2D 用两个参数。
代码只负责喂参数,Blend Tree 自动混动画。

参考:Unity 官方 Animation Blend Trees1D Blending2D Blending

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0