0

私の長い質問で怖がらないでください、私はちょうどそれを奇妙な笑に語ったと確信しています。 UnityでObject Poolingを使用するためのMike Geigの優れたチュートリアルをたどりました。私はこのコンセプトをかなりよく理解しています。私はちょうど私に約1週間の大きな頭痛をされている何かに質問があります。この障害物は、南壁(「SouthWall」とタグ付けされています)と衝突するときに、オブジェクトプーラーに戻されますか?私は絵と私のスクリプトを持っている:altテキスト境界に衝突したときにオブジェクトプーラーに戻るように障害をコードする方法

(次のスクリプトは、私は、オブジェクトプーリングチュートリアルからちょうど少しビットを変更している私のジェネリックプーラースクリプトです)

 using UnityEngine; 
    using System.Collections; 
    using System.Collections.Generic; 

    public class PoolerTestScript : MonoBehaviour 
    { 
     public static PoolerTestScript current; 
     public GameObject spikeWall; 
     public int wallPooledAmount = 20; 
     public bool willGrow = true; // This will be false in the inspector and the game, but here I will keep it true so I dont mess anything up. 

     private List<GameObject> wallPooledObjects; 

     void Awake() 
     { 
      current = this; 
     } 

     void Start() 
     { 
      wallPooledObjects = new List<GameObject>(); 
      for(int i = 0; i < wallPooledAmount; i++) 
      { 
       GameObject obj = (GameObject)Instantiate(spikeWall); 
       obj.SetActive(false); 
       wallPooledObjects.Add(obj); 
      } 
     } 

     public GameObject GetPooledObject() 
     { 
      for(int i = 0; i< wallPooledObjects.Count; i++) 
      { 
       if(!wallPooledObjects[i].activeInHierarchy) 
       { 
        return wallPooledObjects[i]; 
       } 
      } 

       if (willGrow) 
      { 
       GameObject obj = (GameObject)Instantiate(spikeWall); 
       wallPooledObjects.Add(obj); 
       return obj; 
      } 

      return null; 

     } 

    } 

(以下のスクリプトは生成します何ですか障害物、私はスペースシューターチュートリアルからそれを持って、いくつかのそれを変更!)

using UnityEngine; 
using System.Collections; 

[System.Serializable] 

public class Obstacle2 // Spike Wall Obstacle 
{ 
    public GameObject wall; // The second obstacle gameobject. This is attached in the inspector. 
    public Vector3 spawnWPosValues; // Position where the second obstacle will be spawned at on the X,Y,Z plane. 
    public int wCount; // This is the count of the second obstacle in a given wave. 
    public float wSpawnWait; // Time in seconds between next wave of obstacle 2. 
    public float wStartGameWait; // Time in seconds between when the game starts and when the second obstacle start spawning. 
    public float wWaveSpawnWait; // Time in seconds between waves when the next wave of obstacle 2 will spawn. 
} 

public class SpawnWalls : MonoBehaviour { 

    public Obstacle2 obstacle2; 

    void Start() { 

     StartCoroutine (SpawnWall()); 
     //InvokeRepeating ("Spawn", 1, 1); 

     //Get reference to rigidbody, and set the speed 
    } 


    IEnumerator SpawnWall() { 

     yield return new WaitForSeconds(obstacle2.wStartGameWait); 
     while (true) 
     { 

      for (int i = 0; i < obstacle2.wCount; i++) { 

       Vector3 spawnPosition_2 = new Vector3 (Random.Range(-obstacle2.spawnWPosValues.x, obstacle2.spawnWPosValues.x), 
                 obstacle2.spawnWPosValues.y, 
                 obstacle2.spawnWPosValues.z); 
       Quaternion spawnRotation_2 = Quaternion.Euler(0,270,0); // was 90, 0, 90 
       Instantiate (obstacle2.wall, spawnPosition_2, spawnRotation_2); 
       yield return new WaitForSeconds(obstacle2.wSpawnWait); 
      } 
      yield return new WaitForSeconds (obstacle2.wWaveSpawnWait); 
     } 
    } 
} 

(次のスクリプトは、障害物を移動何ですか)

using UnityEngine; 
using System.Collections; 

public class WallObstacleMover : MonoBehaviour { 

    private Rigidbody rb;  //Reference to Rigidbody Component 

    public float speed;  //Speed, updated through script 
    public float acceleration; //Every second, the speed will increase by this much 

    //Executes once, when object is spawned/scene loaded 
    void Start() { 
     //Get reference to rigidbody, and set the speed 
     rb = GetComponent<Rigidbody>(); 
     rb.velocity = -transform.right * speed; 

} 
    //Executes every frame 
    void Update() { 
     //Add acceleration to speed, make sure it's not above topSpeed) 
     speed += Time.deltaTime * acceleration; 
     //Set object velocity 
     rb.velocity = -transform.right * speed; 

    } 
} 
+0

私はあなたの質問がhttp://codereview.stackexchange.com/で注目されると思います –

答えて

0

障害をインスタンス化するためにプーラーを使用しないでください。コルーチンでインスタンス化するだけです。 PoolerTestScriptのGetPooledObject()を使用して障害物をプールする必要があります。 次に、ゲームオブジェクトを破壊する代わりに、作成する必要のあるGoBackToPool()メソッドを呼び出します(プールされたオブジェクトには、それが属するプールを見つける方法が必要です)ので、参照を保持するか、静的アクセスを提供する - 代理人は別のオプションになります)

関連する問題