Как работать с Raycast 2D в Unity 5

В данном уроке мы разберем как работать с Raycast в 2D пространстве в Unity 5. Для примера работы мы создадим сцену, на которой поместим 3 объекта в разных слоях и будем с ними взаимодействовать. Сцена будет выглядеть так:

Объекты на сцене для raycast в unity

Для того, чтоб выставить им разные слоты необходимо нажать на текущий слой (выделен красным и выбрать уже готовый слой, или создать новый через Add Layer -> Написать название нового слоя.

Настройки слоя в Unity 5

Теперь все наши 3 объекта находятся в разных слоях. Далее необходимо разобраться что такое Raycast и для чего он нужен.

Команда Raycast создает луч из исходной точки, в заданном направлении с определенной длинной, задевающий все коллайдеры в этом направлении. Мы так же можем выставить необходимую нам маску, который этот Raycast должен задевать.

Для работы нашего Raycast создадим новый скрипт InputController в который напишем:

public class InputController : MonoBehaviour {

    //маска по которой мы будем искать объект
    public LayerMask NeedLayer;
	void Update () {
        // В данном случае мы преобразуем нашу позицию мышки на 
        //экране в точку на мировом пространстве относительно камеры
        Vector2 CurMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        //Анализировать будем только при нажатии мышки
        if (Input.GetMouseButtonUp(0))
        {
            //Для работы Raycast необходимо, чтоб объект имел компонент Collider
            //В rayHit мы занесем результат выполнения команды Raycast
            //там будет либо null, если raycast никого не задел, либо первый
            //объект, стоящий на пути мышки (какой объект будет первым
            //решает его положение Z в мировом пространстве)
            RaycastHit2D rayHit = Physics2D.Raycast(CurMousePos, Vector2.zero);
            if (rayHit.transform !=null)
                Debug.Log("Selected object: "+ rayHit.transform.name);
            //Для того, чтоб получить все объекты, которые задевает наш луч
            //нужно применить другой метод Raycast
            RaycastHit2D[] allHits = Physics2D.RaycastAll(CurMousePos, Vector2.zero);
            //Теперь в allHits мы получим все объекты, стоящие на пути мышки
            for (int i = 0; i < allHits.Length; i++)
            {
                Debug.Log(allHits[i].transform.name);
            }
            //Так же можно искать объект с определенной маской.
            //10f - расстояние, на которое летит raycast, а NeedLayer - маска для поиска.
            RaycastHit2D maskHit = Physics2D.Raycast(CurMousePos, Vector2.zero,10f,NeedLayer);
            if (maskHit.transform != null)
                Debug.Log("Layer object: " + maskHit.transform.name);
            //Но Raycast работает не только так. Так же можно смотреть объект
            //лежащий на пути от одной точки до другой. Для этого вместо Vector2.zero
            //необходимо указать НАПРАВЛЕНИЕ до необходимого объекта.
            //Чтобы получить направление необходимо вычесть из финальной точки
            //начальную и нормализовать при помощи .normalize (если объект это vector)
        }
	}
}

Если мы повесим этот скрипт на MainCamera и выставим NeedLayer для полной работы скрипта. В результате мы разобрали как работать с Raycast 2D в Unity 5.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (8 оценок, среднее: 5,00 из 5)
Adblock
detector