如何将禁用的游戏对象从一个列表移动到另一个列表?

How to Move disabled gameObjects from one list to another?

我一直在制作一个无穷无尽的 运行ner 游戏。我有一组随机生成的瓷砖(4 个大气压)。出于优化目的,我决定不在玩家 运行 时实例化和销毁游戏对象,尽管它确实禁用了它们,并且在需要从停用的图块中生成图块时。我制作了两个列表 active 和 deactivate 这将执行上述场景。我设法禁用了它们,但我不知道如何将它们添加到禁用列表并在何时生成它们。需要。我怎样才能实现它。

这是代码和我到目前为止所做的。

TileManager.cs

void Update () 
    {

            //Vector3 offset = new Vector3(0f, 0f, Time.time * speed);
        //GameObject go;
        //go.transform.SetParent(transform);
            if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength))
            {
                SpawnTile();
                DeleteTile();
            }

    }

    private void DeleteTile()
    {
        //Destroy(activeTiles[0]);
        activeTiles[0].SetActive(false);
        activeTiles.RemoveAt(0);
        //deactivatedTiles.RemoveAt(0);
    }

    private void SpawnTile(int prefabIndex = -1)
    {
        GameObject go;
        if (prefabIndex == -1)
        {
            go = Instantiate(tilePrefabs[RandomPrefabIndex()]) as GameObject;
        }
        else
        {
            go = Instantiate(tilePrefabs[prefabIndex]) as GameObject;
        }

        go.transform.SetParent(transform);
        go.transform.position = Vector3.forward * spawnZ;
        spawnZ += tileLength;
        activeTiles.Add(go);
        //go.SetActive(false);

        //if (deactivatedTiles != null)
        //{
        //    Debug.Log("Has a Tile");
        //    deactivatedTiles[0].SetActive(true);
        //}

        //Debug.Log(deactivatedTiles);
    }

非常感谢您的帮助。

您可以在需要时将它们从后面移到前面,而不是停用然后重新激活您的磁贴,如下所示:

|---|---|---|---|
|---|---|---|---|

        |
        V

    |---|---|---|---|
    |---|---|---|---|

(第一张图是旧状态,第二张图是之后的状态)。而不是

if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength)) {
    SpawnTile();
    DeleteTile();
}

做类似的事情

if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength)) {
    if (activeTiles.Count() < (NumberOfTilesThatFitOnScreen + 1)) {
        var spawnedTile = SpawnTileAtFront();

        activeTiles.Add(spawnedTile);
    } else {
        var movedTile = activeTiles[0];
        MoveTileToFront(movedTile);

        //Puts the moved tile at the end of the array, so the next tile that will be moved is always the one in back
        activeTiles.RemoveAt(0);
        activeTiles.Add(movedTile);
    }
}

然后像这样实现这两个方法:

private void MoveTileToFront(GameObject tile)
{
    tile.transform.position = Vector3.forward * spawnZ;
    spawnZ += tileLength;
}

private GameObject SpawnTileAtFront(int prefabIndex = -1)
{
    GameObject go;
    if (prefabIndex == -1)
    {
        go = Instantiate(tilePrefabs[RandomPrefabIndex()]) as GameObject;
    }
    else
    {
        go = Instantiate(tilePrefabs[prefabIndex]) as GameObject;
    }

    go.transform.SetParent(transform);
    MoveTileToFront(go);
    return go;
}

NumberOfTilesThatFitOnScreen 设置为完全填满屏幕的图块数。

现在您的游戏应该不断生成新的方块,直到有足够的方块,这样如果您更改最后一个或第一个方块,它就不会显示在屏幕上。然后,一旦达到这个数量,游戏应该拿走最后一个方块(不在屏幕上)并将其移到前面(也不应该在屏幕上)。然后你的角色会再次遇到这个方块,另一个屏幕外的方块会被移到前面,依此类推。理想情况下,角色看起来像是在无限的路径上

只需将磁贴从活动列表移动到停用列表,如下所示:

private void DisposeActiveTile(int index)
{
    GameObject unused_tile = activeTiles[index];
    activeTiles.RemoveAt(index);
    deactivatedTiles.Add(unused_tile);
}

private GameObject GetLastUnusedTile()
{
    if(deactivatedTiles.Count == 0)
        return null;
    int last_index = deactivatedTiles.Count - 1;
    GameObject unused_tile = deactivatedTiles[last_index];
    deactivatedTile.RemoveAt(last_index);
    return unused_tile;
}

从列表中删除对象时,如果对象被另一个变量引用,则该对象不会被销毁。