玩 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 的官方文档开始了解它:
状态和动画不是我自己的。
我有一个角色的预制件,上面附加了 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 的官方文档开始了解它: