【问题标题】:Stopping coroutine from other script not a calling从其他脚本停止协程而不是调用
【发布时间】: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()); 吗?条件trueStopCoroutine的行真的达到了吗?并且您应该存储GetComponent 的结果,而不是多次调用它。例如。通过制作public MazeAudioLoop lastTrigger; 并在设置该字段时仅使用一次GetComponent
  • @derHugo 这更像是一个答案而不是评论。
  • @trollingchar 这是一个问题;)所以是评论。 IEnumerator xy = AudioPlay(); StarCoroutine(xy); 应该基本上和 Coroutine xy = StartCoroutine(AudioPlay()); 工作方式相同
  • 您说Triggered 打印到控制台...但是您得到Running: false 日志吗?如果不是,它只是意味着lastTrigger.GetComponent&lt;MazeAudioLoop&gt;().runningfalse ...
  • 我会在你的第一堂课下,一个“stopaudio”方法,试着把它放在一个地方,甚至改变音频被“running”的值触发和停止,甚至更简单

标签: c# unity3d coroutine


【解决方案1】:

您需要在运行协程的组件上调用 StopCoroutine。

  StopCoroutine(lastTrigger.GetComponent<MazeAudioLoop>().audioPlayCoroutine);

这意味着当前组件即将停止它不持有的协程。

相反,您可以创建一个简单的方法来停止协程:

MazeAudioLoop mal = lastTrigger.GetComponent<MazeAudioLoop>();
if (mal.running == true)
{
     mal.running = false
     mal.StopAudio();
      // or this => mal.StopCoroutine(mal.audioPlayCoroutine);
}

MazeAudioLoop.cs 有:

public void StopAudio()
{
     if(audioPlayCoroutine == null) { return; }
     StopCoroutine(audioPlayCoroutine);
     audioPlayCoroutine = null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2016-10-31
    相关资源
    最近更新 更多