我有一个用于跟踪时间和得分的协程。每 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;
}
您的这种编码方法非常繁重。请记住,
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..