【问题标题】:How to add wait time between death and level reset. c#如何在死亡和级别重置之间添加等待时间。 C#
【发布时间】:2019-05-15 19:25:43
【问题描述】:

我是 Unity 和 C# 的新手,我正在尝试在我的死亡脚本中添加“等待时间”。因此,当我的播放器死亡时,它会显示粒子动画,然后重置关卡,然而,此时我的粒子正在播放,但关卡不会重置。

公共游戏对象粒子; public 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");
}

【问题讨论】:

  • WaitForSeconds(0.5f) 使用更大的数字?
  • @Draco18s 我实际上不认为是时候了,我使用了 0.001 到 100f 之间的数字。我现在要编辑我的帖子,但是我得到了粒子效果,但是游戏没有重新启动。感谢您的回复!

标签: c# unity3d


【解决方案1】:
    Destroy(gameObject);
    StartCoroutine("RestartGameCo");

您的代码很好,但是您破坏了上面有此脚本的游戏对象。这也会破坏脚本,并停止所有协程。所以它永远不会被调用。

解决方案是以某种方式使对象不可见,例如禁用网格渲染器和碰撞器而不是销毁它。

【讨论】:

  • 非常感谢!
【解决方案2】:

你实际上是在运行协程之前就破坏了游戏对象本身。这意味着协程“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");
}

如果有帮助,请告诉我。

【讨论】:

  • 非常感谢,这对您有很大帮助!
【解决方案3】:

我知道这方面的几个选项。这是一个。

通过使用Thread,它将暂停您的应用程序,直到您希望的时间。为此,您需要将using System.Threading; 添加到您正在编辑的当前cs 文件中。现在只需将您的代码更改为:

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");
}

【讨论】:

  • 非常感谢您的回复,我想念我的帖子(现在已更新)我正在获得粒子效果但是我的场景不会重置。
  • 不要在 Unity 中使用 Threads。可怕的想法。为什么?因为除了主线程之外,您无法从任何地方执行SceneManager.LoadScene("Level1"); 之类的操作。哦等等,你还没有创建一个新线程,你只是让主线程进入睡眠状态......冻结了整个游戏。另见why is thread.sleep so harmful?
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2012-02-07
  • 2021-08-22
相关资源
最近更新 更多