Raycast не показывает попадание

Raycast проходит сквозь стену и поражает игрока. Говорится, что удар равен нулю

У меня есть raycast, но он проходит сквозь врагов, как и предполагалось, но больше ничего не поражает. Если я сниму маску, она попадет на слой врагов. Если я удалю слой и использую raycastall, он поражает только врагов.

Если я использую raycast, он проходит сквозь стену и попадает в игрока, но не отображается как попадание, на самом деле я получаю сообщение об ошибке

    NullReferenceException: Object reference not set to an instance of an object
    EnemyAI.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/Scripts/EnemyAI.cs:32)

Строка 32 - это Debug.Log (hit.transform.gameObject) ;. Если я его сниму, вообще ничего не произойдет. Ни ошибки, ни попадания.

Вот код

    void OnTriggerEnter2D(Collider2D other){
        if (other.gameObject.tag == "Player") {
            myStats.inRange = true;

        Vector2 direction = other.transform.position - transform.position;
            hit = Physics2D.Raycast(transform.position, direction, myCircle.radius + 1, LayerMask.GetMask("enemies"));
            Debug.Log("Radius size is " + (int)myCircle.radius);
            Debug.Log("donthit value " + LayerMask.GetMask("Enemies"));
                Debug.Log("direction " + (myStats.player.transform.position - transform.position));
            Debug.DrawRay(transform.position, other.transform.position - transform.position, Color.white);
            Debug.DrawLine(transform.position, myStats.player.transform.position, Color.white);
            //Destroy(hit.transform.gameObject);
            Debug.Log (hit.transform.gameObject);
        if(hit != null && hit.transform.gameObject != null){
            if (hit.transform.gameObject.tag == "INDESTRUCTIBLE") {          
                Debug.Log("WALL");
                //  Destroy the Tag "Enemy" here
            }
            if (hit.transform.gameObject.tag == "Player") {          
                Debug.Log("player");
                //  Destroy the Tag "Enemy" here
            }

            Debug.Log("Tag name is " + hit.collider.tag);
        }

                Debug.DrawRay(transform.position, myStats.player.transform.position - transform.position, Color.white);
            }

    }

person Draco    schedule 10.11.2014    source источник
comment
К какому объекту прикреплен ваш скрипт? Похоже, это враг, и вы пытаетесь выяснить, есть ли у врага прямая видимость для игрока, когда он входит в зону досягаемости. Это верно? В таком случае не используйте маску слоя врагов. Raycastall вам не поможет, потому что это просто вернет больше результатов по лучу, а не только первое попадание, если оно есть.   -  person Tubeliar    schedule 11.11.2014
comment
Если я удалю маску врага, raycast попадет в самого себя. Проблема заключалась в том, что Raycastall не дал результатов, кроме врага.   -  person Draco    schedule 12.11.2014


Ответы (1)


Похоже, здесь работают две вещи. Во-первых, согласно документации, Raycast 2D также обнаружит коллайдер (ы) на начало луча. Если вы не используете raycastAll, то исходный враг остановит ваш луч, прежде чем он выйдет в мир. Чтобы предотвратить это, вы можете использовать маску слоя. На всякий случай маска слоя обозначает слой, который вы хотите нанести, а не слои, которые вы хотите игнорировать. Итак, чтобы убедиться, что слой врага - единственный слой, который вы игнорируете, вы можете использовать это:

var layerMask = Physics2D.DefaultRaycastLayers & ~LayerMask.GetMask("Enemies");

А затем используйте эту маску в своем рейкасте.

Во-вторых, должна быть причина, по которой вы больше ни во что не попадаете. Если вы применили маску слоя неправильно, вы отфильтруете любые удары о стену или игрока. Похоже, у вас обоих есть тег врага и слой врага, так что убедитесь, что вы все поняли. Но если вы использовали raycastAll без маски и все равно ничего не попали, убедитесь, что ваши объекты соответствуют всем требованиям. Конечно, у них должны быть 2D-коллайдеры. Если у них есть коллайдеры, убедитесь, что они либо не являются триггерами, либо что параметр «Raycast hit Triggers» включен в Edit -> project settings -> Physics2d.

Последнее, что нужно проверить, - достаточно ли далеко уходит ваш луч. Я заметил, что ваш отладочный рисунок не идеально отражает ваш raycast. Используйте это, чтобы нарисовать настоящий луч:

Debug.DrawLine(transform.position, transform.position + direction * (myCircle.radius + 1) / direction.magnitude, Color.white);
person Tubeliar    schedule 12.11.2014
comment
Есть ли способ увидеть DrawLine или DrawRay С масками слоя? Похоже, что это не параметр в их документации - person Ian S; 17.04.2016