【问题标题】:Collisions between CharacterController and BoxColliderCharacterController 和 BoxCollider 之间的碰撞
【发布时间】:2013-12-18 23:30:39
【问题描述】:

我正在尝试检测 Unity 项目中 characterController 与平台(rigidBody + boxCollider)之间的冲突。

我知道我可以在 characterController 对象上使用这个函数:

void OnControllerColliderHit(ControllerColliderHit hit) {
    // [...];
}

但我强烈宁愿在平台对象中检测它,以尽量保持代码更清晰。像这样的:

void OnCollisionEnter(Collision c) {
    Debug.Log(c.gameObject.tag);
}

但它不起作用!我在 Unity 论坛中搜索,显然检测碰撞的唯一方法是将boxCollider 的属性isTrigger 设置为True 并改用.OnTriggerEnter(Collider c) 方法。但是,这样做会导致玩家从平台上掉下来,这显然是不可能发生的。

好的,所以我的问题是:是否有另一种方法来做到这一点 - 不将 isTrigger 设置为 True - 并检测平台对象中的碰撞?

谢谢!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我处理平台和角色控制器的类似问题的方法是向平台添加一个子对象,并将触发器对撞机设置为比平台本身更大的尺寸(将其想象为围绕您的平台)。这样做的目的是让您知道您的玩家是否会击中平台,他来自的方向等。然后只需向平台发送消息,并提供必要的信息parentPlatformObject.SendMessage(params)

    【讨论】:

    • 是的,成功了!看起来有点难看,但它会做。谢谢。
    【解决方案2】:

    我想提出一些与 Steven Mills 的建议非常相似的建议,但从长远来看可能会使事情变得更容易。

    向播放器添加一个子对象,它有一个与播放器大小相同的触发碰撞框(或者如果你关心的话,就在它的脚周围),但它只有一个特定的层。在项目物理设置中,使所述层仅与平台层交互。这意味着如果此框击中除平台之外的任何其他东西(如播放器的其余部分),您将不会触发。由于非触发器没有改变,播放器和平台将按照您的预期运行(就像 Steven 的解决方案一样),但是如果您添加了您希望着陆/击中的新类型的对象,并希望它们以类似的方式工作方式,您不需要加倍预制件/制作 2 个对象,只需 1 个分配了正确的层。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多