C# 滑块不是';我走得并不顺利。(Unity3d)
我有一个音频剪辑和一个滑块。滑块用作音频剪辑的进度条(时间线)。我可以暂停播放音频,也可以跳过曲目。一切正常。问题是滑块移动不平稳,有点抖动。如果有人可以,请编辑它。提前谢谢 代码如下:C# 滑块不是';我走得并不顺利。(Unity3d),c#,unity3d,slider,unity-ui,C#,Unity3d,Slider,Unity Ui,我有一个音频剪辑和一个滑块。滑块用作音频剪辑的进度条(时间线)。我可以暂停播放音频,也可以跳过曲目。一切正常。问题是滑块移动不平稳,有点抖动。如果有人可以,请编辑它。提前谢谢 代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class MusicPlayer : MonoBehaviour { AudioSo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MusicPlayer : MonoBehaviour
{
AudioSource audioSource;
Slider slider;
public AudioClip track;
// Start is called before the first frame update
void Start()
{
audioSource = GetComponent<AudioSource>();
slider = GetComponent<Slider>();
audioSource.clip = track;
audioSource.Play();
slider.minValue = 0;
slider.maxValue = track.length;
}
// Update is called once per frame
void Update()
{
slider.value = audioSource.time;
}
public void MovePoition()
{
audioSource.time = slider.value;
}
public void play()
{
audioSource.Play();
}
public void pause()
{
audioSource.Pause();
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
公共类音乐播放器:单一行为
{
声源;声源;
滑块;
公共音频剪辑轨道;
//在第一帧更新之前调用Start
void Start()
{
audioSource=GetComponent();
slider=GetComponent();
audioSource.clip=曲目;
audioSource.Play();
slider.minValue=0;
slider.maxValue=track.length;
}
//每帧调用一次更新
无效更新()
{
slider.value=audioSource.time;
}
公共无效移动位置()
{
audioSource.time=slider.value;
}
公共游戏
{
audioSource.Play();
}
公共空间暂停()
{
audioSource.Pause();
}
}
在更新
上,使用Time.deltaTime
更新滑块的值以确保平滑度。否则,在播放
和暂停
中,将位置与播放时间重新同步
但是,在设置值时需要避免回调。在开始时创建一个空事件
,并在更新值时将其分配给滑块
最后,添加一个标记以跟踪是否应该播放该曲目。这可以防止在播放剪辑结尾并拖动滑块时源停止
在movepotion
中设置源时间后,根据剪辑的压缩情况,可能无法设置滑块的精确值。因此,您应该根据音频源决定使用的时间重新更新滑块值
总共:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MusicPlayer : MonoBehaviour
{
AudioSource audioSource;
Slider slider;
Slider.SliderEvent emptyEvent;
public AudioClip track;
private bool isPaused;
private bool needSync;
// Start is called before the first frame update
void Start()
{
audioSource = GetComponent<AudioSource>();
slider = GetComponent<Slider>();
audioSource.clip = track;
audioSource.Play();
slider.minValue = 0;
slider.maxValue = track.length;
emptyEvent = new Slider.SliderEvent();
}
void SetSliderWithoutCallback(float time)
{
Slider.SliderEvent temp = slider.onValueChanged;
slider.onValueChanged = emptyEvent;
slider.value = time;
slider.onValueChanged = temp;
}
// Update is called once per frame
void Update()
{
if (audioSource.isPlaying)
{
float newTime = Mathf.Min(slider.value + Time.deltaTime, slider.maxValue);
SetSliderWithoutCallback(newTime);
}
else if (!isPaused)
{
SetSliderWithoutCallback(slider.maxValue);
isPaused = true;
}
}
public void MovePoition()
{
audioSource.time = slider.value;
if (!isPaused)
{
audioSource.Play();
SetSliderWithoutCallback(audioSource.time);
}
}
public void play()
{
audioSource.Play();
isPaused = false;
SetSliderWithoutCallback(audioSource.time);
}
public void pause()
{
isPaused = true;
audioSource.Pause();
SetSliderWithoutCallback(audioSource.time);
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
公共类音乐播放器:单一行为
{
声源;声源;
滑块;
Slider.SliderEvent清空事件;
公共音频剪辑轨道;
私人住宅;
私有布尔同步;
//在第一帧更新之前调用Start
void Start()
{
audioSource=GetComponent();
slider=GetComponent();
audioSource.clip=曲目;
audioSource.Play();
slider.minValue=0;
slider.maxValue=track.length;
emptyEvent=新的Slider.SliderEvent();
}
无效SetSliderWithoutCallback(浮动时间)
{
Slider.SliderEvent temp=Slider.onValueChanged;
slider.onValueChanged=emptyEvent;
slider.value=时间;
slider.onValueChanged=温度;
}
//每帧调用一次更新
无效更新()
{
if(音频源.isPlaying)
{
float newTime=Mathf.Min(slider.value+Time.deltaTime,slider.maxValue);
SetSliderWithoutCallback(新时间);
}
否则,如果(!i暂停)
{
SetSliderWithoutCallback(slider.maxValue);
isPaused=真;
}
}
公共无效移动位置()
{
audioSource.time=slider.value;
如果(!i暂停)
{
audioSource.Play();
SetSliderWithoutCallback(audioSource.time);
}
}
公共游戏
{
audioSource.Play();
isPaused=false;
SetSliderWithoutCallback(audioSource.time);
}
公共空间暂停()
{
isPaused=真;
audioSource.Pause();
SetSliderWithoutCallback(audioSource.time);
}
}
在更新
上,使用Time.deltaTime
更新滑块的值以确保平滑度。否则,在播放
和暂停
中,将位置与播放时间重新同步
但是,在设置值时需要避免回调。在开始时创建一个空事件
,并在更新值时将其分配给滑块
最后,添加一个标记以跟踪是否应该播放该曲目。这可以防止在播放剪辑结尾并拖动滑块时源停止
在movepotion
中设置源时间后,根据剪辑的压缩情况,可能无法设置滑块的精确值。因此,您应该根据音频源决定使用的时间重新更新滑块值
总共:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MusicPlayer : MonoBehaviour
{
AudioSource audioSource;
Slider slider;
Slider.SliderEvent emptyEvent;
public AudioClip track;
private bool isPaused;
private bool needSync;
// Start is called before the first frame update
void Start()
{
audioSource = GetComponent<AudioSource>();
slider = GetComponent<Slider>();
audioSource.clip = track;
audioSource.Play();
slider.minValue = 0;
slider.maxValue = track.length;
emptyEvent = new Slider.SliderEvent();
}
void SetSliderWithoutCallback(float time)
{
Slider.SliderEvent temp = slider.onValueChanged;
slider.onValueChanged = emptyEvent;
slider.value = time;
slider.onValueChanged = temp;
}
// Update is called once per frame
void Update()
{
if (audioSource.isPlaying)
{
float newTime = Mathf.Min(slider.value + Time.deltaTime, slider.maxValue);
SetSliderWithoutCallback(newTime);
}
else if (!isPaused)
{
SetSliderWithoutCallback(slider.maxValue);
isPaused = true;
}
}
public void MovePoition()
{
audioSource.time = slider.value;
if (!isPaused)
{
audioSource.Play();
SetSliderWithoutCallback(audioSource.time);
}
}
public void play()
{
audioSource.Play();
isPaused = false;
SetSliderWithoutCallback(audioSource.time);
}
public void pause()
{
isPaused = true;
audioSource.Pause();
SetSliderWithoutCallback(audioSource.time);
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
公共类音乐播放器:单一行为
{
声源;声源;
滑块;
Slider.SliderEvent清空事件;
公共音频剪辑轨道;
私人住宅;
私有布尔同步;
//在第一帧更新之前调用Start
void Start()
{
audioSource=GetComponent();
slider=GetComponent();
audioSource.clip=曲目;
audioSource.Play();
slider.minValue=0;
slider.maxValue=track.length;
emptyEvent=新的Slider.SliderEvent();
}
无效SetSliderWithoutCallback(浮动时间)
{
Slider.SliderEvent temp=Slider.onValueChanged;
slider.onValueChanged=emptyEvent;
slider.value=时间;
slider.onValueChanged=温度;
}
//每帧调用一次更新
无效更新()
{
if(音频源.isPlaying)
{
float newTime=Mathf.Min(slider.value+Time.deltaTime,slider.maxValue);
SetSliderWithoutCallback(新时间);
}
否则,如果(!i暂停)
{
SetSliderWithoutCallback(slider.maxValue);
isPaused=真;