Предотвращение препятствий в единстве, использование raycasts. C #

Ruben спросил: 28 апреля 2018 в 08:41 в: c#

Я использую некоторый рудиментарный алгоритм избежания препятствий, чтобы избежать препятствий, однако у меня возникают проблемы с правыми и левыми датчиками. Когда оба они активны. они отменяют свои вращения и вообще не вращаются. Также с небольшими трудностями выясняется, что hit.normals через передний датчик.

    ray = new Ray(transform.position + Vector3.up, transform.forward);
    Vector3 posInicial = transform.position;    if (Physics.Raycast(ray, out hit, 55f)) // Front sensor
    {
        if (hit.collider.tag == ("Pick Up")) // If robot detects pick up, it goes towards it
        {
            Debug.DrawLine(ray.origin, hit.point, Color.red);
            transform.position = Vector3.MoveTowards(transform.position, hit.point, Time.deltaTime * speed);
        }
        else
        {
            transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate if front sensor doesn't detect pick up
            Debug.DrawLine(ray.origin, hit.point, Color.blue);
        }
    }
    else
    {
        transform.position += transform.forward * speed * Time.deltaTime; // Go forward
        Debug.DrawLine(ray.origin, hit.point, Color.white);
    }
    if (Physics.Raycast(posInicial, Quaternion.AngleAxis(45f, transform.up) * transform.forward, out hit2, 20f))
    {
        transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate left if right detected
        Debug.DrawLine(posInicial, hit2.point, Color.yellow);
    }
    if (Physics.Raycast(posInicial, Quaternion.AngleAxis(-45f, transform.up) * transform.forward, out hit3, 20f))
    {
        transform.Rotate(0, 80 * Time.deltaTime, 0); // rotate right if detected left
        Debug.DrawLine(posInicial, hit3.point, Color.cyan);
    }
}

1 ответ

Есть решение
Ignacio Alorre ответил: 28 апреля 2018 в 09:57

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

Но на всякий случай уже есть что-то, называемое NavMesh в Unity, которое в основном предоставляют ИИ игрокам, например врагам, которые заставляют их идентифицировать препятствия, чтобы избежать их при переходе от одной точки к другой в сцене.

  • Выберите геометрию сцены, которая должна повлиять на навигацию - покрывалами и препятствиями.
  • Проверяйте навигацию Static на включение выбранных объектов в процесс выпечки NavMesh.
  • Отрегулируйте параметры выпекания в соответствии с размером вашего агента.
  • Нажмите кнопку печенья, чтобы построить NavMesh

После того, как вы выпекли сцену, вы можете добавить navmesh в игровой объект:

public class EnemyMovement : MonoBehaviour
{
    NavMeshAgent nav;     function Awake ()
    {
        nav = GetComponent(NavMeshAgent);
    }    //So here it will be chasing the player
    function Update ()
    {
        nav.SetDestination (player.position);
    }
}

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

Ruben ответил: 28 апреля 2018 в 10:20
Попытка избежать Navmesh atm, так как я хочу, чтобы ИИ сканировал область. Тем не менее, моя предыдущая сборка игры использовала Navmesh, спасибо.