unity3d Unity C#协程运行不正常

w8f9ii69  于 2023-03-19  发布在  C#
关注(0)|答案(1)|浏览(263)

我有一个协同程序,用来跟踪时间和分数。每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; 
}
6jygbczu

6jygbczu1#

这种编码方法非常繁重。请记住GameObject.FindGetComponent函数是最繁重的,在不需要它们的时候应该避免使用。

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

在播放声音之前,请确保AudioListenerAudioSource设置正确,测试时最好在2D上测试。

然后编写下面的代码就足够了,如果运行Debug.Log时错误没有解决,那么声音问题不是来自您的代码。

[SerializeField] private AudioSource audioSource;
...

audioSource.PlayOneShot(soundClip); // better way to play sounds..

相关问题