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

时间:2017-08-29 23:30:21

标签: c# unity3d unity5

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

我有一个角色的预制件,附有Animator组件。层次结构中的角色具有Animator,其中包含一些状态和混合,还有一些动画片段。

现在当我播放/运行Animator状态时,这意味着我正在播放动画?或者动画片段是别的什么?

为什么我不能播放动画片段?我没有得到错误或例外,只是没有播放它。

这是附加到此角色的脚本,我还在此角色中添加了一个动画组件。所以现在角色对象同时具有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()
    {

    }
}

在变量内部有9个状态:

Aiming
Death_A
Use
Grounded
Roll
PickupObject
Reload_Rifle
Shoot_Rifle
Empty

当我点击A键时,每次点击A Everything正常工作时,它会逐个播放状态我可以点击A来播放9个状态。

当我在层次结构中选择字符并且在菜单中时,我不理解状态是在编辑器中:窗口&gt; Animator我看到LegsLayer上的9个州:

9 States

但是如果我点击状态接地双击我看到一个混合树,我不确定这是否也是状态或者这可能是动画片段?然后我怎样才能访问它们?

Blend Tree

好的,这是关于动画师我不了解的一部分,以及我可以用它做什么以及如何玩。

第二部分与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时,我在动画组件内的Inspector中看到所有动画片段,在动画中我看到要播放的动画片段。

我没有收到任何错误或异常,但它只是没有播放它。角色仍然闲着。即使我选择另一个动画片段索引来播放5或3或1也没有播放。

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

Animations in inspector

1 个答案:

答案 0 :(得分:1)

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

基本上,系统以这种方式工作:

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

  • Animation Clips是包含实际动画的资源,它们从未被指定为游戏对象的组件,但是它们必须由Animator引用才能播放,正如我所说的之前。

  • 混合树用于通过使用线性插值以无缝方式混合不同的动画。它们是Animator的“特殊”状态,它具有多个动画片段,您可以插值以显示从状态到另一个状态的转换,例如,当您需要在向前运行,向左运行和向右运行时更改动画。 / p>

这个论点非常广泛,您可以通过阅读有关动画师,动画剪辑和混合树的官方文档来开始讨论它:

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

相关问题