玩 Animator State and/or 玩 AnimationClip 有什么区别?为什么我不能播放动画片段?

What is the difference between playing Animator State and/or playing AnimationClip ? And why i can't play animation clips?

状态和动画不是我自己的。

我有一个角色的预制件,上面附加了 Animator 组件。 Hierarchy 中的角色有带有一些状态和混合的 Animator,还有一些动画片段。

现在当我 play/run 动画师的状态时,这意味着我正在播放动画吗?或者动画片段是别的东西?

为什么我不能播放动画片段?我没有收到错误或异常,只是没有播放。

这是附加到这个角色的脚本,我还为这个角色添加了一个动画组件。所以现在角色对象同时具有 Animator 和 Animation 组件。

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

public class SwitchAnimations : MonoBehaviour
{
    private Animator animator;
    private int index = 0;
    private static UnityEditor.Animations.AnimatorController controller;
    private UnityEditor.Animations.AnimatorState[] an;

    // Use this for initialization
    void Start()
    {
        animator = GetComponent<Animator>();
        an = GetStateNames(animator);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            animator.Play(an[index].name);
            if (++index == an.Length)
                index = 0;
        }
    }

    private static UnityEditor.Animations.AnimatorState[] GetStateNames(Animator animator)
    {
        controller = animator ? animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController : null;
        return controller == null ? null : controller.layers.SelectMany(l => l.stateMachine.states).Select(s => s.state).ToArray();
    }

    private void RollSound()
    {

    }

    private void CantRotate()
    {

    }

    private void EndRoll()
    {

    }

    private void EndPickup()
    {

    }
}

变量an内部有9个状态:

Aiming
Death_A
Use
Grounded
Roll
PickupObject
Reload_Rifle
Shoot_Rifle
Empty

当我点击 A 键时,每次我点击 A 时,它都会一个一个地播放状态。一切正常,我可以通过点击 A 来播放 9 种状态。

当我在层次结构中选择角色并在菜单 make 中时,我对状态不了解的是在编辑器中:Window > Animator 我在 LegsLayer 上看到 9 个状态:

但是如果我点击状态 Grounded 双击我看到一个混合树,我不确定这是否也是状态或者这可能是动画剪辑?那我怎样才能访问它们?

好的,这是我对 Animator 以及我可以使用它做什么以及如何使用它还不了解的部分。

第二部分与 AnimationClip/s 有关,为什么我不能播放它们?

动画剪辑脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;

public class SwitchAnimations : MonoBehaviour
{
    private Animation animation; 
    private AnimationClip[] animationClips; 

    // Use this for initialization
    void Start()
    {
        animation = GetComponent<Animation>();
        animationClips = AnimationUtility.GetAnimationClips(gameObject);

        foreach (AnimationClip clip in animationClips)
        {
            animation.AddClip(clip, clip.name);
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            animation.clip = animationClips[6];
            animation.Play(animationClips[6].name);
        }
    }

    private void RollSound()
    {

    }

    private void CantRotate()
    {

    }

    private void EndRoll()
    {

    }

    private void EndPickup()
    {

    }

    private void FootStep()
    {

    }
}

在变量 animationClips 中我有 9 个动画:

Rifle_Aiming_Idle
Rifle_Aiming_Walk_F_RM
Rifle_Aiming_Walk_B_RM
Rifle_Aiming_Walk_L_RM
Rifle_Aiming_Walk_R_RM
Rifle_Idle
Rifle_Walk_F_RM
Rifle_Run_F_RM
Rifle_Sprint_F_RM

当我在 运行 游戏中并单击 A 这次我在动画组件内的检查器中看到所有动画剪辑,在动画中我看到要播放的动画剪辑。

我没有收到任何错误或异常,只是没有播放。角色保持静止。即使我选择另一个动画剪辑索引播放 5 或 3 或 1 也没有播放。

我想知道为什么当我点击 A 时它没有播放动画。在这种情况下,列表中的第 6 个动画仍然没有播放。

Animation 组件是遗留组件,保留在 Unity 中以确保与旧项目的向后兼容性,因此您永远不应将其用于动画。

基本上,系统是这样工作的:

  • 首先,您需要 Animator Controller 资产。这个 Animator 是一个有限状态机(带有子状态等),每个状态都可以有一个 Animation Clip(您可以通过 Motion 字段中的 via Inspector 脚本分配它)。当 FSM 进入特定状态时,它将播放分配的 Animation Clip。 显然 Animator,为了被游戏对象使用,必须通过 Animator 组件分配给该对象。

  • Animation Clips 是包含实际动画的资产,它们永远不会作为组件分配给游戏对象,而是必须由 Animator 引用才能播放,正如我之前所说。

  • 混合树用于通过使用线性插值以无缝方式混合不同的动画。它们是 Animator 的 "special" 状态,它有多个动画剪辑,您可以插入这些动画剪辑以显示从一种状态到另一种状态的过渡,例如,当您需要向前 运行 更改动画时,运行左,运行右。

这个论点很宽泛,你可以从这里阅读关于 Animators、Animation Clips 和 Blend Trees 的官方文档开始了解它:

https://docs.unity3d.com/Manual/AnimationSection.html