Не понимаю, почему код raycast не работает

#c# #unity3d

Вопрос:

Вот код:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RaycastControl : MonoBehaviour
{
    LineRenderer line;
    private Vector3 zeros;
    public LayerMask EnemyLayer;

    // Start is called before the first frame update
    void Start()
    {
        line = GetComponent<LineRenderer>();
        zeros = new Vector3(0f, 0f, 0f);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Debug.Log("Detected the click");
            Vector3 mouse = mouseToWorld(Input.mousePosition);
            Ray ray = new Ray(zeros, mouse);
            RaycastHit hitData;

            if (Physics.Raycast(ray, 10000, EnemyLayer))
            {
                Vector3[] linePos = new Vector3[] { transform.position, mouse };
                line.SetPositions(linePos);

                Debug.Log("You've hit a Zomboid!");
            }
        }
    }
    public Vector3 mouseToWorld(Vector3 mousePos)
    {
        mousePos = Input.mousePosition;
        mousePos.z = Camera.main.nearClipPlane;
        Vector3 mouse = Camera.main.ScreenToWorldPoint(mousePos);
        mouse.z = 0f;

        return mouse;
    }
}
 

Примечание: Я использую Unity2d
Я пытаюсь использовать 0,0,0 и местоположение моей мыши, чтобы отбросить луч, начиная с 0,0,0 и проходя через местоположение мыши на указанное максимальное расстояние в if(физика.Raycast(луч,максимальное расстояние,вражеский слой)). однако это не работает. Когда я нажимаю на объект «Зомби», который я создал, или за ним, я не обнаруживаю попадание в радиопередачу.

Как выглядит вид сцены

Я был уверен, что маска слоя, установленная в этом сценарии, совпадает с маской, установленной в объекте Зомби. Мой Debug.Log(«Вы зашли так далеко!»); строка активируется, чтобы я знал, что сценарий находится в сцене и читается, но Физика.Raycast(луч,10000,вражеский слой)) НИКОГДА не возвращает true, и мы знаем это, потому что Debug.Log(«Вы попали в зомбоид!») никогда не отображается в консоли.

Примечание: Объект, к которому прикреплен этот скрипт, в центре, находится на 0,0,0. его преобразование.положение = 0,0,0

Мы очень ценим вашу помощь.

Комментарии:

1. Вы пытаетесь попасть в столкновение2d? В этом случае вам скорее понадобится использовать Physics2D.Raycast !

2. В дополнение к вышесказанному помните, что Physics/2D.Raycast принимает a LayerMask для выборочного игнорирования слоев. Если все биты в маске слоя включены, она столкнется со всеми коллайдерами. Если LayerMask = 0, он никогда не обнаружит никаких столкновений с лучом.

3. @дерХуго прав. Я должен был использовать физику. 2D для 2d-боксового коллайдера. Я не понимал, что он не может работать с 2d-боксовыми коллайдерами. Спасибо за помощь!

Ответ №1:

Physics и Physics2D разделены в Единстве и не взаимодействуют друг с другом.

Physics2D.Raycast() принадлежит к Physics2D и реагирует только на Physics2D (BoxCollider2D, CircleCollider2D, PolygonCollider2D и т. Д.)

Physics.Raycast() относится к физике и реагирует только на физику (бокс-коллайдер, сферический коллайдер, сетчатый коллайдер и т. Д.)

Вы используете Physics.Raycast() , когда должны использовать Physics2D.Raycast() .

Вот как бы вы это сделали:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RaycastControl : MonoBehaviour
{
    LineRenderer line;
    //private Vector3 zeros;
    public LayerMask EnemyLayer;

    // Start is called before the first frame update
    void Start()
    {
        line = GetComponent<LineRenderer>();
        //zeros = new Vector3(0f, 0f, 0f); not necessary this is the same as Vector3.zero
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Debug.Log("Detected the click");
            RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
            if (hit)
            {
                Vector3[] linePos = new Vector3[] { transform.position, hit.point};
                line.SetPositions(linePos);

                Debug.Log("You've hit a Zomboid!");
            }
        }
    }
}```