C# 为什么物体从不在位置上移动?

C# 为什么物体从不在位置上移动?,c#,unity3d,C#,Unity3d,当我在运行游戏时,需要移动的对象看起来像是在原地摇晃,就像他们试图移动一样,但无法移动,也不是从他们应该的起始位置开始 using System.Collections; using System.Collections.Generic; using UnityEngine; public class GenerateEnemyTracks : MonoBehaviour { public GameObject tracksPrefab; public GameObject c

当我在运行游戏时,需要移动的对象看起来像是在原地摇晃,就像他们试图移动一样,但无法移动,也不是从他们应该的起始位置开始

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

public class GenerateEnemyTracks : MonoBehaviour
{
    public GameObject tracksPrefab;
    public GameObject curvedLinePrefab;
    public GameObject objectToMovePrefab;
    public float speed;
    public DrawRadiusAroundTurret drawRadius;
    public Transform turrent;
    [Range(1, 50)]
    public int numberOfTracks;
    [Range(1, 50)]
    public int numberOfPointsInTrack;

    private GameObject parent;
    private List<Vector3[]> tracksPointsPositions = new List<Vector3[]>();
    private GameObject[] objectsToMove;
    private int index = 0;
    private bool test = false;

    // Start is called before the first frame update
    void Start()
    {
        parent = GameObject.Find("Curved Lines");
        GenerateStartPointsOfTheTracks();
        GeneratePointsInTracks();
        //GetTracksPositions();
        objectsToMove = GameObject.FindGameObjectsWithTag("Object To Move");

    }

    // Update is called once per frame
    void Update()
    {
        if(test == false)
        {
            StartCoroutine(waitsome());
            
        }

        if(test == true)
        {
            if (tracksPointsPositions.Count > 0)
            {
                for (int i = 0; i < tracksPointsPositions.Count; i++)
                {
                    Move(tracksPointsPositions[i], objectsToMove);
                }
            }
        }
    }

    IEnumerator waitsome()
    {
        yield return new WaitForSeconds(5);

        GetTracksPositions();
        test = true;
    }

    private void GenerateStartPointsOfTheTracks()
    {
        for (int i = 0; i < numberOfTracks; i++)
        {
            GameObject linePrefab = Instantiate(curvedLinePrefab);
            linePrefab.name = "Curved Line" + i.ToString();
            linePrefab.tag = "Curved Line";
            GameObject go = Instantiate(tracksPrefab, parent.transform);
            go.name = "Start Point";
            go.tag = "Start Point";

            go.transform.parent = linePrefab.transform;

            // Spawn around the absolute Unity world center (0,0,0) 
            //go.transform.position = new Vector3(Random.Range(-100f, 100f), Random.Range(-100f, 100f), Random.Range(-100f, 100f));

            // Spawn around the parent object and in the space coordinates of the parent (including its rotation and scale)
            //go.transform.localPosition = new Vector3(Random.Range(-25f, 25f), Random.Range(-25f, 25f), Random.Range(-25f, 25f));

            // Spawn them around another object
            if (turrent != null)
            {
                go.transform.position = turrent.position + new Vector3(Random.Range(-100f, 100f), Random.Range(-100f, 100f), Random.Range(-100f, 100f));
                GameObject objectToMove = Instantiate(objectToMovePrefab);
                objectToMove.tag = "Object To Move";
                objectToMove.transform.position = go.transform.position;
            }
        }
    }

    private void GeneratePointsInTracks()
    {
        var startPoints = GameObject.FindGameObjectsWithTag("Start Point");
        var curvedLines = GameObject.FindGameObjectsWithTag("Curved Line");

        for (int i = 0; i < startPoints.Length; i++)
        {
            for (int x = 0; x < numberOfPointsInTrack; x++)
            {
                GameObject go = Instantiate(tracksPrefab, curvedLines[i].transform);
                go.name = "Point In Track";
                go.transform.position = turrent.position + new Vector3(Random.Range(-100f, 100f), Random.Range(-100f, 100f), Random.Range(-100f, 100f));

                if(x == numberOfPointsInTrack - 1)
                {
                    go.name = "Last Point In Track";

                    Vector2 p = Random.insideUnitCircle.normalized * drawRadius.xradius;
                    go.transform.position = drawRadius.transform.position + new Vector3(p.x, 0, p.y);
                }
            }
        }
    }


    // The problem is that it's taking time until it's creating the positions for each curved line
    // Either to wait with startcourtine or to check why it's taking time
    private void GetTracksPositions()
    {
        var curvedLines = GameObject.FindGameObjectsWithTag("Curved Line");
        for(int i = 0; i < curvedLines.Length; i++)
        {
            var positions = new Vector3[curvedLines[i].GetComponent<LineRenderer>().positionCount];
            curvedLines[i].GetComponent<LineRenderer>().GetPositions(positions);
            tracksPointsPositions.Add(positions);
        }
    }

    void Move(Vector3[] positions, GameObject[] objectsToMove)
    {
        for (int i = 0; i < objectsToMove.Length; i++)
        {
            objectsToMove[i].transform.position = Vector3.MoveTowards(objectsToMove[i].transform.position,
                                                    positions[index],
                                                    speed * Time.deltaTime);

            if (objectsToMove[i].transform.position == positions[index])
            {
                index += 1;
            }

            if (index == positions.Length)
                index = 0;
        }
    }
}
行动中:

void Move(List<Vector3[]> positions, GameObject[] objectsToMove)
    {
        for (int i = 0; i < objectsToMove.Length; i++)
        {
            objectsToMove[i].transform.position = Vector3.MoveTowards(objectsToMove[i].transform.position,
                                                    positions[index][index],
                                                    speed * Time.deltaTime);

            if (objectsToMove[i].transform.position == positions[index][index])
            {
                index += 1;
            }

            if (index == positions.Count)
                index = 0;
        }
    }
void Move(列出位置,游戏对象[]objectsToMove)
{
for(int i=0;i

现在,要移动的对象正在移动,但已脱离轨迹,短时间后,它们将移回起始位置。它们从不在轨迹上从开始到结束移动。

因为您在同一帧中迭代所有跟踪位置。 代码的结果应该与最后一个位置上出现的对象类似


if(tracksPointsPositions.Count > 0) {
    for(int i = 0; i < tracksPointsPositions.Count; i++) {
        Move(tracksPointsPositions[i], objectsToMove);
    }
}


如果(trackspointspospositions.Count>0){
对于(int i=0;i
以我为例


    private int trackIndex = 0; //current destination position on track points
    public Vector2[] TracksPointsPositions;

    void Update() {
        Move();
    }

    /// <summary>
    /// Moving between 2 point
    /// </summary>
    private void Move() {

        var ms = 10 * Time.deltaTime;
        var distance = Vector2.Distance(this.transform.position, TracksPointsPositions[trackIndex]);

        if(distance <= 0) {
            trackIndex = (trackIndex + 1) % TracksPointsPositions.Length; //move to next track point when reach current destination
        }

        var origin = this.transform.position;
        var destination = TracksPointsPositions[trackIndex];
        this.transform.position = Vector2.MoveTowards(origin, destination, ms );

    }


私有int trackIndex=0//轨道点上的当前目标位置
公共矢量2[]轨道点位置;
无效更新(){
Move();
}
/// 
///在两点之间移动
/// 
私人空位移动(){
var ms=10*Time.deltaTime;
var distance=Vector2.距离(this.transform.position,trackspointspospositions[trackIndex]);

如果(距离,但是要移动的对象都在这个脚本中,我的意思是我不想将这个脚本添加到每个要移动的对象中,那么我如何才能使所有的对象在移动方法中移动?我认为你应该创建EnemyTrackBehavior来控制敌人的行为,它需要跟踪位置,而不是在生成中建立emyTrackSystem。GenerateEnmyTrackSystem应该“生成”跟踪路线,并将其放入EneyTrackBehavior中,而不是控制它们。

if(tracksPointsPositions.Count > 0) {
    for(int i = 0; i < tracksPointsPositions.Count; i++) {
        Move(tracksPointsPositions[i], objectsToMove);
    }
}


    private int trackIndex = 0; //current destination position on track points
    public Vector2[] TracksPointsPositions;

    void Update() {
        Move();
    }

    /// <summary>
    /// Moving between 2 point
    /// </summary>
    private void Move() {

        var ms = 10 * Time.deltaTime;
        var distance = Vector2.Distance(this.transform.position, TracksPointsPositions[trackIndex]);

        if(distance <= 0) {
            trackIndex = (trackIndex + 1) % TracksPointsPositions.Length; //move to next track point when reach current destination
        }

        var origin = this.transform.position;
        var destination = TracksPointsPositions[trackIndex];
        this.transform.position = Vector2.MoveTowards(origin, destination, ms );

    }