Unity滑块控制动画

时间:2016-02-01 16:58:39

标签: c# animation unity3d fbx

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

到目前为止,我已经编辑了代码

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);
}
}

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

如何让双向工作?

非常感谢

3 个答案:

答案 0 :(得分:2)

首先确保删除所有代码行

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;
 }

当然注意,在编辑器中将洗涤器最小/最大值设置为0f,1f。

注意,您可能更喜欢制作"洗涤器"联合职位;也很好用。

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

注意注意删除对animation.speed的所有引用。它是一个不正确的教程的结转。

答案 1 :(得分:1)

好的,所以经过多次扔东西看看有什么东西,这给了我之后的结果。

我要感谢@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);
}
}

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

答案 2 :(得分:0)

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

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以将其调整为动画长度。