Как предотвратить наложение символов - PullRequest
0 голосов
/ 03 июля 2018

Я действительно борюсь за то, что я представлял себе довольно простым: у меня есть две сетки (бойца), созданные из одного и того же сборного, и я хочу, чтобы они не перекрывались. У сборного дома есть боксерский коллайдер. В идеале я позволю аниматору справиться с позицией. Я пробовал несколько подходов:

  1. Настройте аниматоры на «Анимацию физики». Столкновение не обнаружено
  2. Снимите отметку с корневого движения и перемещайте персонажей, используя положение трансформации игрового объекта. Столкновение не обнаружено
  3. Снимите отметку с корневого движения, добавьте к каждому персонажу твердое тело и перемещайте персонажа, используя положение игрового объекта. Столкновение обнаруживается, но реакция регулируется физикой, что делает его неестественным, поскольку все, что я хочу, - это просто избегать прохождения персонажей друг через друга, то есть просто хочу, чтобы персонажи отталкивались назад до тех пор, пока они не перестанут сталкиваться

Я действительно хотел бы избежать ручного подхода к этому. Как бы я мог предотвратить это перекрытие?

Редактировать: isTrigger не установлен на боксерских коллайдерах

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

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

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

0 голосов
/ 03 июля 2018

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

Вы не должны обрабатывать разделение / отклонение персонажей через физический движок. Просто сделайте триггер боксового бокса, а затем обработайте разделение с помощью кода в скрипте C #, используя onTiggerEnter.

Существует матрица обнаружения столкновений, которая может помочь вам, здесь можно найти: https://docs.unity3d.com/Manual/CollidersOverview.html. Также это изображение прекрасно обобщает ее (в документации по некоторым причинам она находится в двух отдельных таблицах):

enter image description here

0 голосов
/ 03 июля 2018

Хотя это не обязательно предотвращает перекрытие, вы можете создать периметр для персонажей. Это было бы довольно просто в зависимости от того, что вы делаете.

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

Vector3 focalPOne = focalPointOfCharacterOne();
Vector3 focalPTwo = focalPointOfCharacterTwo();

float dx = focalPOne.x - focalPTwo.x;
float dy = focalPOne.y - focalPTwo.y;
float dz = focalPOne.z - focalPTwo.z;

// calc distance along z plane
if (Math.Sqrt((dx * dx) + (dy * dy)) < minDistance)
{
    // person is too close to the others head.
    if (Math.abs(dz) < minHeightAbove)
    {
        // go to previous position.
    }

    // if there is no vertical elivation, you can go
    // straight to moving them back to previous position
}
enter code here

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

Созданный периметр будет выглядеть примерно так.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...