【发布时间】:2019-06-11 11:37:26
【问题描述】:
当玩家触发触发器时,我需要停止在另一个脚本中运行的协程。触发器有效,但协程不会停止。
这是运行协程的脚本:
public AudioSource direction;
public IEnumerator audioPlayCoroutine;
public bool running = false;
IEnumerator AudioPlay()
{
while (true)
{
direction.Play();
yield return new WaitForSeconds(2);
}
}
void OnTriggerEnter(Collider col)
{
if (col.gameObject.CompareTag("Player"))
{
if (running == false)
{
audioPlayCoroutine = AudioPlay();
StartCoroutine(audioPlayCoroutine);
Debug.Log("Started");
running = true;
}
else if (running == true)
{
Debug.Log("Void");
}
}
}
这是停止协程运行的脚本。
public GameObject lastTrigger;
void OnTriggerEnter(Collider col)
{
if (col.gameObject.CompareTag("Player"))
{
Debug.Log("Triggered");
if (lastTrigger.GetComponent<MazeAudioLoop>().running == true)
{
lastTrigger.GetComponent<MazeAudioLoop>().running = false;
Debug.Log("Running: false");
StopCoroutine(lastTrigger.GetComponent<MazeAudioLoop>().audioPlayCoroutine);
}
}
}
触发的调试显示,但是协程没有停止。
【问题讨论】:
-
您尝试过使用
audioPlayCoroutine = StartCoroutine(AudioPlay());吗?条件true和StopCoroutine的行真的达到了吗?并且您应该存储GetComponent的结果,而不是多次调用它。例如。通过制作public MazeAudioLoop lastTrigger;并在设置该字段时仅使用一次GetComponent -
@derHugo 这更像是一个答案而不是评论。
-
@trollingchar 这是一个问题;)所以是评论。
IEnumerator xy = AudioPlay(); StarCoroutine(xy);应该基本上和Coroutine xy = StartCoroutine(AudioPlay());工作方式相同 -
您说
Triggered打印到控制台...但是您得到Running: false日志吗?如果不是,它只是意味着lastTrigger.GetComponent<MazeAudioLoop>().running是false... -
我会在你的第一堂课下,一个“stopaudio”方法,试着把它放在一个地方,甚至改变音频被“running”的值触发和停止,甚至更简单