Установите объект в соответствии с препятствием в Unity3d - PullRequest
0 голосов
/ 12 сентября 2018

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

Эти фотографии показывают мое среднее значение:

Изображение 1 - Правильное положение

Изображение 2 - неправильная позиция

и это мой код:

        Vector3 ObjectPos = TakeCoverSign.transform.position;            
        Vector3 ObjectSize = TakeCoverSign.transform.lossyScale;
        Vector3 ObstaclePos = ObstacleList[0].position;
        ObjectPos.z = (ObstaclePos.z + ObstaclePos.z / 2) - (ObjectSize.z + ObjectSize.z / 2) + navAgent.radius;

        TakeCoverSign.transform.position = ObjectPos;

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

@ * 1001 Джаред *

В единстве код должен писать, как показано ниже. но этот код дал мне неправильный результат.

ПРИМЕЧАНИЕ. Моя проблема в том, что этот код не работает для любого размера и положения препятствия. этот код работает точно так же, как мой собственный код.

    Vector3 TempPos = takeCoverSign.transform.position;
    TempPos.z = (obstacleList[0].position.z + obstacleList[0].position.z / 2) - (takeCoverSign.lossyScale.z + takeCoverSign.lossyScale.z / 2);

    if (TempPos.z - obstacleList[0].position.z > 0)
    {
        TempPos.z += -navAgent.radius;
    }
    else
    {
        TempPos.z += navAgent.radius;
    }

    takeCoverSign.transform.position = TempPos;
0 голосов
/ 12 сентября 2018

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

Вотнекоторые наглядные примеры:

Left of cover, plus agent.radius Right of cover, plus agent radius

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

Left and right of cover, with correct radius calculation

Код

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

takeCoverSign.transform.position = (takeCoverSign.transform.position.z + takeCoverSign.transform.position.z / 2) - (takeCoverSign.transform.lossyScale.z + takeCoverSign.transform.lossyScale.z / 2);

if(takeCoverSign.transform.position.z - obstacleList[0].position.z > 0)
{
    takeCoverSign.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z += -navAgent.radius);
}
else
{
    takeCoverSign.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z += navAgent.radius);
}

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

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

РЕДАКТИРОВАТЬ: скорректировал приведенный выше ответ для создания нового вектора 3 для назначения позиции, а не пытаться напрямую изменить возвращаемое значение.

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