Сдержанный отбрасывание - PullRequest
0 голосов
/ 27 января 2020

У меня есть игровое поле, которое разделено на 4 зоны (как показано на изображении ниже)

Playing field 2

Игрок (синий) включен вторая зона, в то время как в третьей зоне 2 врага (красного цвета). Когда игрок бросает объект и поражает противника, противник отбрасывается в следующей зоне (4), но должен оставаться в этой зоне.

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

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

1 Ответ

1 голос
/ 27 января 2020

Новые компоненты

Вы можете использовать системы NavMe sh для вычисления следующей позиции противника.

Вы можете найти эти классы (Компоненты) на GitHub . Они являются официальным компонентом, но все еще находятся в стадии разработки, если я хорошо помню, поэтому они на github .

Теперь вы можете найти много tutos в inte rnet, показывающих, как использовать эти классы. Вот один хороший пример , благодаря Brackeys .

Как это будет работать

После того, как вы загрузите эти классы, вы сможете выполните следующие действия:

enter image description here

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

Вы можете найти больше информации здесь . Этот метод вычисляет ближайшую точку данной позиции.

Вычисляет позицию отбрасывания

Что касается ваших комментариев, для вычисления позиции отбрасывания есть разные способы:

Ось- основанная позиция

Если ваша сцена так проста, как эти правила:

  • Слева направо - Ось X
  • Сверху вниз - Ось Y

( или наоборот )

Тогда вы можете сделать следующее:

public Vector3 GetKnockbackPosition(Vector3 startPosition, float force)
{
    Vector3 res = startPosition;
    res.x -= force; // Could be Z axis, depends on orientation 
    return res;
}

Позиция не по оси

Вы можете сделать следующее:

public Vector3 GetKnockbackPosition(Transform transformToKnockback, float force)
{
    Vector3 res = transformToKnockback.position;
    res -= transformToKnockback.forward * force;
    return res;
}

Здесь у вас есть forward, который поможет вам. Вы можете вычесть это значение и добавить коэффициент силы для управления силой отталкивания.

Поэтому, как только вы вычислили позицию, вы можете использовать SamplePosition, чтобы отрегулировать ее независимо от того, находится она внутри зоны или нет.


Скажите, что-то не так правильно объяснено.

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