0

Please do not feel intimidated by my long question, I am sure I just worded it weird lol. I followed Mike Geig's excellent tutorial on using Object Pooling in Unity, and I get the concept pretty well. I just have a question on something that has been a major headache for almost a week to me. How do I make this obstacle go back into my Object Pooler when it Collides with the South Wall (which is tagged "SouthWall")? I have a picture and my scripts: alt text

(The Script Below is My Generic Pooler Script which I changed just a tad bit from the Object Pooling Tutorial)

     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;

         }

     }

(The Script Below Is What Spawns the Obstacles, I got it from the Space Shooter Tutorial and changed it up some!)

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

(The Script Below Is What Moves the Obstacles)

 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;

     }
 }
Stephen George
  • 27
  • 1
  • 11

1 Answers1

0

you dont use your pooler to instantiate the obstacle, you simply instantiate it in the coroutine. you need to use GetPooledObject() from PoolerTestScript to have the obstacle pooled. then on collision, instead of destroying the gameobject, you call some GoBackToPool() method you also need to create (and ofc the pooled object needs a way to find the pool it belongs to, so either keep a reference or have some scene management which provides static access - delegates would be another option)

yes
  • 967
  • 7
  • 12