我有一个布尔型标志的字符,该标志确定他是否在跳跃(如果他在跳跃,则不能再次跳跃)。当他跳跃时,跳转标志设置为true,当他与某物发生碰撞时,该标志设置为false(因此他可以再次跳跃)。

但是,他只跳了一次,即使应该重设为false,跳也保持为真。为什么会这样呢?我对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;
}


unity3d - 为什么我的OnCollisionEnter()定义没有被使用?-LMLPHP

最佳答案

您对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;
}


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

10-06 06:51