2016-07-28 86 views
0

我一直在做無盡的亞軍遊戲。我有一套隨機產卵的瓷磚(4個atm)。爲了達到最優化的目的,我決定在遊戲對象運行後儘可能實例化並銷燬遊戲對象,儘管它會禁用遊戲對象,並且一旦需要從停用的圖塊產生瓦片時就會一次。我讓兩個列表處於活動狀態並停用,這將執行上述方案。我設法禁用他們,但我不知道如何將它們添加到禁用列表併產生它們時。需要。我該如何實現它。如何將禁用的遊戲對象從一個列表移動到另一個列表?

下面是代碼和我到目前爲止所做的。

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

一個幫助將不勝感激。

回答

1

相反停用,然後重新激活您的瓷磚,在需要的時候,這樣你可以只從後向前移動:

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

     | 
     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到完全填充屏幕像素塊的數量。

現在你的遊戲應該繼續產生新的拼貼,直到有足夠的空間,這樣如果你改變了最後的或第一個拼貼,它將不會顯示在屏幕上。然後,一旦達到這個數量,遊戲應該拿走最後一個瓷磚(不在屏幕上)並將其移動到前面(這也不應該在屏幕上)。然後你的角色會再次遇到這塊瓷磚,而另一塊離屏瓷磚會移動到前面,依此類推。理想情況下,它看起來像一個字符是無限的路徑上

+0

那麼通過將NumberOfTilesThatFitOnScreen設置爲填充屏幕的圖塊數量意味着什麼? –

+0

類似於'NumberOfTilesThatFitOnScreen =(safeZone/tileLength)'。如果看到圖塊消失/重新出現(當移到前面時),然後增加它。 – Doc

+0

感謝您對此的幫助。非常感謝。 :) –

1

單從活動列表移動平鋪到停用列表,像這樣:

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

當從列表中刪除一個對象,該對象如果它被另一個變量引用則不會被銷燬。

相關問題