【问题标题】:Unity slider controlling animationunity滑块控制动画
【发布时间】:2016-05-10 05:31:54
【问题描述】:

我想创建一个滑块,以统一显示动画的当前帧,当您移动滑块时,它会更新动画中的当前帧。

到目前为止我有(编辑过的代码)

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class NewAnimController : MonoBehaviour {


public Slider sliderScrubber;
public Animator animator;


void Start()
{
    float t = animator
    .GetCurrentAnimatorStateInfo(0)
    .normalizedTime;


    //animator.speed = 0.0001f;
    //slider.onValueChanged.AddListener(OnValueChanged);
}

public void Update()
{
    float animationTime = animator.GetCurrentAnimatorStateInfo(0).normalizedTime;
    Debug.Log("animationTime (normalized) is " + animationTime);
    sliderScrubber.value = animationTime;
}

public void OnValueChanged(float changedValue)
{
    animator.speed = 0.0001f;
    animator.Play("Take 001", -1, sliderScrubber.normalizedValue);
}
}

目前,当您调整滑块时,这会更改动画中的当前帧,但是在播放动画时,滑块不会更新。

我怎样才能让它双向工作?

非常感谢

【问题讨论】:

    标签: c# animation unity3d fbx


    【解决方案1】:

    首先一定要删除所有代码行

    animation.speed = 0.0001f
    

    这似乎是从教程或调试中遗留下来的。


    怎么样

    public void Update()
     {
     float animationTime = animator.GetCurrentAnimatorStateInfo(0).normalizedTime;
     // in case of a looping anime, animationTime = animationTime %1f;
    
     Debug.Log("animationTime is " + animationTime);
     // of course remove that in production
    
     slider.value = animationTime;
     }
    

    当然要注意在编辑器中将scrubber min/max设置为0f、1f。

    注意,您可能更喜欢为关节位置制作“洗涤器”;也很好用。

    注意,微妙的问题:有经验的程序员可能更喜欢将动画速度设置为零,同时用户的手指按住滑块;不这样做可能没问题。


    注意注意删除对animation.speed 的所有引用。它似乎是从不正确的教程中遗留下来的。

    【讨论】:

    • 没错,然后我让滑块从 0 到 1,并让slider.value = animationTime; 工作正常,我只需要更新动画播放的速度,否则它播放得太慢了.我将在其中写入一个可以改变播放速度的滑块,但是对于原始代码animation.speed = 0.0001f 太慢了,以至于看不到它是否可以正常工作。我从一开始找到的代码中得到了这个原始值。
    • 啊!好的,完全删除那行 animation.speed = 0.0001f 太傻了!
    • 是的,现在一切正常,感谢您的帮助。
    • 我只是勾选了立即回答问题的答案,以防万一其他人遇到同样的问题,以便他们尽快完成工作。
    【解决方案2】:

    好的,所以在四处乱扔东西看什么粘住之后,这给了我想要的结果。

    我要感谢 @JoeBlow 的所有帮助。

    有人请那家伙喝一杯。

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    public class NewAnimController : MonoBehaviour {
    
    public Slider sliderScrubber;
    public Animator animator;   
    
    public void Update()
    {
        float animationTime = animator.GetCurrentAnimatorStateInfo(0).normalizedTime;
        Debug.Log("animationTime (normalized) is " + animationTime);
        sliderScrubber.value = animationTime;
    }
    
    public void OnValueChanged(float changedValue)
    {
        animator.Play("Take 001", -1, sliderScrubber.normalizedValue);
    }
    }
    

    当我有一个播放暂停按钮和一个可以改变播放速度的滑块时,我会再次更新。

    【讨论】:

      【解决方案3】:

      我认为您几乎得到了它,而不是直接在更新函数中分配值:

      sliderScrubber.value = animationTime;
      

      使用这个:

      sliderScrubber.Set(animationTime, false);
      

      false 参数是在您不想要的情况下调用 OnValueChange() 函数。

      此外,您可以检查是否正在播放动画以避免对 Set 函数的不必要调用:

      http://answers.unity3d.com/questions/362629/how-can-i-check-if-an-animation-is-being-played-or.html

      并检查您的 slider.maxValue 以将其调整为动画长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-21
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        相关资源
        最近更新 更多