59.3D动画1D混合

59.3D动画-动画1D混合


59.1 知识点

什么是动画混合

游戏动画中常见的功能就是在两个或者多个相似运动之间进行混合,比如:

  • 根据角色的速度来混合行走和奔跑动画
  • 根据角色的转向来混合向左或向右倾斜的动作

你可以理解是高级版的动画过渡。

之前我们学习的动画过渡是处理两个不同类型动作之间切换的过渡效果,而动画混合是允许合并多个动画来使动画平滑混合。

如何在状态机窗口创建动画混合状态

在Animator Controller窗口右键->Create State->From New Blend Tree


双击混合树状态进入混合树界面。

有了混合树,我们就可以通过设置参数,通过一个动画状态控制多个动画效果的切换和过渡。

动画1D混合参数相关

Parameter 参数


用于控制混合的参数,在参数列表中的参数。

蓝色图像:可以在这里控制n个动画的阈值。

调整红色的指针,可以在下面的预览窗口查看动画混合的情况。
比如当前这个例子,调整蓝色图形中的红色指针代表调整了Speed参数的数值,0的话动画完全是默认,0.25是走路和默认结合,0.5的话完全是走路,0.75的话是走路和跑步结合各一半,1的话完全是跑步了。

Motion 关联的动画列表:可以用鼠标改变顺序。

Threshold 对应动作的临界阈值:

  • 当等于这个值时动作权重最大(完全播放该动作)。
  • 这个值可以完全自由控制,数值范围不定。
  • 要取消勾选Automate Thresholds 是否自动设置阈值才能手动设置。

控制动作的播放速度。

是否镜像动作。

Automate Thresholds 是否自动设置阈值:

  • 它会在取值范围内平均分。
  • 一般可以取消勾选我们手动控制更准确。

Compute Thresholds 计算阈值的方式:

  • 会从动画剪辑的根运动中获去数据。
  • Speed:速度。
  • Velocity X、Y、Z:xyz上的分速度。
  • Angular Speed(Rad 、Deg):角度或者弧度表示的角速度。
  • 举例:比如你的动画剪辑行走动画时Speed速度是1.5个单位每秒,慢跑是2.3个单位每秒,快跑是4个单位每秒,阈值就会根据这些值来进行设置进行混合。

Adjust Time Scale 调整时间刻度:

  • Homogeneous Speed:均匀速度。
  • Reset Time Scale:重置时间刻度。

1D混合的使用

1D混合就是通过一个参数来混合子运动。注意:往混合树里面加入动作时需要找到动画文件进行关联。


59.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson59_3D动画_动画1D混合 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 什么是动画混合
        //游戏动画中常见的功能就是在两个或者多个相似运动之间进行混合
        //比如
        //1.根据角色的速度来混合行走和奔跑动画
        //2.根据角色的转向来混合向左或向右倾斜的动作

        //你可以理解是高级版的动画过渡

        //之前我们学习的动画过渡是处理两个不同类型动作之间切换的过渡效果
        //而动画混合是允许合并多个动画来使动画平滑混合
        #endregion

        #region 知识点二 如何在状态机窗口创建动画混合状态
        //在Animator Controller窗口 右键->Create State->From New Blend Tree
        #endregion

        #region 知识点三 1D混合的使用
        //1D混合就是通过一个参数来混合子运动
        //注意:往混合树里面加入动作时需要找到动画文件进行关联
        #endregion
    }
}

59.3 练习题

在之前练习题的基础上,通过1D混合树制作前进后退的功能

创建animator文件并关联,添加一个默认混合树状态

编辑混合树,关联五个动画剪辑文件。其中向后轴和向后炮是重复的,只要改变播放速度-1就行。设置好阈值。

添加跳跃动作,添加跳跃动作参数并且添加混合树和跳跃动作的切换连线

添加控制人物的代码

// 存储机器人动画组件的变量
private Animator animator;

// 设置机器人前进后退的速度倍数
private float dValue = 0.5f;

// Start 函数在脚本挂载时执行一次,用于变量初始化
void Start()
{
    // 获取机器人上的 Animator(动画控制器)组件
    animator = this.GetComponent<Animator>();
}

// Update 函数在每帧都会执行,用于检测用户输入并响应
void Update()
{
    // 根据垂直方向的上下键,切换机器人的奔跑和后退动画
    animator.SetFloat("Speed", Input.GetAxis("Vertical") * dValue);

    // 按下左 Shift 键时,将机器人的前进后退速度倍数设置为1
    if (Input.GetKeyDown(KeyCode.LeftShift))
        dValue = 1;

    // 松开左 Shift 键时,将机器人的前进后退速度倍数恢复为0.5
    if (Input.GetKeyUp(KeyCode.LeftShift))
        dValue = 0.5f;

    // 按下空格键,控制机器人跳跃
    if (Input.GetKeyDown(KeyCode.Space))
        animator.SetTrigger("Jump");
}

59.4 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson59_练习题 : MonoBehaviour
{
    #region 练习题一
    //在之前练习题的基础上,通过1D混合树制作前进后退的功能

    // 存储机器人动画组件的变量
    private Animator animator;

    // 设置机器人前进后退的速度倍数
    private float dValue = 0.5f;


    // Start 函数在脚本挂载时执行一次,用于变量初始化
    void Start()
    {
        // 获取机器人上的 Animator(动画控制器)组件
        animator = this.GetComponent<Animator>();
    }

    // Update 函数在每帧都会执行,用于检测用户输入并响应
    void Update()
    {
        // 根据垂直方向的上下键,切换机器人的奔跑和后退动画
        animator.SetFloat("Speed", Input.GetAxis("Vertical") * dValue);

        // 按下左 Shift 键时,将机器人的前进后退速度倍数设置为1
        if (Input.GetKeyDown(KeyCode.LeftShift))
            dValue = 1;

        // 松开左 Shift 键时,将机器人的前进后退速度倍数恢复为0.5
        if (Input.GetKeyUp(KeyCode.LeftShift))
            dValue = 0.5f;

        // 按下空格键,控制机器人跳跃
        if (Input.GetKeyDown(KeyCode.Space))
            animator.SetTrigger("Jump");
    }
    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏