在Unity3D中播放另一个时停止音频
如何在播放另一个音频时停止一个音频?在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
。将另一个脚本(PlayerManager
)中的每个ClickAction
实例存储在List
中。在播放音频之前,请循环播放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
脚本。创建一个游戏物体称为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
函数被调用时,它会停止所有音频从存储在List
AudioSource
,那么它会播放当前AudioSource
那被传入它。
这仍然不起作用。难道是因为我将相同的脚本添加到某些对象中? – Quicki
在评论部分询问了你这个问题,你说过“这段代码每次运行在同一个GameObject上还是不同的GameObject?”。现在,你在说脚本被附加到不同的GameObjects上。 – Programmer
我从另一种方式理解你的问题。对不起 – Quicki
请详细解释您的问题。这一行问题不能回答。哪些音频停止播放哪一个? – Programmer
这段代码是每次在同一个GameObject上运行还是在不同的GameObject上运行? – Programmer
这是相同的游戏对象 – Quicki