2017-05-16 8 views
0

私は初めてのランナーゲームを持っています。すべてうまく動作します。ですから、この質問は最適化に関するものです。Unityランナーゲームのオブジェクトプーリング実装(再利用)

私のゲームでは、15のプラットフォーム(プレーヤーが走る道路プレハブ)があります。無作為に15個の任意の1がインスタンス化され、これが起こり続ける。プレイヤーがいくつかのプラットフォームを通過すると、左のプラットフォームが破壊されます。私はプラットフォームを追跡し、最後のプラットフォームプレファブ(list [0])を削除するためのリストを作った。そして新しいものが先にインスタンス化されます。

ゲームが近づくにつれて、それは速くなります。つまり、インスタンス化/破棄の操作がより頻繁に行われていることを意味します。

私はオブジェクトプールについて読みました。私はそのコンセプトを理解しており、私は自分のゲームでこれを使うべきだという強い意見を持っています。私はオブジェクトプールを作成します。正常に動作します。今私の問題 -

問題 - 作成したプールからオブジェクトを再利用するにはどうすればよいですか?私のゲームでは、私が思いついたのは、ユーザーが残しているプラ​​ットフォームは、位置を前後に(ユーザーが向いている方向)変えなければならないということです。それをどうすれば実現できますか?

私はこれらのチュートリアルに従っ - https://www.youtube.com/playlist?list=PLLH3mUGkfFCXps_IYvtPcE9vcvqmGMpRK

+0

すべての(オフスクリーンの)プラットフォーム(たとえば 'List')のコンテナを用意して、最初に使用可能なものを選んで位置を変更してください。 – UnholySheep

+0

@UnholySheep - 私のゲームは予測不可能です。プラットフォームを無作為に使いたいということです。 – Vineet

+0

次に、そのコンテナからランダムなプラットフォームを選んでください。それはそれほど多くのコードではありません。 – UnholySheep

答えて

0

プレイヤーは、いくつかのプラットフォームを通過すると、プラットフォームの背後にある左が破壊 を取得します。私はプラットフォームを追跡してそれらを削除するリストを作った 最後のプラットフォームのプレハブ(リスト[0])。そして新しいものが先にインスタンス化されます。

オブジェクトプーリングを行う方法は数多くあります。それらの1つには、オブジェクトをキューに追加し、キューが使用中に削除することが含まれます。それらをリサイクル/破壊したいときは、代わりにリストに追加してください。


は、どのように私は自分の作成したプールからオブジェクトを再利用する必要がありますか?

本当に簡単です。代わりに、このたびを行う:

Instantiate(prefab, postion, Quaternion.identity); 

ゲームがスタート機能に始まり、配列/リストで、その後保管したときに多くの時間がそれを実行してください:あなたはインスタンス化する必要がある

List<GameObject> pool = new List<GameObject>(); 

void Start() 
{ 
    for (int i = 0; i < 50; i++) 
    { 
     GameObject tempObj = Instantiate(prefab, postion, Quaternion.identity) as GameObject; 
     pool.Add(tempObj); 
    } 
} 

ゲームプレイ中にオブジェクト、ちょうど一覧/アレイから1を取得:

//Check if object is available in pool 
if (pool.Count > 0) 
{ 
    //Object is. Return 1 
    GameObject objFromPool = pool[0]; 
    //Enable the Object 
    objFromPool.SetActive(true); 
} 
else 
{ 
    //Object is NOT. Instantiate new one 
    GameObject objFromPool = Instantiate(prefab, postion, Quaternion.identity) as GameObject; 
    //Enable the Object 
    objFromPool.SetActive(true); 
} 

オブジェクトの使用が終了したら。代わりにDestroy(objFromPool);を行うので、多分あなたが望むならば、Listに戻ってそれを追加また、それを無効にするには、そのゲームオブジェクトの位置をリセット:

//Reset Pos 
objFromPool.transform.position = Vector3.zero; 
//Disable? 
objFromPool.SetActive(false); 
//Return back to the array 
pool.Add(objFromPool); 

最後に、これを行うための最善の方法は、すべてのインスタンス化することですオブジェクトを配列またはリストに追加します。増加する整数を使用します。整数は0から始まり、list/array.Length-1に達するまで増分します。その整数をプールからObjectを取得するために使用できます。

ArrayObjectPoolinghereとして実装されたこのメソッドの例と使用方法を確認できます。

+1

ありがとうプログラマー。それは私が必要としたものです! – Vineet

関連する問題