2016-05-25 15 views
1

オブジェクトプーリングを理解しようとしています。私はスクリプトを一度に1つのオブジェクトを取得することができますが、同時に3つ以上をリストから引き出すことができる必要があります。プールされたリストの2つのオブジェクトを1つのスクリプトで使用する方法はありますか。

私のオブジェクトプーリングスクリプトは大きいので、必要でない限り、すべてを共有したくはありません。

私は炎の卵の場所を変更できるようにする必要があるので、私はそれを行うためのスクリプトを作成しました:

private void CreateWavesForFlames(GameObject flame, float xBase, float xDisplacement, float dropHeight) 
{ 
    flame.transform.position = new Vector3(xBase + xDisplacement, dropHeight, 0); 
    flame.SetActive(true); //this turn the pooled object on 
} 

は、だから私は、同時に3つの炎を起動し、変更する必要があり、その産卵場所

波コールは次のようになります:何が起こることは一つだけ火炎が作成されている、それが最後のCreatWavesForFlamesを使用しています

void Wave1() { 
    Debug.Log("Wave1"); 
    tempGOHolder = gm.GetLargeFire(); 


    CreateWavesForFlames(tempGOHolder, 0, 0, 12); 
    CreateWavesForFlames(tempGOHolder, 10, 0, 12); 
    CreateWavesForFlames(tempGOHolder, 15, 0, 12); 

} 

。私は3つが違う必要があります。

これを行う方法についてのご意見は素晴らしいと思います。

答えて

1

これはあなたのコードから期待されるものです。

tempGOHolder = gm.GetLargeFire(); 
CreateWavesForFlames(tempGOHolder, 0, 0, 12); 

tempGOHolder = gm.GetLargeFire(); 
CreateWavesForFlames(tempGOHolder, 10, 0, 12); 

tempGOHolder = gm.GetLargeFire(); 
CreateWavesForFlames(tempGOHolder, 15, 0, 12); 
+0

驚くばかりです。そのような簡単な解決策。私は私が繰り返すことができるとは思わなかったが、明らかに私はできる!ありがとうございました。 –

+0

'GetLargeFire()'を拡張して、ゲームオブジェクトの配列を返し、これらの行をn回繰り返す代わりに配列をループすることもできます。 – TheDjentleman

+0

これを理解する必要があります。提案していただきありがとうございます。 –

2

私はこれが回答されている知っているが、私はよりよい解決策があると思います:あなたは3種類の難オブジェクトをしたい場合は、(「GMは」あなたのプールマネージャオブジェクトであると仮定して)これを実行する必要があるとしています。上記の答えは素晴らしいです。 GetLargeFire()関数を繰り返し呼び出さずにコードを短くしたい場合は、以下の方法を使用できます。

GameObject GetLargeFire() 
{ 
    return availableGameObject; 
} 

あなたはそれに渡された配列をいっぱいにGetLargeFire()関数のオーバーロードを作成することができます。

は、あなたのプールのスクリプトであなたのGetLargeFire()関数はこのようになっていることを言うことができます。配列を返すことはお勧めできません。なぜなら、メモリを割り当ててプールスクリプトが役に立たないからです。渡された配列を埋める方が良いです。

public void GetLargeFire(GameObject[] gOBJ, int amountToReturn) 
{ 
    for (int i = 0; i < gOBJ.Length; i++) 
    { 
     if (i < amountToReturn) 
     { 
      gOBJ[i] = GetLargeFire(); 
     } 
     else 
     { 
      //Fill the rest with null to override what was inside of it previously 
      gOBJ[i] = null; 
     } 
    } 
} 

さて、あなたはあなたの質問を持っている例のようにそれを使用するには、配列としてtempGOHolderを宣言し、あなたがそれのために十分だと思う番号を選択する必要があります。この例ではを使用します。

GameObject[] tempGOHolder; 

void Start() 
{ 
    tempGOHolder = new GameObject[3]; 
} 

void Wave1() { 
    Debug.Log("Wave1"); 
    gm.GetLargeFire(tempGOHolder, 3); 
    CreateWavesForFlames(tempGOHolder[0], 0, 0, 12); 
    CreateWavesForFlames(tempGOHolder[1], 10, 0, 12); 
    CreateWavesForFlames(tempGOHolder[2], 15, 0, 12); 
} 

CreateWavesForFlamesのコードを使用してWavesを作成する場合でもループを使用することもできます。