【发布时间】:2014-08-26 19:07:08
【问题描述】:
我有一个在 Unity 项目中使用的简单精灵表:
它有四个方向的行走和站立框架。我使用 Unity 的 Sprite 编辑器剪切了图像,并为每个系列制作了一个单独的 Animation 对象,所有这些都整齐地适合单个动画控制器:
我已将动画控制器添加到场景中GameObject 上的Animator 组件。这就是我开始遇到麻烦的地方。 我这辈子都不知道如何在代码中的动画之间进行切换。
【问题讨论】:
我有一个在 Unity 项目中使用的简单精灵表:
它有四个方向的行走和站立框架。我使用 Unity 的 Sprite 编辑器剪切了图像,并为每个系列制作了一个单独的 Animation 对象,所有这些都整齐地适合单个动画控制器:
我已将动画控制器添加到场景中GameObject 上的Animator 组件。这就是我开始遇到麻烦的地方。 我这辈子都不知道如何在代码中的动画之间进行切换。
【问题讨论】:
您不应该在脚本中创建动画之间的连接。您所做的是在 Animator 中创建连接并设置变量,以确定您是站立还是行走以及您要朝哪个方向前进。然后,您只需在脚本中编辑这些变量,Animator 就会负责选择正确的动画。
这个视频展示了它的实际效果:Example
(你可以看到连接,左下角是他设置的变量)
“机械2d教程”的快速google给你:Tutorial
编辑:
评论太长了:)
基本上我要做的是创建 2 个变量,一个名为“Standing”的 bool 和一个名为“Direction”的 Integer。然后,您从 AnyState 连接到您拥有的所有其他状态(右键单击 AnyState 进行转换)。也许在 AnyState 周围将它们排成一圈。
在此之后,单击连接并在检查器中通过选择“站立”来设置条件,然后再添加一个并将其设置为“方向”“等于”和方向的数字。
然后在你的脚本中你的更新函数的某个地方你可能有类似的东西:
private readonly int UP = 0;
...
if(speed.magnitude > 0.0f)
Animator.SetBool("Standing", false);
else
Animator.SetBool("Standing", true);
if( Condition for walking up? )
Animator.SetInteger("Direction", UP);
if( Condition for walking down? )
Animator.SetInteger("Direction", DOWN);
...
这可能不能直接工作,但你明白了。根据您的设置方式,您可能需要使用方向开关。
【讨论】:
Animator 处理当我的要求有点过分时播放。现在我正在使用Animator.CrossFade(),这实际上是在动态创建新连接吗?我希望完全避免这样做,因为实际上,我的动画彼此之间没有任何复杂的关系。它们只是处于状态 A 或 B 或其他状态;我希望有一个地方来存储它们,并在它们之间快速交换。
为什么还要使用代码?只需使用参数将其全部连接到 Animator 中,然后根据需要更改参数即可。
【讨论】:
Animator.CrossFade 函数会达到预期的效果:
C#:
Animator animator = this.GetComponent<Animator>();
animator.CrossFade("WizzyWalkDown", 0);
这可能看起来有点过分或违反直觉,但请记住,AnimationController 类的构建是为了让动画之间的转换变得容易。不过,它仍然可以用于像这样更简单的动画类型!
【讨论】: