Высота над головой Unity3D

Всем привет. Недавно начал заниматься Unity3D, сначала было много вопросов и пришлось штудировать форумы и блоги моих коллег. А теперь немного начал понимать, что к чему и решил выпустить свои статьи по тем вопросам, которые не удалось найти, но пришлось реализовывать.

В данный момент наша команда работает на революционным шутером от первого лица. Но про него пока не слова)

Так вот, вопрос возник самый простейший, как определить высоту потолка над головой персонажа. Скажем для ограничения высоты прыжка.

Казалось бы ничего сложного, пускаешь луч вверх и если пересекается с объектом, смотришь расстояние.
Пример:

RaycastHit hit;
if (Physics.Raycast (transform.position, Vector2.up, out hit, controller.height)) {
	Debug.log(hit.distance);
}

transform.position — текущая позиция контроллера,
Vector2.up — направление луча,
hit — объект с которым столкнулся луч,
controller.height — высота контроллера, так как считаю, что дальше луч нет смысла запускать.

Но, столкнулся с проблемой! Если персонаж составной, и его части имеют свои коллайдеры, то луч просто срабатывает на них. В моём примере он пересекался с головой персонажа.

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

В моём случае, всем элементам персонажа назначен слой «LocalPlayer». Теперь функция Raycast выглядит вот так:
RaycastHit hit; // определяем переменную в которю будет помещён объект пересечения с лучом
LayerMask layerMask = 1 << LayerMask.NameToLayer ("LocalPlayer"); // создаём маску слоя (все + LocalPlayer)
layerMask = ~layerMask; // инвертируем выбор (все, кроме LocalPlayer)
if (Physics.Raycast (transform.position, Vector2.up, out hit, controller.height, layerMask)) {
	Debug.log(hit.distance);
}//if

На этом всё.
  • +1
  • 12 октября 2013, 16:19
  • igorrius

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus