カテゴリー:U3D
波があるだろう王の栄光においては、兵士30秒ごとに、敵がダウンし、プレイヤーや敵の兵士の出現後にゲームを破壊され、兵士が何度も作成され、それはまた、ゲーム内で破壊されますこの頻繁に作成および破棄オブジェクトのゲームは、損失の性能です。ゲーム開発プロセスでは、我々はオブジェクトを作成し、頻繁にオブジェクトを破壊し、ゲームのパフォーマンスを改善するために、我々は考えるようにオブジェクトプーリングを使用します。
シューティングゲーム2.頻繁に作成し、オブジェクトプールを使用して考えることができ弾丸を、破壊します。
オブジェクトプールは何ですか?
プールは、プールを考え、プールは水のコレクションです。そのため、オブジェクトプールは、オブジェクトのコレクションである、我々は、オブジェクトプールを理解するために最初のアイデアに従うことができます。オブジェクトが破壊され、その後、オブジェクトを非表示にするときにオブジェクトがプールに再び、我々はゲームオブジェクトを作成するとき、私たちはプールからオブジェクトを取り、目に見える(Obj.seAactive(真))に設定されている、単語の原則をされる使用(OBJの.setActive(偽))は、次のオブジェクトに必要な時間は、プールから採取されます。
そして、実現は見に来ました。
まず、私たちの単一画面の任意の少し、そしてあなたは、弾丸(ボール)、および弾丸のストレージ・プール・ターゲットの使用を起動することができ、パフォーマンスを最適化する目標を達成するために効果が達成されるということです。
まず、モノラルから継承し、Singletonパターンを使用して実装されていないスクリプトを作成します。
使用にSystem.Collectionsを。 使用してSystem.Collections.Genericを。 使用してUnityEngineを。 パブリック クラスGameObjectManage { プライベートリスト<ゲームオブジェクト> gameobjectlist。 // 保存对象的集合 // 不再累述单例模式 プライベートGameObjectManage() { gameobjectlist = 新しいリスト<ゲームオブジェクト> (); } プライベート 静的 GameObjectManageインスタンス。 公共の 静的GameObjectManageでGetInstance { 取得 { 場合(例えば==NULL ) { インスタンス = 新しい新しいGameObjectManage(); } 戻りインスタンス; } } // メソッド弾丸作成 公開ゲームオブジェクトInstance_obj(ゲームオブジェクトのOBJ) { ゲームオブジェクト結果、 IF(gameobjectlist.Count> 0) // セットが空でない場合、コレクションからオブジェクトを削除 { 結果 = gameobjectlist [ 0 ]; // 設定された第1のオブジェクト取得 (result.SetActive trueにする); // と表示 gameobjectlist.Remove(結果); // オブジェクトをコレクションからオブジェクト除去されている } 他 // セットが空である、オブジェクトを直接作成与えるプールから取り出すことができない { 結果 = MonoBehaviour.Instantiate(OBJ); } リターン結果; } // 方法破壊弾丸(実際に隠された弾丸) 公共 ボイドDestroryObj(ゲームオブジェクトのOBJ) { obj.transform.position = 新しい新規のVector3(0、0、0); // 弾丸のこのゼロ位置 OBJ .SetActive(偽); //そして設定が表示されていない gameobjectlist.Add(OBJ); //は、標的細胞に添加し、オブジェクトは次のバックアップを作成する場合 } }
そして、弾丸の作成を達成するためのスクリプトを作成し、スクリプトの上にカメラをマウント
使用にSystem.Collectionsを。 使用してSystem.Collections.Genericを。 使用してSystem.Threadingを。 使用してUnityEngineを。 パブリック クラス制御:MonoBehaviour { 公共のゲームオブジェクトOBJ。 プライベートレイ_ray。 // 射线 ボイド更新() { 場合(Input.GetMouseButtonDown(0 )) { _ray = Camera.main.ScreenPointToRay(Input.mousePosition)。// 发射射线 ゲームオブジェクトギガバイト= GameObjectManage.GetInstance.Instance_obj(OBJ)。 obj.transform.position = transform.position。 gb.GetComponent。<剛体>()速度= _ray.direction * 100 。 } } }
非表示にするには2秒後に弾丸を達成できるようにするために、我々はまた、箇条書きのプリフォームをマウントするスクリプトを作成する必要があり、はい、私たちは、剛性のプリフォームに追加する必要があります。
使用してシステムを。 使用にSystem.Collectionsを。 使用してSystem.Collections.Genericを。 使用してUnityEngineを。 パブリック クラスcube_contro:MonoBehaviour { プライベート 無効 OnEnable() // 不可换成スタート哦 { StartCoroutine(WaitDestrory()); } のIEnumerator WaitDestrory() // 协程实现2秒钟后隐藏 { 収率 戻り 新しいWaitForSeconds(2F)。 GameObjectManage.GetInstance.DestroryObj(ゲームオブジェクト)。 } }
これらのスクリプトでは、非常に単純なわずかオブジェクトプーリング効果によって発射弾丸を達成し、非常に使用することができます。
より多くの思考、類推することにより、今あなた自身のゲームのためのオブジェクトプールのアイデア!