【问题标题】:Change the speed of animation at runtime in unity c#在unity c#中改变运行时动画的速度#
【发布时间】:2016-09-16 06:20:17
【问题描述】:

我想在程序运行期间将动画速度更改为我想要的速度。 我有一个 c# 脚本和动画控制器连接到游戏对象。 unity中默认动画速度为1。我将动画的默认速度值设置为0.3f。在程序运行期间,我希望动画的速度为 1

using UnityEngine;
using System.Collections;
public class wowBoard : MonoBehaviour {
    [SerializeField]
    Animator anim;
    bool changeSpeed;
   void Start()
   {
      anim=GetComponent<Animator>();
     playAnim();
     changeSpeed=false;
    }

   public void playAnim()
   {
     anim.SetBool("show",true);
   }

   void Update()
  {
     if(changeSpeed)
        playChangeSpeedAnim();

   }

 public void playChangeSpeedAnim()
 {
    anim.speed=1;
    anim.SetBool("show",true);
 }
}

即使 changeSpeed 的布尔值为 true,动画的速度也没有变为 1。

【问题讨论】:

  • 最后我用上面提到的相同代码解决了我的问题。唯一的变化是动画状态的参数,默认情况下需要为真。以前我的动画参数“show”默认为false。

标签: c# animation unity3d


【解决方案1】:

要控制动画速度,您可以使用动画属性中的 Speed multiplier 参数字段。

如果您在动画器中选择动画,您将在检查器中看到:

如果您点击“参数”复选框,将启用乘数选项。在Multiplier字段中,可以选择一个float类型的参数,动画速度将根据参数的值进行设置。

所以,你可以新建一个名为speed的float参数,通过脚本将动画的速度改为X,只需执行anim.SetFloat("speed", X);即可

【讨论】:

    【解决方案2】:

    使用 Animator 窗口,当拥有 Animator 组件的对象被选中时,首先使用搜索字段旁边的小 + 号添加一个参数。

    在这里,我将其命名为“animSpeed”,并以 1.0 开头。 然后使用 animSpeed 参数选择要更改其动画的状态,并在 Inspector 中的 Speed 下,勾选 Multiplier 旁边的 Parameter 复选框,并确保选择了驱动速度的参数,我将其设置为 animSpeed。

    在代码方面,您将拥有一个包含对 Animator 类型的引用的脚本。在此脚本中,您将拥有一个 Animator 字段:

     [SerializeField] Animator mainAnimator;
    

    另外,例如,您将有一个变量来设置动画速度:

    [SerializeField, Range(0.01f, 2f)] float animSpeedControl = 1f;
    

    在代码的后面,很可能在更新中,您终于可以使用它的名称设置 Animator 的参数(但还有其他可用的方法重载):

    mainAnimator.SetFloat("animSpeed", animSpeedControl);
    

    【讨论】:

    • 这是一种方法,但它不能解释为什么anim.speed 不起作用。如果它不控制动画的速度,该属性有什么用?
    • @user2102929 如果你有一个 Animator 组件而不是一个 Animation 组件,那就是这样做的方法。提问者有一个 Animator 组件。属性 animSpeed 确实通过充当乘数来控制动画速度。你试过了吗?
    【解决方案3】:

    您正在更改 Animator 对象的速度,而不是当前动画。

    对此有两种可能的解决方案:

    1. 获取当前正在运行的动画对象并更改其速度。比如:

    即:

    animation["My animation name"].speed = 1f;
    
    1. 在您的动画制作器中构建 两个 动画剪辑(一个以 .3f 运行,另一个以 1f 运行),并根据您的 speed 值触发它们。然后,您只需要更改速度值即可让 Animator 在其中一个或另一个之间切换:

    即:

    anim.SetFloat("speed", 1f);
    

    anim.SetFloat("speed", .3f);
    

    【讨论】:

    • 感谢您的回复,您的第一个选项对我不起作用。第二个选项是当有很多动画时有点重复的过程。 最后我用上面提到的相同代码解决了我的问题。唯一的变化是动画状态参数默认为真。以前我的动画参数“show”默认为假。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多