Unity3D - Wheel Collider - Рассчитать на основе скорости против расстояния до цели и поворота? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь придумать рассчитанный способ сравнения текущей скорости с расстоянием до следующей точки маршрута с конечной целью, по которой компьютерный автомобиль принимает решение «выбежать», затормозить или оставить газ включенным. Наилучший путь при повороте Наилучший возможный путь, чтобы он НЕ ПЕРЕКРЫВАЛ путевую точку (как это делает стандартная машина активов Unity при использовании ИИ путевой точки). Однако я чувствую, что есть некоторые вещи, которые я не могу понять. Мне пришлось установить ТОННУ барьеров и что-то, что я называю «PowerZones» (зоны, которые управляют количеством тормозов и крутящего момента двигателя в процентном отношении). Вот мой текущий курс ниже, который, конечно, не завершен в путевых точках, но важно отметить, сколько существует этих зон и препятствий. Я действительно не чувствую, что должно быть так много!

Current course for the car. WAY too many barriers/zones???

Однако причина, по которой у меня так много, в том, что это было довольно сложнодля меня, чтобы придумать идеальную функцию для оптимизации этих видов вождения и рулевого решения в качестве противника. Вот функции Drive и Steer для транспортного средства (некоторые из которых основаны на существующем руководстве Eyemaginary):

   private void Drive()
    {
        float currDistFromWP = Vector3.Distance(transform.position, nodes[currentNode].position);
        float speed = rb.velocity.magnitude;
        float timeFloatLeft = currDistFromWP / speed;
        Vector3 relativeVector = transform.InverseTransformPoint(nodes[currentNode].position);
        float newSteer = (relativeVector.x / relativeVector.magnitude);
        Debug.Log("Steer to set: " + newSteer);
        Debug.Log("Current distance: " + currDistFromWP);
        if ((timeFloatLeft < 1f || Mathf.Abs(newSteer) > .5f) && speed > 5)
        {
            Debug.Log("Coasting...");
            im.throttle = 0;
        }
        else
        {
            im.throttle = 1;
        }
    }

    private void ApplySteer()
    {
        if (avoiding)
            return;
        Vector3 relativeVector = transform.InverseTransformPoint(nodes[currentNode].position);
        float newSteer = (relativeVector.x / relativeVector.magnitude);
        im.steer = newSteer;
    }

Вот моя функция обновления путевой точки:

private void CheckWaypointDistance()
{
    float currDistFromWP = Vector3.Distance(transform.position, nodes[currentNode].position);
    //Debug.Log("Current distance from waypoint: " + currDistFromWP);
    if (currDistFromWP < 1.1f)
    {
        im.brake = false;
        if(currentNode == nodes.Count - 1)
        {
            currentNode = 0;
        }
        else
        {
            currentNode++;
        }
    }
    else if (currDistFromWP < 10f)
    {
        im.brake = true;
    }
}

Я чувствую, чтоЯ мог бы сделать это сложнее, чем нужно. Или, может быть, мне просто нужно рассмотреть больше переменных. У кого-нибудь есть какие-либо советы, чтобы сделать это немного более жестким с точки зрения логики ИИ? Я рад показать больше кода, если это необходимо, но идея состоит в том, чтобы иметь класс Car Controller, который используется ОБА игроком и ИИ для ПРИВОДА автомобиля, а затем ИИ принимает лучшие решения так, как это потребуется игроку. водить его в отдельном классе. Код сверху является отдельным компонентом принятия решений AI.

...