Как сделать чтобы объект не проходил сквозь стены в unity

Обновлено: 04.05.2024

На этот раз попробуем решить проблему, когда камера, которая должна следовать за персонажем, «проваливается» в графику. То есть, камера должна находиться на некотором расстоянии от объекта, вид от третьего лица, но если позади нее, например стена, то позиция камеры изменяется и она приближается к персонажу, конкретней говоря, сокращается дистанция между объектами. Данный вариант, заточен под игру, в которой нет управления камеры мышкой. Мы уже выкладывали скрипт вращения вокруг чего-либо, поэтому при желании, не трудно объединить части кода, сделать контроль камеры мышкой и чтобы она не проходила сквозь стены.

Так, логика. Две точки, дочерние целевому объекту, одна спереди и одна сзади. Настраивается расстояние между точками и объектом, в дальнейшем их позиция будет наследоваться. Еще одна точка, расстояние которой регулируется в зависимости от наличия препятствий, опорой служат две предыдущие точки и исходный объект. И наконец камера, которая преследует третью точку, с использованием сглаживания в движении.

Делаем два пустых объекта с именами Normal и Front, перетаскиваем в персонаж.


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


Настройте расстояние и высоту. В процессе игры, меняться они не будут.

Далее, вешаем на камеру скрипт ThirdPersonCamera:

Здесь переключение вида для камеры и ее движение.

Создаем пустой объект с именем CameraCorrection и вешаем на него скрипт ThirdPersonCameraCorrection:

Тут создается луч от цели и до данной точки. Если луч обрывается каким либо объектом, то назначается новая позиция в место, куда попал луч. Проще говоря, точка перемещается ближе к цели. Если никаких препятствий нет, то возврат к Normal или Front.

P.S.
target - здесь надо указать персонажа.
Всё остальное назначается в соответствии с названиями.

Илья Хребтов


Илья Хребтов

Богдан, привязывал. Изначально игрок это Empty(объект, по русски gameobject). На него и коллайдер вешал, и rigidbody, ему пофигу

Илья Хребтов


Илья Хребтов

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

Илья Хребтов


Илья Хребтов ответил Леониду

Леонид, я гуглил суть проблемы, так же гуглил про коллизию камеры, в итоге решил, что буду пробовать от третьего лица делать. Суть вопроса не понял? Я написал этот вопрос, следовательно суть вопроса знаю. А вот к вам уже возникает вопрос, смысл мне, чтобы камера обходила по алгоритму препятствия, если это не бот, а игрок ей управляет? Либо поясняйте нормально

Илья Хребтов


Илья Хребтов ответил Леониду

Леонид, Вы писали, про обход препятствий камерой, следовательно здесь не сложно понять, что имеется ввиду, чтобы камера обходила стены, а не упиралась в них когда надо

Богдан Шевцов


Богдан Шевцов

В общем, надо создать пустой объект, на него закинуть rigitbody и коллайдер, камеру сделать дочерней к этому объекту и перемешать не камеру, а этот объект с помощью изменения rigidbody.velocity

Илья Хребтов


Илья Хребтов

Богдан, делаю все, что ты и сказал, только двигаю через Input.GetAxis и в дальнейшем transform.position

Богдан Шевцов


Богдан Шевцов ответил Илье

Илья, когда ты перемещаешь объект с помощью изменения его позиции, а не скорости он априори будет игнорировать все коллайдеры

Артем Лис


Артем Лис ответил Клавдии

Клавдия, character controller это персонаж. Грубо говоря.
А capsule collider это его коллизия.
Любой Collider это коллизия

Клавдия Станковская

Клавдия Станковская

Артем Лис


Артем Лис ответил Клавдии

Клавдия Станковская

Александр Волков

Клавдия Станковская

Александр Волков

Клавдия, перетаскиваешь объект из сцены в проект, объект сохраняет все компоненты и перекидываешь его копии на сцену, используешь в любое время и массово редактируешь копии префабов.

Александр Волков

Клавдия Станковская

Клавдия Станковская

😕

Александр,

Артем Лис


Артем Лис ответил Клавдии

Клавдия Станковская

Александр Волков

Артем Лис


Артем Лис ответил Александру

Александр Семенютин


Александр Семенютин ответил Клавдии

Клавдия, Боже. Честно, нубовский вопрос. Я знаком с юнити меньше двух месяцев, и то знаю, в чем проблема. Она самая распространенная на начальных этапах. Советую всю документацию юнити вызубрить, там и это есть.

Александр Семенютин


Александр Семенютин

Ребята сделал город с домами и т.д,как сделать чтобы персонаж был меньше чем город и он не проходил сквозь дома?

Уменьшить модель персонажа, либо в настройках (Transform) либо банальным палзунком.
Для того, что бы не проходил, выбери дом и сделай так Component - > Physics -> Mash Collider

Почитать, поискать не можешь? Привык что все делают за тебя?

Искал - это первые 3 ссылки гугла открыл и ты не увидел ответ где решают твою проблему на русском языке с презентациями, картинками и 5 минутным видео НА РУССКОМ ЯЗЫКЕ и ты решил а ну пускай на форуме найдут, переведут если надо, и напишут инструкцию пошагово чтобы ее смог выполнить даже безрукий инвалид, а ты пока поиграешь с одноклашками в кс или доту, а потом МОЯ ДЕЛАТЬ ИГРЫ, Я ВСЕ САМ!

Искал - это первые 3 ссылки гугла открыл и ты не увидел ответ где решают твою проблему на русском языке с презентациями, картинками и 30 минутным видео НА РУССКОМ ЯЗЫКЕ и ты решил а ну пускай на форуме найдут, переведут если надо, и напишут инструкцию пошагово чтобы ее смог выполнить даже безрукий инвалид, а ты пока поиграешь с одноклашками в кс или доту.

ОМГ это 2 действия, в тулбаре меняешь инструмент на изменение размера объекта на сцене, и на объекты вешаешь (Меш Колайдер), можешь даже попробовать коллизию.

И к дороге или игроку прикрепи скрипт для отладки в консоле

void OnCollisionEnter(Collision myCol)
<
if (myCol.gameObject.name == "Тут имя объекта(дороги) как на сцене")
<
Debug.Log ("Объект стукнулся");
>
>

P.S Rigidbody вешай на дорогу и скрипт если захочешь тоже.

Попробуй добавить ему физику(Rigidbody) и убери галочку с гравитации.
Так как я понял у тебя объект просто не может найти другой объект на который опереться.

И к дороге или игроку прикрепи скрипт для отладки в консоле

Код
void OnCollisionEnter(Collision myCol)
<
if (myCol.gameObject.name == "Тут имя объекта(дороги) как на сцене")
<
Debug.Log ("Объект стукнулся");
>
>

P.S Rigidbody вешай на дорогу и скрипт если захочешь тоже.

using UnityEngine;
using System.Collections;

public class . НАЗВАНИЕ. MonoBehaviour


void OnCollisionEnter(Collision myCol)
<
if (myCol.gameObject.name == "Дорога")
<
Debug.Log ("Объект стукнулся");
>
>
>

Скрипт вешаешь на игрока

P.S То что выделено воск. знаками, заменяешь на название своего скрипта(как в Project).
В юнити и в скрипте должно быть одно название.


Разработка компьютерных игр. С чего начать? Это просто! С нуля до разработчика игр: как начать создавать свою игру. Заказать создание игры.


Рейтинг:

Освоение столкновений - Учебное пособие по Unity

Я использую модифицированную версию стандартного контроллера от первого лица Unity. В тот момент, когда я стою у стены, камера проходит сквозь стену и позволяет мне видеть сквозь стену. Я знаю об окклюзии камеры и реализовал ее в играх от третьего лица, но понятия не имею, как бы это сделать в игре от первого лица, поскольку камера вообще не перемещается от игрока.

Как это удается другим людям?

  • \ $ \ begingroup \ $ Может быть, вы могли бы поместить коллайдер сферы на родительский игровой объект камеры? \ $ \ endgroup \ $
  • \ $ \ begingroup \ $ Дайте мне попробовать \ $ \ endgroup \ $
  • \ $ \ begingroup \ $ Я не особо связывал контроллер FP в Unity, но если ваша камера проходит сквозь стены, разве это не означает игрок проходит сквозь (или частично) стены? Возможно, конфликтующие компоненты вашего контроллера должны быть шире. \ $ \ endgroup \ $
  • \ $ \ begingroup \ $ Вообще-то у меня уже есть капсула на камеру, это то, что прикреплено к камере по умолчанию. Однако это не родитель, имеет ли значение родительская часть? Я попробую добавить к нему коллайдер сферы поверх коллайдера контроллера персонажа. \ $ \ endgroup \ $

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

Либо увеличьте радиус столкновения, либо уменьшите ближнюю плоскость отсечения.

Если вы посмотрите в редакторе на усеченную часть камеры, вы легко сможете определить, слишком ли она далеко по сравнению с вашим радиусом столкновения. Вот пример:


Обратите внимание, как задняя плоскость проходит сквозь стену.

  • \ $ \ begingroup \ $ Как я могу уменьшить ближнюю плоскость отсечения? \ $ \ endgroup \ $
  • 2 \ $ \ begingroup \ $ @TimothyWilliams это параметр в инспекторе для компонента камеры. \ $ \ endgroup \ $

+1 к Резиновому молотку.

В «Основах разработки игр для Unity 3.x» я видел тот же пример. Просто поместите камеру на верхнюю часть объекта сферы (с коллайдером). Также вы можете попробовать отключить на нем рендерер меша, если вы не хотите видеть сферу.

Читайте также: