首页 > 解决方案 > OnCollisionEnter 不起作用

问题描述

我正在我的统一游戏中制作一个蹲伏脚本。我遇到的一个问题是,当您松开蹲下并且处于某物之下时,您仍然会上升并且卡住了。解决方案是创建一个玩家的孩子,检查玩家头顶是否有任何东西

代码会像这样工作

void OnCollisionEnter(Collision collision)
{
    isunder = true;
     print("collide")
}
void OnCollisionExit(Collision collision)
{
    isunder = false
}

出于某种原因,我无法让它工作。一切都有一个对撞机,一切都有一个刚体,一切都是运动学的而不是运动学的。我只是不

标签: unity3d

解决方案


所以我不太确定你是如何尝试设置你的场景的,但是使用碰撞来检查一个物体是否在你的头顶是不可能的,就像你使用一个带有刚体的空游戏对象一样,它不会检测到任何东西,如果你在上面放一个对撞机,你现在就会有一个看不见的物体撞到东西上。所以我建议你使用 Raycasting 或 Triggers

要使用触发器,请在您的游戏对象上放置一个对撞机,并将 isTrigger 设置为 true。然后在您的代码中,您可以使用这些:

void OnTriggerExit(Collider collision)
{

    Debug.Log("Exit");
}
void OnTriggerEnter(Collider collision)
{
    Debug.Log("Enter");
}

就像碰撞一样工作,只是它是一个不会导致任何实际碰撞的不可见场。

另一种方式,光线投射,也可以使用。

public Transform rayStart;
float length; //Set equal to how far above head you want to check
public bool underObject() {
    return Physics.Raycast(rayStart.position, Vector3.up, length);
}

只需确保作为您的 rayStart 的游戏对象(可能位于角色头顶)不在您的角色内部,否则射线会击中您的角色并始终返回 true。长度可能是从蹲下到站立的距离差。


推荐阅读