Coroutine(WaitForSeconds())in" OnCollisionEnter()"给出编译错误

时间:2018-04-25 14:28:09

标签: c# unity3d

我试图制作一个平台游戏,我希望在x秒之后能够保持平台的引力。但它给出了一个无法使用的complile错误,因为void不是内部接口类型。我是一个乞丐,我不能等待继续我的项目。谢谢你的时间,对不起我糟糕的英语。

 private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.name == "Platform(Clone)")
    {
        numberOfJumps = 2;
        Debug.Log("Platform hit");
    }

    //Maake platforms fall
    yield return new WaitForSeconds(2f);
    collision.rigidbody.useGravity = enabled;
    yield return null;
}

2 个答案:

答案 0 :(得分:6)

您只能在coroutine函数中屈服。您无法使用void功能。某些Unity回调函数(如Start函数)可以成为void或协程函数。幸运的是,OnCollisionEnter功能就是其中之一,所以只需将void更改为IEnumerator即可。这将无需手动启动新的协同程序功能。当发生碰撞时,Unity会自动调用并启动它作为协程。

private IEnumerator OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.name == "Platform(Clone)")
    {
        numberOfJumps = 2;
        Debug.Log("Platform hit");
    }

    //Maake platforms fall
    yield return new WaitForSeconds(2f);
    collision.rigidbody.useGravity = enabled;
    yield return null;
}

答案 1 :(得分:4)

你应该制作一个Coroutine,然后在OnCollisionEnter中调用它。 Void表示该方法没有返回类型,这就是编译错误的原因。

IENumerator Fall(Rigidbody rigidbody)
{
    //Make platforms fall
    yield return new WaitForSeconds(2f);
    rigidbody.useGravity = enabled;

}

private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.name == "Platform(Clone)")
    {
        numberOfJumps = 2;
        Debug.Log("Platform hit");
    }
    StartCoroutine(Fall(collision.rigidbody));
}