Unity3d 我如何实例化一个对象并向后移动(无尽的 运行 游戏)

Unity3d how can i instantiating an object and giving movement in a back direction(endles running game)

我想做的是向前实例化 7 个瓦片地图,我的玩家不应该移动,瓦片应该向后移动。我该怎么做任何建议? 我试着给这样的力:go.GetComponent<Rigidbody>().AddForce(0, 0, -speed, ForceMode.Impulse);go.transform.position += new Vector3(0, 0, speed * Time.deltaTime); 但没有用。我想我需要尝试一些不同的实例化,但我无法弄清楚,有人可以给我一个建议吗? 我的代码:

private void Update()
    {
        if ((spawnZ - amnTilesOnScreen * tileLength) < playerTransform.position.z - safeZone)
        {
            
            SpawnTile();
            DeleteTile();
        }
        
    }
    private void SpawnTile(int prefabIndex = -1)
    {
        GameObject go;
        if (prefabIndex == -1)
        {
            go = Instantiate(tilePrefabs[RandomPrefabIndex()], Vector3.forward * spawnZ,Quaternion.identity) as GameObject;
            
        }
        else
        {
            go = Instantiate(tilePrefabs[prefabIndex], Vector3.forward * spawnZ, Quaternion.identity) as GameObject;
        }
        
        go.transform.SetParent(transform); 
        go.transform.position = Vector3.forward * spawnZ;
        //go.transform.position += new Vector3(0, 0, speed * Time.deltaTime);


        spawnZ += tileLength; 
        //go.GetComponent<Rigidbody>().AddForce(0, 0, -speed, ForceMode.Impulse);
        activeTiles.Add(go);
    }
    private void DeleteTile()
    {
        Destroy(activeTiles[0]);
        activeTiles.RemoveAt(0);
    }

你走在正确的轨道上,只有一个障碍阻止你得到你想要的东西:

您将需要调用您的移动

go.transform.position += new Vector3(0, 0, speed * Time.deltaTime);

每个块对象的每次更新。就目前而言,您只会在 spawn 方法期间调用一次移动。似乎您已经有了要移动的图块列表,里面

activeTiles

因此,根据这个活动图块列表,您的更新方法可能类似于:

private void Update()
{
    // First move all the active tiles
    foreach (var tileObj in activeTiles) {
        tileObj.transform.position += new Vector3(0, 0, speed * Time.deltaTime);
    }

    // The, do any spawn or destroy operations on them if needed.
    if ((spawnZ - amnTilesOnScreen * tileLength) < playerTransform.position.z - safeZone)
    {
            
        SpawnTile();
        DeleteTile();
    }
        
}

你可能不需要物理运动,除非你有理由说明瓷砖的“力”比它们的运动更重要。一般而言,直接移动对象效率更高,而物理运动更适用于创建不同对象之间的碰撞效果。在这种情况下,由于道路无论如何都会移动,所以直接像上面那样移动它们可能是你最好的选择。

还记得在销毁道路对象时将它们从活动列表中删除,否则当您尝试 运行 更新不再存在的对象时,您将得到 NullReferenceException。