2016-07-28 11 views
0

私は無限のランナーゲームを作っています。私は無作為に産卵するタイル(4気圧)のセットを持っています。私は、最適化のために、プレイヤーが無効にしてもゲームオブジェクトをインスタンス化して破棄するのではなく、無効化されたタイルからタイルを生成する必要があるときに決定しました。上記のシナリオを実行する2つのリストをアクティブにし、非アクティブ化しました。私はそれらを無効にすることができましたが、私はそれらを無効リストに追加して、いつそれらをスポーンするかわかりません。必要です。どうすれば達成できるのですか?無効なgameObjectをリストから別のリストに移動するには?

これはコードとこれまでのことです。

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 

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

を(最初の写真が古い状態であり、かつ2番目は後の状態です)。代わりに

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

ような何かをして、そのように、これらの2つのメソッドを実装します。

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

リストからオブジェクトを削除し、オブジェクト:理想的には、文字が無限パス上にあるように

+0

それで、 'NumberOfTilesThatFitOnScreen'を画面いっぱいのタイルの数に設定するとどういう意味ですか? –

+0

'NumberOfTilesThatFitOnScreen =(safeZone/tileLength)'のようなものです。タイルが消えた/再表示されるのを見たら(前面に移動したとき)、タイルを大きくします。 – Doc

+0

助けてくれてありがとう。本当に感謝。 :) –

1

はちょうどこのように、非アクティブ化リストにアクティブリストからタイルを移動になります別の変数によって参照されている場合は破棄されません。

関連する問題