【问题标题】:Basic, Frame by Frame Sprite animation using Animator class使用 Animator 类的基本、逐帧 Sprite 动画
【发布时间】:2014-08-26 19:07:08
【问题描述】:

我有一个在 Unity 项目中使用的简单精灵表:

它有四个方向的行走和站立框架。我使用 Unity 的 Sprite 编辑器剪切了图像,并为每个系列制作了一个单独的 Animation 对象,所有这些都整齐地适合单个动画控制器:

我已将动画控制器添加到场景中GameObject 上的Animator 组件。这就是我开始遇到麻烦的地方。 我这辈子都不知道如何在代码中的动画之间进行切换

【问题讨论】:

    标签: animation unity3d sprite


    【解决方案1】:

    您不应该在脚本中创建动画之间的连接。您所做的是在 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 或其他状态;我希望有一个地方来存储它们,并在它们之间快速交换。
    • 我不认为 CrossFade 实际上会创建连接,但通过使用它你有点手动 :) 我猜它是否适合你使用它。我认为这对你来说只是感觉过度,因为你以前没有做过。实际上根据您的需要进行设置只需单击几下,然后在脚本中使用 2 行代码来更改变量,例如 Animator.SetBool("Walking", true);
    • 我一定会试一试的。谢谢!
    【解决方案2】:

    为什么还要使用代码?只需使用参数将其全部连接到 Animator 中,然后根据需要更改参数即可。

    【讨论】:

    • 这是我为自己提出的问题之一,只是通过弄清楚如何措辞(因此是 wiki 答案)。你能扩展一下这个答案吗?
    • 最好查看教程了解详细信息,但基本上:Animator 屏幕有许多状态,每个状态都有与之关联的动画;例如,WalkRight 将是您向右行走的动画。然后在 Animator 中,您可以在这些状态之间创建转换,这将基于您也在 Animator 中设置的某些条件。这些条件是简单的 int/bool/任何可以从代码中更改的参数;更改参数,Animator 将从一种状态转换到另一种状态。
    • 嗯,我明白了。我现在有更多信息可以出去寻找教程;我想对我来说最大的问题是搜索错误的术语。感谢大家的帮助!
    【解决方案3】:

    Animator.CrossFade 函数会达到预期的效果:

    C#:

    Animator animator = this.GetComponent<Animator>();
    animator.CrossFade("WizzyWalkDown", 0);
    

    这可能看起来有点过分或违反直觉,但请记住,AnimationController 类的构建是为了让动画之间的转换变得容易。不过,它仍然可以用于像这样更简单的动画类型!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多