在脚本顶部:

public Transform traveller;
public GameObject[] waypoints;
public Transform nextWaypoint;
public bool reverse = false;
private int targetsIndex = 0;


在开始时:

void Start()
    {
        waypoints = GameObject.FindGameObjectsWithTag("Waypoint").OrderBy(go => go.name).ToArray();
        targetsIndex = 0;
   }


在更新中:

void Update()
    {
        WayPointsAI();
    }


然后,WayPointsAI:

private void WayPointsAI()
    {
        if (targetsIndex == waypoints.Length)
            targetsIndex = 0;

        nextWaypoint = waypoints[targetsIndex].transform;
        float distance = Vector3.Distance(traveller.transform.position, nextWaypoint.transform.position);
        traveller.transform.rotation = Quaternion.Slerp(traveller.transform.rotation, Quaternion.LookRotation(nextWaypoint.position - traveller.transform.position), rotationSpeed * Time.deltaTime);

        if (reverse == true)
        {
            var targetAngles = traveller.transform.eulerAngles + 180f * Vector3.up;
            traveller.transform.eulerAngles = Vector3.Lerp(traveller.transform.eulerAngles, targetAngles, rotationSpeed * Time.deltaTime);
            var lastWaypoint = waypoints[currentIndex];

        }

        if (distance < distancetoRotate)
        {
            traveller.transform.position += traveller.transform.forward * slowDownSpeed * Time.deltaTime;
        }
        else
        {
            traveller.transform.position += traveller.transform.forward * moveSpeed * Time.deltaTime;
        }
        if (distance < nextWaypoint.transform.localScale.magnitude)
        {
            rotateNumber = true;
            currentIndex = targetsIndex;

            if (random == false)
            {
                targetsIndex++;
            }
            else
            {
                targetsIndex = UnityEngine.Random.Range(0, waypoints.Length);
            }
        }
    }


而相关的部分则相反:

if (reverse == true)
        {
            var targetAngles = traveller.transform.eulerAngles + 180f * Vector3.up;
            traveller.transform.eulerAngles = Vector3.Lerp(traveller.transform.eulerAngles, targetAngles, rotationSpeed * Time.deltaTime);
            var lastWaypoint = waypoints[currentIndex];

        }


当我选中反面的复选框时,它将进入此部分。

现在,例如,假设对象访问的最后一个航路点是航路点1(currentIndex = 1)

现在,该对象使您向另一方向旋转180度,现在我希望他继续向另一方向移动,但在航路点之间只是相反的方向。

问题是如何更改航点数组的顺序。例如,如果最后一个路标访问的对象是1,那么他掉头应返回1,然后返回0,然后返回4 3 2 1 0,依此类推。

因此,在任何地方我都选中反面的复选框,它应该更改Waypoints数组的顺序。这是我不知道怎么做。
它应该在该行之后的相反部分:

var lastWaypoint = waypoints[currentIndex];

最佳答案

我认为通过更合理地划分任务可能会更好。

创建一个作为目标航路点的字段

我建议创建一个“ headtowaypoint”功能,该功能仅向目标航路点进发。

然后,使用另一个函数处理航路点发生的情况,这将称为函数setnextwaypoint,

然后还有另一个函数“ reverse”,它设置一个指向最后一个航路点的布尔值,并告诉setnextwaypoint您将转到上一个航路点,并告诉headtowaypoint现在正在下降而不是在列表上方。

关于c# - 如何根据面向旋转的对象更改数组中航路点的顺序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47398114/

10-11 18:16