我是Unity和C#的新手,我正在尝试为我的死亡脚本添加“等待时间”。因此,当我的玩家死亡时,它会显示一个粒子动画,然后重新设置关卡,但是,当我正在播放粒子时,关卡并没有重置。
公共GameObject粒子; 公开Player_Movement玩家;
void OnCollisionEnter2D(Collision2D Col)
{
if (Col.collider.tag == "Enemy")
{
Instantiate(particles, transform.position, Quaternion.identity);
Destroy(gameObject);
StartCoroutine("RestartGameCo");
}
}
public IEnumerator RestartGameCo()
{
yield return new WaitForSeconds(0.5f);
SceneManager.LoadScene("Level1");
}
答案 0 :(得分:2)
Destroy(gameObject);
StartCoroutine("RestartGameCo");
您的代码很好,但是您要销毁上面带有此脚本的游戏对象。这也会破坏脚本,并停止所有协程。因此它将永远不会被调用。
一种解决方案是使对象以某种方式不可见,例如禁用网格渲染器和对撞机而不是销毁它。
答案 1 :(得分:0)
我对此有几种选择。这是一个。
通过使用Thread
,它将暂停您的申请一段时间。为此,您需要向正在编辑的当前cs文件中添加using System.Threading;
。现在,只需将代码更改为:
void OnCollisionEnter2D(Collision2D Col)
{
Thread.Sleep(5000) // 5000 in milliseconds
if (Col.collider.tag == "Enemy")
{
Instantiate(particles, transform.position, Quaternion.identity);
Destroy(gameObject);
StartCoroutine("RestartGameCo");
}
}
public IEnumerator RestartGameCo()
{
Thread.Sleep(5000)
yield return new WaitForSeconds(0.5f);
SceneManager.LoadScene("Level1");
}
答案 2 :(得分:0)
实际上,您甚至在运行协同例程之前就已经破坏了游戏对象本身。这意味着协同例程“ RestartGameCo”甚至不会运行。调试这类事情的一种方法是使用Debug.log消息。
void OnCollisionEnter2D(Collision2D Col)
{
if (Col.collider.tag == "Enemy")
{
Instantiate(particles, transform.position, Quaternion.identity);
StartCoroutine("RestartGameCo");
}
}
public IEnumerator RestartGameCo()
{
yield return new WaitForSeconds(0.5f);
SceneManager.LoadScene("Level1");
}
让我知道是否有帮助。