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=真;