我怎样才能为每个路点制作路点数组而不是许多函数?

How can i make array of way points instead many functions for each way point?

第一个原始代码是使用 enumswitchcasestate 的 4 个路标,每个路标都有自己的功能。这工作正常。但是现在我添加了一个变量名wayPoints数组GameObject.

相反,我想为每个路径点添加一个新函数,使其成为一个函数。例如,假设我有 30 个立方体,我将它们添加到 wayPoints 数组,现在我希望角色以 waypoints 的形式在 30 个立方体之间行走。所以我添加了一个新的 State 并命名为 WayPoints。我还添加了一个新函数并将其命名为 WayPoints()

现在我不确定如何从这里继续。我仍然想将 enum 想法与 wayPoints 数组一起使用,但不确定我添加的案例是否正确以及如何在 WayPoints() 函数中执行此操作。

using UnityEngine;
using System.Collections;

public class MoveObject : MonoBehaviour {

    public GameObject[] wayPoints;
    public Transform target;
    float moveSpeed = 3f;
    float rotationSpeed = 3f;
    Transform myTransform;
    State state;
    public enum State
    {
        Idle,
        Way1,
        Way2,
        Way3,
        Way4,
        WayPoints
    }
    void Awake()
    {
        myTransform = transform;
    }
    // Use this for initialization
    void Start()
    {
        Debug.Log("Scripts Strart");
        state = State.Idle;
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Update");
        switch (state)
        {
            case State.Idle:
                Idle();
                break;
            case State.WayPoints:
                WayPoints();
                break;
            case State.Way1:
                waypoint1();
                break;
            case State.Way2:
                waypoint2();
                break;
            case State.Way3:
                waypoint3();
                break;
            case State.Way4:
                waypoint4();
                break;
        }
    }
    public void Idle()
    {
        state = State.Way1;
    }

    void WayPoints()
    {
        for(int i = 0; i < wayPoints.Length; i++)
        {
            wayPoints[i].name = "wayPoint";
            target = GameObject.Find(wayPoints[i].name).transform;
            float distance = Vector3.Distance(myTransform.position, target.transform.position);
            Debug.DrawLine(target.transform.position, myTransform.position, Color.red);
            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 < 2f)
            {

            }
        }
    }

    void waypoint1()
    {
        target = GameObject.Find("W1").transform;
        float distance = Vector3.Distance(myTransform.position, target.transform.position);
        Debug.DrawLine(target.transform.position, myTransform.position, Color.red);
        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 < 2f)
            state = State.Way2;
    }
    void waypoint2()
    {
        target = GameObject.Find("W2").transform;
        float distance = Vector3.Distance(myTransform.position, target.transform.position);
        Debug.DrawLine(target.transform.position, myTransform.position, Color.red);
        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 < 2f)
            state = State.Way3;
    }
    void waypoint3()
    {
        target = GameObject.Find("W3").transform;
        float distance = Vector3.Distance(myTransform.position, target.transform.position);
        Debug.DrawLine(target.transform.position, myTransform.position, Color.red);
        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 < 2f)
            state = State.Way4;
    }
    void waypoint4()
    {
        target = GameObject.Find("W4").transform;
        float distance = Vector3.Distance(myTransform.position, target.transform.position);
        Debug.DrawLine(target.transform.position, myTransform.position, Color.red);
        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 < 2f)
            state = State.Way1;
    }
}

这是一个实施良好的 waypoints 系统,您可能想看看:https://unity3d.com/learn/tutorials/topics/scripting/using-interfaces-make-state-machine-ai

你应该制作一个简单的 public GameObject[] waypoints 并将你想要的 waypoints 拖放到那里并使用索引循环遍历它们。这可以替换第一行代码,因此您可以使用相同的方法。