我正在嘗試創建一個音樂按鈕,每次按下此按鈕時,歌曲都會改變。我總共有 4 首歌。因此,當第一次按下按鈕時,將播放歌曲 1。當第二次按下該按鈕時,將播放歌曲 2,依此類推。
用戶可以在他們喜歡的任何時候更改歌曲。因此,如果用戶決定在播放歌曲的程序中更改歌曲,他們只需按下按鈕即可開始播放下一首歌曲。
如果用戶沒有按下按鈕,他們當前正在收聽的歌曲將繼續播放,直到他們按下按鈕。
我試圖創建一個 AudioClips 陣列,并撰寫了一段代碼回圈通過該陣列。但是,每次按下按鈕時只會播放第一首歌曲。誰能幫我解決這個問題,好嗎?
我知道我正在呼叫 StartCoroutine(PlayClips()); 關于按鈕附加到的方法。但如果我只是簡單地將代碼移動到方法 CallMethod(),Unity 就會卡住。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Snow_Mountain : MonoBehaviour
{
/*public GameObject OpenOptsCanvas;
public GameObject UserOptsCanvas;*/
/*public AudioClip song1;
public AudioClip song2;
public AudioClip song3;
public AudioClip song4;*/
public AudioClip[] clips;
public AudioSource source;
int buttonpress = 0;
int i;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
IEnumerator PlayClips()
{
for (i = 0; i < clips.Length; i )
{
source.clip = clips[i];
//source.clip = clips[clips.Length];
source.Play();
print("I:" i);
print("Clips Lenght:" clips.Length);
//Play songs from begging
if (i == clips.Length)
{
i -= clips.Length;
print("Clips Lenght:" clips.Length);
}
while (source.isPlaying)
{
yield return null;
}
}
}
/*private void Button1_Click(object sender, EventArgs e)
{
buttonpress ;
print("Button Press: " buttonpress);
i ;
print("I:" i);
}*/
public void CallMethod()
{
StartCoroutine(PlayClips());
}
}
uj5u.com熱心網友回復:
您需要從方法中增加歌曲計數器;因此,當它被呼叫時,它會轉到下一首歌曲,而不僅僅是再次開始相同的回圈。您可以在代碼中創建一個 IEnumerator 屬性,并在歌曲結束或單擊下一個按鈕時停止和啟動它:
public AudioClip[] clips;
public AudioSource source;
private int _songCounter = -1;
private IEnumerator _playSongEnumerator;
private void Start()
{
SongEnded();
}
private IEnumerator PlayClips(Action songEnded)
{
source.clip = clips[_songCounter];
source.Play();
while (source.isPlaying)
{
yield return null;
}
songEnded.Invoke();
}
private void SongEnded()
{
// so you don't exceed the array length
_songCounter = (_songCounter 1) % clips.Length;
if (_playSongEnumerator != null) StopCoroutine(_playSongEnumerator);
_playSongEnumerator = PlayClips(SongEnded);
StartCoroutine(_playSongEnumerator);
}
public void CallMethod()
{
SongEnded();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512416.html
