在Unity3D中播放另一个音频时停止音频

速成

播放另一音频时,如何停止音频?

public AudioSource audioSource;
public AudioClip audioClip;
private string[,] levelWords;
//public static string glupiaZmienna;
public Text txt;

public void OnPointerClick(PointerEventData eventData)
{
    Debug.Log(gameObject.name);
    WordsLoader w = new WordsLoader();
    levelWords = w.wLevelWords;
    SetCategoryButton scb = new SetCategoryButton();
    int a = scb.Kategoria;
    zupa();

    AudioSource audio = gameObject.AddComponent<AudioSource>();
    audio.Stop();
    audio.clip = (AudioClip)Resources.Load(a+ "/" + WordsLoader.language + "/Sounds/" + gameObject.name);

    audio.Play();


   // txt = gameObject.GetComponent<Text>();
}

public void zupa()
{ WordsLoader w = new WordsLoader();
    SetCategoryButton scb = new SetCategoryButton();
    int a = scb.Kategoria;
    print(w.wHowManyWords);

    for (int i = 0; i < w.wHowManyWords; i++)
    {
        print("jestem tu");
        if (levelWords[i, 0] == gameObject.name)
        {
            txt = GameObject.Find("Text").GetComponent<Text>(); ;
            txt.text = levelWords[i, 2];
        }

    }
}

该代码在脚本中,单击按钮后开始播放声音。我想停止较早开始的音频。

程序员

编辑答案不得不更改很多,因为它下面留下了评论。覆盖所有内容是有意义的。

您需要一个指向所有的参考AudioSource将每个ClickAction实例存储List在另一个script(PlayerManager)中。在播放音频之前,请先循环List播放并停止播放(如果正在播放)。之后,您就可以播放音频了。

另外,当前您Resources.Load每次要播放音频时都打电话就性能而言,这是不好的。您应该在Start()函数中执行一次此操作,然后在需要时播放它。同样,您的gameObject.AddComponent<AudioSource>()代码也应该只被调用一次。

您的新ClickAction脚本:

public class ClickAction : MonoBehaviour
{
    public AudioSource audioSource;
    public AudioClip audioClip;
    private string[,] levelWords;
    //public static string glupiaZmienna;
    public Text txt;

    public AudioSource clickAudioSource;
    PlayerManager playerManager = null;

    void Start()
    {
        //Get PlayerManager from PlayerManager GameObject
        playerManager = GameObject.Find("PlayerManager").GetComponent<PlayerManager>();
        clickAudioSource = gameObject.AddComponent<AudioSource>();
        clickAudioSource.clip = (AudioClip)Resources.Load(a + "/" + WordsLoader.language + "/Sounds/" + gameObject.name);

        //Register this Script to the PlayerManager 
        playerManager.addClickAction(this);
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log(gameObject.name);
        WordsLoader w = new WordsLoader();
        levelWords = w.wLevelWords;
        SetCategoryButton scb = new SetCategoryButton();
        int a = scb.Kategoria;
        zupa();

        //Play Audio
        playAudio();

        // txt = gameObject.GetComponent<Text>();
    }

    private void playAudio()
    {
        playerManager.playAudio(clickAudioSource);
    }

    public void stopAudio()
    {
        //If not null and playing then stop audio
        if (clickAudioSource != null && clickAudioSource.isPlaying)
        {
            clickAudioSource.Stop();
        }
    }

    public void zupa()
    {
        WordsLoader w = new WordsLoader();
        SetCategoryButton scb = new SetCategoryButton();
        int a = scb.Kategoria;
        print(w.wHowManyWords);

        for (int i = 0; i < w.wHowManyWords; i++)
        {
            print("jestem tu");
            if (levelWords[i, 0] == gameObject.name)
            {
                txt = GameObject.Find("Text").GetComponent<Text>(); ;
                txt.text = levelWords[i, 2];
            }

        }
    }

    void OnDisable()
    {
        //Un-Register this Script from the PlayerManager when it is destroyed
        playerManager.removeClickAction(this);
    }
}

PlayerManager脚本。创建一个名为的GameObject PlayerManager,然后将下面的脚本附加到该对象:

public class PlayerManager : MonoBehaviour
{
    List<ClickAction> clickActions = new List<ClickAction>();

    public void addClickAction(ClickAction clickActionToAdd)
    {
        //Adds clickActionToAdd if it does not exist in the List already
        if (!clickActions.Contains(clickActionToAdd))
        {
            clickActions.Add(clickActionToAdd);
        }
    }

    public void removeClickAction(ClickAction clickActionToAdd)
    {
        //Removes clickActionToAdd if it exist in the List 
        if (clickActions.Contains(clickActionToAdd))
        {
            clickActions.Add(clickActionToAdd);
        }
    }

    public bool clickActionExist(ClickAction clickActionToAdd)
    {
        //Removes clickActionToAdd if it exist in the List 
        return clickActions.Contains(clickActionToAdd);
    }

    public void playAudio(AudioSource audSource)
    {
        //Stop Other Audio
        stopAllClickActionAudio();

        //Now, play the one that was passed in
        audSource.Play();
    }

    void stopAllClickActionAudio()
    {
        //Stop Audio on every ClickAction script
        for (int i = 0; i < clickActions.Count; i++)
        {
            clickActions[i].stopAudio();
        }
    }
}

playAudio调用函数时,它将停止AudioSource存储在中的所有音频List,然后播放AudioSource传递到其中的电流

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

HTML5-当另一个音频标签开始播放时,音频停止

当另一个音频开始时停止播放音频

当另一个应用程序的音频进来时停止播放音频

控制另一个应用的音频播放

如何在react-native中播放另一个类中的数组音频

当使用jQuery单击另一个音频文件同时隐藏链接时停止音频

Swift:另一个类文件中的播放器音频文件

在另一个线程(Unity3D)中从数据库检索数据

将RAW输出传送到另一个进程时,FFmpeg中的音频比特率,音频通道和音频采样频率设置是否重要?

HTML5中的音频:如何在另一个声音之后播放声音?

MediaPlayer是否可以播放一个音频文件,完成后播放另一个音频文件?

在Unity3d测试脚本中,如何从另一个类调用静态函数?

Java-如何停止另一个类的音频剪辑

Android MediaPlayer:如果正在加载另一个音频文件,如何停止?

在顶部恢复Unity3d Android应用程序的另一个活动

来自另一个脚本的Unity3d StartCoroutine

在Unity3D中将对象旋转到另一个

如何在unity3d中加载另一个级别?

在另一个程序(Unity3D)关闭后启动python脚本

Unity3D:我如何在按下一个键然后同时按下另一个键时改变力?

如何使用Python在一个USB设备上播放音频并在另一个USB设备上同时记录音频?

合并两个视频时,另一个视频消除了左音频

如何播放音频文件(.mp3、.flac、.wav),然后使用 ffmpeg 循环播放(每隔几秒混合一次)另一个音频文件(wav)

当用户单击下一个播放按钮时,我想停止当前播放的音频

下一个音轨播放时如何停止此特定的音频播放器(HTML5 + JavaScript)

在applet中播放下一个音频

在播放另一个嵌入的YouTube iframe时停止播放

如何将音频轨道压缩到ffmpeg中的另一个轨道

如何在 JavaScript 中从另一个 JavaScript 文件返回音频?