Как работать с Raycast 2D в Unity 5
В данном уроке мы разберем как работать с Raycast в 2D пространстве в Unity 5. Для примера работы мы создадим сцену, на которой поместим 3 объекта в разных слоях и будем с ними взаимодействовать. Сцена будет выглядеть так:
Для того, чтоб выставить им разные слоты необходимо нажать на текущий слой (выделен красным и выбрать уже готовый слой, или создать новый через Add Layer -> Написать название нового слоя.
Теперь все наши 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.