Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无极流道无限轨迹生成-Unity3D C#_Unity3d - Fatal编程技术网

无极流道无限轨迹生成-Unity3D C#

无极流道无限轨迹生成-Unity3D C#,unity3d,Unity3d,我是unity的新手,我正在创建我的第一个无止境跑步者游戏。我目前有一个立方体作为玩家,另一个立方体(预制)作为轨道。我创建了一个脚本,目的是在运行时实例化预置,并将轨迹移向播放器(而不是移动播放器)。出于某种原因,运行时实例化的轨迹是在同一位置生成的,并且似乎没有向播放器移动。谁能告诉我我做得对吗?如何生成无限/无限轨迹?提前谢谢 public GameObject[] trackPieces; public float trackLength; public float trackSpeed

我是unity的新手,我正在创建我的第一个无止境跑步者游戏。我目前有一个立方体作为玩家,另一个立方体(预制)作为轨道。我创建了一个脚本,目的是在运行时实例化预置,并将轨迹移向播放器(而不是移动播放器)。出于某种原因,运行时实例化的轨迹是在同一位置生成的,并且似乎没有向播放器移动。谁能告诉我我做得对吗?如何生成无限/无限轨迹?提前谢谢

public GameObject[] trackPieces;
public float trackLength;
public float trackSpeed;

private GameObject trackObject;

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

private void GenerateInfiniteTrack()
{
        trackObject = InstantiatePrefab();
        trackObject.transform.Translate(-Vector3.forward * Time.deltaTime * trackSpeed);
}

private GameObject InstantiatePrefab()
{
    return Instantiate(trackPieces[Random.Range(0, trackPieces.Length)]) as GameObject;
}
trackObject每一帧都会被覆盖 您的轨迹没有移动,因为移动轨迹的调用在实例化时只发生一次,而不再发生。每次更新()都会覆盖要移动的轨迹的值。发生的情况如下:

您致电的每次更新:

private void GenerateInfiniteTrack()
调用此方法时,实例化一个新的预置(对象的新实例),并告诉对象通过

trackObject.transform.Translate(-Vector3.forward * Time.deltaTime * trackSpeed);
下次调用该方法时,由于正在创建另一个引用以替换trackObject中保留的值而丢失对原始对象的引用。因此,先前生成的对象将不再移动。新对象移动一次,然后丢失,再重复

下面我建议了一些可能有效的代码。您仍然需要决定如何处置轨迹对象,因为您正在以非常快的速度创建它们。如果您能想到一种使用InvokeRepeating()解决此问题的方法,那么这将是最干净的方法。Invoke repeating有一些限制,比如不能将参数传递给repeating函数,所以我没有在这里使用它,但可以想象它是一种替代方法

这是我的例子

var TrackObjects = new List<GameObject>();

private void MoveInfiniteTrack() 
{
    foreach(GameObject gO in TrackObjects )
    {
         gO.transform.Translate(-Vector3.forward * Time.deltaTime * trackSpeed); 
    }
}

private void GenerateInfiniteTrack()
{
        TrackObject = InstantiatePrefab();
        TrackObjects.Add(TrackObject);
}

void Update ()
{
    GenerateInfiniteTrack();
    MoveInfiniteTrack() 
}

void Foo()
{
    // Delete your track on some kind schedule or you will quickly get infinite objects and massive lag.
}

B.创建一个大圆柱体并将其旋转以用作轨道。

非常感谢。。你的回答帮助我朝着正确的方向前进。非常感谢。我很高兴能帮上忙!
var lastchecked= datetime.now 

Update()
{
    if((datetime.now - lastchecked).seconds > 1)
    {
        // put here what you will do every 1 second.
        lastchecked= datetime.now 
    }
}