Почему дроид делает безостановочные круги вокруг путевой точки? И как мне исправить такое поведение? - PullRequest
0 голосов
/ 06 мая 2020

В большинстве случаев он нормально перемещается между путевыми точками, но иногда дроид делает круги вокруг путевой точки без остановок. Затем мне нужно остановить игру и запустить ее снова.

Я попытался встать посреди пути дроидов, двигая игрока от первого лица, может это является причиной проблемы?

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

Дроид парит в воздухе. У дроида есть аниматор, коллайдер коробки, жесткое тело:

Droid inspector settings

Это скрипт для путевых точек:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Waypoints : MonoBehaviour
{
    public GameObject objectToMove;
    public GameObject[] waypoints;
    public Transform target;
    public float moveSpeed = 1f;
    public float rotationSpeed = 1f;

    private Transform myTransform;
    private int targetsIndex = 0;
    private Vector3 originalPosition;

    // Use this for initialization
    void Start()
    {
        if (objectToMove == null)
        {
            myTransform = transform;
        }
        else
        {
            myTransform = objectToMove.transform;
        }

        originalPosition = myTransform.position;

        if (waypoints.Length == 0)
        {
            waypoints = GameObject.FindGameObjectsWithTag("Waypoint");
        }
    }

    // Update is called once per frame
    void Update()
    {
        WayPointsAI();
        DrawLinesInScene();
    }

    private void WayPointsAI()
    {
        if (targetsIndex == waypoints.Length)
            targetsIndex = 0;
        target = waypoints[targetsIndex].transform;
        float distance = Vector3.Distance(myTransform.position, target.transform.position);
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);

        //move towards the player
        myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
        if (distance < 0.3f)
            targetsIndex++;
    }

    void DrawLinesInScene()
    {
        // draw lines between each checkpoint //
        for (int i = 0; i < waypoints.Length - 1; i++)
        {
            Debug.DrawLine(waypoints[i].transform.position, waypoints[i + 1].transform.position, Color.blue);
        }

        // draw a line between the original transform start position 
        // and the current transform position //
        Debug.DrawLine(originalPosition, myTransform.position, Color.red);

        // draw a line between current transform position and the next waypoint target
        // each time reached a waypoint.
        if (target != null)
            Debug.DrawLine(target.transform.position, myTransform.position, Color.green);
    }
}

I проверил его снова сейчас, и я обнаружил, что если игрок не стоит посередине пути дроидов, этого не произойдет. но если я стою посреди пути дроида, он пройдет мимо меня, но затем начнет кружить на следующей путевой точке.

1 Ответ

2 голосов
/ 07 мая 2020

Дроид должен находиться в пределах 0,3f от целевой точки маршрута «if (distance <0,3f)», если дрифт не подходит на это расстояние, targetIndex не будет увеличиваться. </p>

Похоже, что комбинация moveSpeed ​​и RotationSpeed ​​слишком велика, чтобы позволить дроиду попасть в пределах 0,3f от цели, поэтому он просто вращается по орбите.

Попробуйте увеличить расстояние 0,3f, и вы должен иметь возможность получить желаемый результат.

Также поможет увеличение скорости вращения и / или уменьшение скорости перемещения.

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