Обнаружение хождения по полу - частично работает

У меня есть набор блоков Gameobject, которые образуют пол с Box Collider и GameObject с Box Collider в нем.

Мое первое обнаружение хита, поражающее пол, было:

void OnCollisionEnter2D(Collision2D collision) {
    print ("Enter: " + collision.gameObject.tag);
    switch (collision.gameObject.tag) {
        case "Floor":
            isOnFloor = true;
            break;
    }
}

Это хорошо работает. Однако, когда я хочу проверить, оставил ли он пол (падение):

void OnCollisionExit2D(Collision2D collision) {
    print ("Exit: " + collision.gameObject.tag);
    switch (collision.gameObject.tag) {
        case "Floor":
            isOnFloor = false;
            break;
    }
}

GameObject Сбрасывается, как только я немного передвигаюсь, когда получаю метод OnCollisionExit2D ...

Как создать постоянное движение на полу и вызвать «падение» только в том случае, если я полностью оставлю его?

Спасибо!

6 голосов | спросил trueicecold 25 +03002015-10-25T16:14:00+03:00312015bEurope/MoscowSun, 25 Oct 2015 16:14:00 +0300 2015, 16:14:00

3 ответа


2

Как и Вадим Татарников, причина, по которой вы падаете, - это то, что для вашего isOnFloor bool установлено значение false, когда вы переходите к другому блоку. чтобы предотвратить все это, я бы предложил пойти с raycast way вместо полевых столкновений. Поэтому, чтобы проверить, находится ли ваш GameObject на полу, лучше всего было бы наложить луч под этим GameObject и посмотреть, есть ли под ним пол. Таким образом, вы также можете определить, прыгает ли ваш игрок, проверяя, как долго Raycast от вашего GameObject до земли.

    float rayDistance = 100;
    RaycastHit hit;
    if (Physics.Raycast(transform.position, -transform.up, out hit, rayDistance))
    {
        //Hit is detected, you can now check with the RaycastHit how far away and what object you hit and apply logic there.
        Debug.Log("Raycast hit object " + hit.transform.name);
        Debug.Log("Distance between object and " + hit.transform.name + ": " + hit.distance);

        //You can even debug the line so you can see it in the scene
        Debug.DrawLine(transform.position, hit.point, Color.blue, 10);
    }

Вы должны поместить этот код в свой метод обновления для точной проверки.

Вот документация Raycast https://docs.unity3d.com/ScriptReference /Physics.Raycast.html

ответил Arthur 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2016 10:48:30 +0300 2016, 10:48:30
0

, если вы установите блоки перекрытия на новый слой (например, «Этаж»), вы можете обнаружить его, используя Physics2D.OverlapCircle()

private bool isGrounded = false;
[SerializeField]
private LayerMask groundLayer;//set this to the Floor layer in the inspector

сделать частную переменную bool isGrounded, а в FixedUpdate () вы можете обнаружить ее. Physics2D.OverlapCircle () также может быть полезна для обнаружения многих слоев, таких как потолки, веревки, лед, эстафеты лестниц.

isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, groundLayer);
ответил Justin Markwell 26 +03002015-10-26T07:08:20+03:00312015bEurope/MoscowMon, 26 Oct 2015 07:08:20 +0300 2015, 07:08:20
0

Если вы настаиваете на использовании OnCollisionEnter и OnCollisionExit, чтобы обнаружить, что вы что-то наступаете, я предлагаю сделать следующее:

  • Создайте новую переменную типа int. Назовем его StepOnCount, запустите его до 0.
  • Измените OnCollisionEnter на:

    void OnCollisionEnter2D(Collision2D collision) {
        print ("Enter: " + collision.gameObject.tag);
        switch (collision.gameObject.tag) {
            case "Floor":
                StepOnCount++;
                isOnFloor = true;
                break;
        }
     }
    
  • Измените OnCollisionExit на:

    void OnCollisionExit2D(Collision2D collision) {
        print ("Exit: " + collision.gameObject.tag);
        switch (collision.gameObject.tag) {
            case "Floor":
            StepOnCount--; 
            if(StepOnCount == 0)
                isOnFloor = false;
            break;
        }
    }
    

Таким образом, вы отслеживаете, сколько блоков вы набираете: Вы не хотите падать, когда вы перестаете делать шаг, вы хотите упасть, когда вы наступаете без блока.

PD: Если вы работаете над 2D-платформером, другие ответы, приведенные здесь, являются лучшим подходом. Если вы работаете над перспективной игрой сверху вниз или 3 четвертой, я бы предложил использовать мое решение.

ответил Leo 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2016 15:42:04 +0300 2016, 15:42:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132