Почему не используется мое определение OnCollisionEnter()?

У меня есть персонаж с логическим флагом, который определяет, прыгает он или нет (если он прыгает, он не может прыгать снова). Когда он прыгает, флаг прыжка устанавливается в значение «истина», а когда он сталкивается с чем-либо, он снова устанавливается в значение «ложь» (чтобы он мог снова прыгать).

Однако он прыгает только один раз, и прыжок остается истинным, даже когда он должен сбрасываться на ложный. Почему это так? Мое определение для 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;
    }
}

EDIT: Основываясь на данном ответе, я попытался добавить параметр Collision к OnCollisionEnter(), но все еще не похоже, что функция вызывается после того, как я добавил Debug.Log() внутри нее для проверки. Что-то еще не так?

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

введите здесь описание изображения


person Number1son100    schedule 09.03.2016    source источник
comment
‹шутка›Это Трамп. Он не позволяет другим людям указывать ему, что делать :-p‹/шутка› - Серьезно, однако, Why won't Trump jump more than once?, безусловно, самый смешной и безумный заголовок вопроса, который я когда-либо видел ;-)   -  person John Slegers    schedule 09.03.2016
comment
Этот попался мне на глаза по этой причине. XP Но я бы очень хотел отредактировать заголовок, чтобы сделать его более полезным/доступным для поиска вопросом в будущем...   -  person Serlite    schedule 09.03.2016
comment
@serlite - всегда просто нажимайте «Изменить» в любое время, когда видите, что нужно внести изменения.   -  person Fattie    schedule 09.03.2016
comment
@ Number1son100 - вы не можете использовать единство скрипт. Он устарел, не работает и удаляется из Unity. К счастью, c# намного проще.   -  person Fattie    schedule 09.03.2016


Ответы (1)


Ваша подпись функции для OnCollisionEnter() неверна. При определении этих специфичных для MonoBehaviour функций обязательно, чтобы имя и параметры функции соответствовали указанным в документации. В противном случае MonoBehaviour не распознает их, и функция не будет вызвана, как ожидается.

В этом случае OnCollisionEnter() требуется параметр Collision:

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

Примечание. Приведенное выше было написано до того, как вопрос был отредактирован для реализации предложения — раньше OnCollisionEnter() определялся без параметра.

Однако в вашем случае это не единственная проблема — вы используете 2D-физику Unity, а это значит, что вы должны использовать 2D-вариант функции: OnCollisionEnter2D, который также принимает немного другой параметр Collision2D.

Итак, вам понадобится:

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

Надеюсь это поможет! Дайте знать, если у вас появятся вопросы.

person Serlite    schedule 09.03.2016
comment
Как это исправить? - person Number1son100; 10.03.2016
comment
@ Number1son100 Эй, я внимательно изучил твою проблему, и ты прав, что-то еще не так. Я обновил свой ответ, чтобы отразить это, дайте мне знать, как это происходит. - person Serlite; 10.03.2016
comment
Хочешь двойной прыжок? - person Barış Çırıka; 10.03.2016
comment
Спасибо! Хотя как бы я это сделал? - person Number1son100; 11.03.2016
comment
@ Number1son100 Рад, что смог помочь! Я попытаюсь ответить за Барыша - в случае двойного прыжка вам просто нужно несколько изменить свою логику, чтобы использовать счетчик (например, var jumpsRemaining = 2) для отслеживания прыжка, а не логический флаг. Разрешить прыгать только при jumpsRemaining > 1, и при каждом последующем прыжке вычитать из него 1. Затем сбросьте его до желаемого количества прыжков (например, 2), когда вы столкнетесь с чем-то. - person Serlite; 11.03.2016