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

4
我有一个角色,有一个布尔标志,确定他是否正在跳跃(如果他在跳跃,他不能再次跳跃)。 当他跳跃时,跳跃标志设置为true,当他与某物碰撞时,它会被重置为false(这样他就可以再次跳跃)。
然而,他只能跳一次,并且即使应该重置为false,跳跃仍保持为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;
    }
}

编辑:根据给出的答案,我尝试在OnCollisionEnter()中添加了Collision参数,但仍然看起来这个函数没有被调用。我已经在其中添加了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


3
“特朗普不允许别人告诉他该做什么。-开玩笑的,不过,“为什么特朗普不会跳超过一次?”绝对是我最近看到的最有趣和疯狂的问题标题;-)” - John Slegers
这个引起了我的注意,因为这个原因。XP但我真的想编辑标题,使其成为一个更有用/可搜索的问题,以供将来参考... - Serlite
@serlite - 每当您看到编辑时,随时单击编辑即可。 - Fattie
@Number1son100 - 你不能使用"unityscript"。它已经被弃用,不起作用,并且正在从Unity中删除。幸运的是,c#要容易得多。 - Fattie
1个回答

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

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

我该如何修复这个问题? - Number1son100
@Number1son100 嘿,我仔细看了一下你的问题,你是对的,还有其他的问题。我已经更新了我的答案以反映这一点,请告诉我它的进展如何。 - Serlite
你想要双重跳跃吗? - Barış Çırıka
谢谢!不过我该怎么做呢? - Number1son100
@Number1son100 很高兴能帮上忙!我会尝试回答Barış的问题 - 在双重跳跃的情况下,您只需改变逻辑,使用计数器(如 var jumpsRemaining = 2)来跟踪跳跃,而不是布尔标志。只有在 jumpsRemaining > 1 时才允许跳跃,并且每次跳跃后从中减去1。然后,在与某物碰撞时将其重置为所需的跳跃次数(如2)。 - Serlite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接