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 );
}