为什么我没有使用OnCollisionEnter()的定义?

时间:2016-03-09 17:12:40

标签: unity3d physics unityscript unity3d-2dtools

我有一个布尔标志字符,用于确定他是否正在跳跃(如果他正在跳跃,他不能再跳跃)。当他跳跃时,跳跃标志设置为true,当他与某些东西发生碰撞时,它会被设置为假(因此他可以再次跳跃)。

然而,他只跳了一次,即使它应该重置为假,跳跃也保持不变。为什么会这样?我对OnCollisionEnter()的定义应该重置标志。

var trump;
var jump = false;

function Start() {
// Assigns the Rigidbody to a variable
trump = GetComponent(Rigidbody2D);
// Variable Switches:

}

function OnCollisionEnter() {
    jump = false;
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

function FixedUpdate() {
    trump.velocity.x = Input.GetAxis("Horizontal") * 10;
    if ((Input.GetKeyDown(KeyCode.UpArrow)) && (jump == false)) {
        trump.AddForce(Vector2(0, 10), ForceMode2D.Impulse);
        jump = true;
    }
}

编辑:根据给出的答案,我尝试将Collision参数添加到OnCollisionEnter(),但在我添加后,它仍然看起来不像是调用了函数在其中Debug.Log()进行检查。还有别的错吗?

function OnCollisionEnter(collision: Collision) {
    jump = false;
    Debug.log("He Hit The Wall");
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

enter image description here

1 个答案:

答案 0 :(得分:4)

OnCollisionEnter()的功能签名不正确。定义这些特定于MonoBehaviour的函数时,函数的名称和参数必须与文档中显示的相匹配。否则,MonoBehaviour将无法识别它们,并且在预期时将不会调用该函数。

在这种情况下,OnCollisionEnter()需要Collision参数:

function OnCollisionEnter(collision: Collision) {
    jump = false;
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

注意:上述内容是在编辑问题之前编写的,以实现建议 - 之前,OnCollisionEnter()被定义为没有参数。

然而,在你的情况下,这不是唯一的问题 - 你正在使用Unity的2D物理,这意味着你应该实际使用函数的2D变体:OnCollisionEnter2D,这也略有不同Collision2D的参数。

所以你需要:

function OnCollisionEnter2D(collision: Collision2D) {
    jump = false;
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

希望这有帮助!如果您有任何问题,请告诉我。