Как работать с 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.
