Как сделать объезд препятствий в 2.5d игре Unity?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как сделать объезд препятствий в 2.5d игре Unity?

Сообщение Anonymous »

Я делаю 2.5D-игру в Unity. Земля на сцене создана с помощью прямоугольной тайловой карты. Сама земля находится на одном уровне по Z. Есть возвышения, которые реализованы с помощью OrderInLayer и коллайдеров. На самом деле на сцене 3 уровня высоты (отмечены цифрами на картинке). Каждый уровень состоит из зон с коллайдерами (чтобы с нижнего уровня нельзя было ступить на верхний уровень) и без коллайдеров (например, чтобы игрок мог пройти за камнями). Переход между уровнями происходит при прохождении лестницы (L на картинке), на которой находится коллайдер, поэтому изменяется orderInLayer и слой сущности. В LayerCollisionMatrix все настроено так, что сущность не взаимодействует с коллайдерами на своем уровне, а взаимодействует с коллайдерами на других уровнях
Моя LayerCollisionMask
Моя сценаЯ хочу добавить врагов, которые будут следовать за игроком и избегать препятствий. Как я могу это сделать? Используя NavMesh? С моей собственной реализацией алогрифма или с какими-то сторонними библиотеками? Как это реализовать?
Я попробовал использовать встроенный NavMesh с надстройкой NavMeshPlus. Я создал три объекта с NavMeshSurface на каждом, настроил включенные слои и запечил их. Оказалось, что NavMeshSurfaces пересекаются на лестнице. Автоматически противник просто застрял бы на лестнице. Встроенный NavMeshLink не помог (просто не смог установить его ширину). Поэтому я написал свою собственную реализацию NavMeshLink. Но это не особо помогло, потому что противник всё равно предпочитает застрять в стене, чем идти по лестнице
Враг застрял
Мой NavMesh
Мой NavMeshLink:

Код: Выделить всё

public class ElevationEntry : MonoBehaviour
{
[SerializeField] private int newOrderInLayer;
[SerializeField] private int newLayer;
[SerializeField] private GameObject endPos;
private void OnTriggerEnter2D(Collider2D collision)
{
var stalkingMovement = collision.gameObject.GetComponent();
if(stalkingMovement != null) stalkingMovement.SetObjectToGoToPosition(endPos.transform.position);
collision.gameObject.layer = newLayer;
collision.gameObject.GetComponent().sortingOrder = newOrderInLayer;
}
}

Код: Выделить всё

public void SetObjectToGoToPosition(Vector2 pos)
{
_navMeshAgent.enabled = false;
isMovingByAI = false;
moveToPos = pos;
}

Код: Выделить всё

private void MoveToPosition(Vector2 position)
{
var pos = Vector2.MoveTowards(transform.position, position, speed * Time.fixedDeltaTime);
_rigidbody2D.MovePosition(pos);
if(Vector2.Distance(transform.position, position) < 0.01)
{
_navMeshAgent.enabled = true;
isMovingByAI = true;
}
}
Я попробовал использовать Проект A* Pathfinding. Я создал 3 сетчатых графика и настроил их по слоям. Враг не хотел просто перемещаться между графиками. Встроенные Линк и Линк2 не помогли. Я не писал свою реализацию Link, но думаю, что ситуация будет аналогична NavMesh

Подробнее здесь: https://stackoverflow.com/questions/790 ... unity-game
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как сделать объезд препятствий в 2.5d игре Unity?
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Unity 2D следует за противником позади игрока, избегая препятствий
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как сделать скорость создания препятствий пропорциональной скорости их движения?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как сделать скорость создания препятствий пропорциональной скорости их движения?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как найти путь от источника к цели, избегая препятствий
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»