Unity C# 协程无法正常运行

问题描述 投票:0回答:1

我有一个用于跟踪时间和得分的协程。每 10 秒更新一次乐谱并播放一种声音,每 6 秒播放一次另一种声音。当时间变为 0 时,游戏结束。这部分工作正常。问题出在我突出显示的区域。

与检查点发生碰撞时,我想将时间增加 5 秒并播放声音,但碰撞时时间没有增加,声音也没有播放。为了调试,我添加了

Debug.log("Collided")
行以确保发生碰撞,并且发生碰撞时控制台显示碰撞,因此碰撞没有问题。

这是我的检查点触发代码:

private void OnTriggerEnter(Collider other)
{
    print("Hit checkpoint");
    PlayerPrefs.SetInt("CheckPointHit", 1);
    gameObject.SetActive(false);
}

协程代码

    IEnumerator LoseTime()
    {
        while (true)
        {
            yield return new WaitForSeconds(1);
            currentTime--;

            if (currentTime % 10 == 0)
            {
                currentScore -= SCORE_INCREMENT;
                GameObject.FindGameObjectWithTag("MainCamera").GetComponent<AudioSource>().PlayOneShot(scoreSound);
            }
            if (currentTime % 6 == 0)
            {
                GameObject.FindGameObjectWithTag("MainCamera").GetComponent<AudioSource>().PlayOneShot(explosionSound);
            }

            if (PlayerPrefs.HasKey("CheckPointHit"))
            {
                if (PlayerPrefs.GetInt("CheckPointHit") == 1)
                {
                    currentTime += TIME_INCREMENT;
                    GameObject.FindGameObjectWithTag("MainCamera").GetComponent<AudioSource>().PlayOneShot(checkpointSound);
                    PlayerPrefs.SetInt("CheckPointHit", 0);
                    Debug.Log("Collided");
                    Debug.Log(currentTime);
                }
            }

            if (currentTime <= 0)
                break;

            if (gameEnd == true)
                break;
        }

        GameOver();
    }

与检查点发生碰撞时,我想将时间增加 5 秒并播放声音,但碰撞时时间没有增加,声音也没有播放。

更新:根据调试语句,

Debug.Log(currentTime);
,时间似乎在增加,但在显示中没有增加。

要显示的功能在下面,我在

Update()
中调用它:

private void UpdateLabels()
{
    tmScore.text = "Score: " + currentScore;
    tmTimeLeft.text = "Time Left: " + currentTime; 
}
c# unity3d coroutine unityscript ienumerator
1个回答
0
投票

您的这种编码方法非常繁重。请记住,

GameObject.Find
GetComponent
函数是最重的函数之一,在不需要它们时应避免使用它们。

private Camera camera; // cached Camera
void Start()
{
    camera = Camera.main;
    //...
}

在播放声音之前,请确保

AudioListener
AudioSource
设置正确。对于测试,最好在 2D 上进行测试。

然后写下面的代码就可以了,如果运行的时候报错还没有解决

Debug.Log
,声音的问题就不是你的代码了

[SerializeField] private AudioSource audioSource;
...

audioSource.PlayOneShot(soundClip); // better way to play sounds..
© www.soinside.com 2019 - 2024. All rights reserved.