在OnCollisionEnter()中使用WaitForSeconds协程出现编译错误求助
解决Unity中OnCollisionEnter使用协程导致的“void不是内部接口类型”编译错误
嘿,这问题我熟!你遇到的编译错误,根源是你在OnCollisionEnter这个返回值为void的方法里使用了协程特有的yield return语句——Unity的普通void方法没法当作协程来跑,协程要求方法的返回类型必须是IEnumerator,而OnCollisionEnter是Unity内置的碰撞回调,必须保持void返回,所以直接这么写肯定报错。
正确的解决思路
把延迟禁用重力的逻辑抽成一个独立的协程方法,然后在OnCollisionEnter里通过StartCoroutine()来启动这个协程就行。
修改后的完整代码
private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "Platform(Clone)") { numberOfJumps = 2; Debug.Log("Platform hit"); // 启动协程处理延迟重力禁用逻辑 StartCoroutine(DisablePlatformGravityAfterDelay(collision)); } } // 独立的协程方法,处理延迟逻辑 private IEnumerator DisablePlatformGravityAfterDelay(Collision collision) { // 等待2秒 yield return new WaitForSeconds(2f); // 注意:这里你原来写的enabled可能是笔误?要禁用重力应该设为false if(collision.rigidbody != null) { collision.rigidbody.useGravity = false; } yield return null; }
额外提醒
- 一定要加
collision.rigidbody != null的判断,避免碰到没有Rigidbody的物体时出现空引用错误 - 你原来代码里的
useGravity = enabled大概率是笔误,enabled是当前脚本的启用状态,如果你要禁用平台重力,应该直接设为false
内容的提问来源于stack exchange,提问作者Gergely Bálint Szabó
相关产品推荐
相关产品推荐

