我试图制作一个平台游戏,我希望在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;
}
答案 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));
}