我正在尝试检测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
- 并检测平台对象中的碰撞?
谢谢!
答案 0 :(得分:1)
我使用平台和角色控制器处理类似问题的方法是在平台上添加一个子对象,并将触发器对撞机设置为比平台本身更大的尺寸(想象它就像一个围绕着你的隐形盒子平台)。这样做可以让你知道你的玩家是否会打到平台,他的方向来自等等。然后,这是一个简单的问题,即向平台发送消息,并提供必要的信息parentPlatformObject.SendMessage(params)
答案 1 :(得分:0)
我想提出一些与史蒂文·米尔斯(Steven Mills)提出的建议非常相似的建议,但从长远来看可能会使事情变得更容易。
向播放器添加一个子对象,该子对象具有一个与播放器大小相同的触发碰撞盒(如果您在乎的话,它就在脚的周围),但仅具有一个特定的图层。在项目物理设置中,使所述层仅与平台层交互。这意味着如果此框除了平台(例如播放器的其余部分)以外没有击中其他任何东西,您将不会触发。由于非触发器没有发生变化,因此播放器和平台的行为将与您期望的一样(与Steven的解决方案一样),但是如果您添加了希望落在/击中的新型对象,并希望它们能以类似的方式工作这样,您将不需要将预制件翻倍/制作2个对象,只需分配1个正确的层即可。