unity滑块控制动画
Unity slider controlling animation
我想创建一个在 unity 中显示动画当前帧的滑块,当您移动滑块时,它会更新动画中的当前帧。
到目前为止我有(编辑过的代码)
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);
}
}
目前当你调整滑块时,这会改变动画中的当前帧,但当播放动画时,滑块不会更新。
我怎样才能让它双向工作?
非常感谢
首先一定要删除所有代码行
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;
}
当然要注意在编辑器中将洗涤器 min/max 设置为 0f、1f。
请注意,您可能更愿意为联合职位制作一个 "scrubber";也很好用。
注意,微妙的问题:有经验的程序员可能更喜欢将动画速度设置为零,同时用户的手指按住滑块;不这样做可能没问题。
注意 注意删除对 animation.speed
的所有引用。它似乎是错误教程的遗留问题。
好吧,经过多次扔东西看看有什么用,这就是我想要的结果。
感谢@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);
}
}
当我有一个播放暂停按钮和一个可以改变播放速度的滑块时,我会再次更新这个。
我想你差不多明白了,而不是直接在更新函数中赋值:
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 以将其调整为动画长度。
我想创建一个在 unity 中显示动画当前帧的滑块,当您移动滑块时,它会更新动画中的当前帧。
到目前为止我有(编辑过的代码)
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);
}
}
目前当你调整滑块时,这会改变动画中的当前帧,但当播放动画时,滑块不会更新。
我怎样才能让它双向工作?
非常感谢
首先一定要删除所有代码行
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;
}
当然要注意在编辑器中将洗涤器 min/max 设置为 0f、1f。
请注意,您可能更愿意为联合职位制作一个 "scrubber";也很好用。
注意,微妙的问题:有经验的程序员可能更喜欢将动画速度设置为零,同时用户的手指按住滑块;不这样做可能没问题。
注意 注意删除对 animation.speed
的所有引用。它似乎是错误教程的遗留问题。
好吧,经过多次扔东西看看有什么用,这就是我想要的结果。
感谢@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);
}
}
当我有一个播放暂停按钮和一个可以改变播放速度的滑块时,我会再次更新这个。
我想你差不多明白了,而不是直接在更新函数中赋值:
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 以将其调整为动画长度。