- Home /
Child object instantiating as in active
I am working on an endless game where objects are generated and destroyed just outside the camera frame. I am using a prefab for the obstacles that has two child objects. After 4 instances of the obstacle being created and then destroyed Unity decides to instantiate to obstacle with one child element as inactive although it has been active in all the previous instances. Here is the code I am using: using System.Collections; using System.Collections.Generic; using UnityEngine;
public class PlatformGenerator : MonoBehaviour {
public GameObject platform;
public Transform generationPoint;
public float distanceBetween;
public float distaceBetweenMin;
public float distaceBetweenMax;
public ObjectPooler[] theObjectPools;
private int platformSelector;
private float[] platformWidths;
// Use this for initialization
void Start () {
//platformWidth = platform.GetComponent<BoxCollider2D> ().size.x;
platformWidths = new float[theObjectPools.Length];
for (int i = 0; i < theObjectPools.Length; i++) {
platformWidths[i] = theObjectPools[i].pooledObject.GetComponent<BoxCollider2D> ().size.x;
}
}
// Update is called once per frame
void Update () {
if (transform.position.x < generationPoint.position.x) {
distanceBetween = Random.Range (distaceBetweenMin, distaceBetweenMax);
platformSelector = Random.Range (0, theObjectPools.Length);
transform.position = new Vector3 (transform.position.x + (platformWidths[platformSelector]/2) + distanceBetween , transform.position.y, transform.position.z);
//Instantiate (/*platform*/ thePlatforms[platformSelector], transform.position, transform.rotation);
GameObject newPlatform = theObjectPools[platformSelector].GetPooledObject();
newPlatform.transform.position = transform.position;
newPlatform.transform.rotation = transform.rotation;
newPlatform.SetActive (true);
transform.position = new Vector3 (transform.position.x + (platformWidths[platformSelector]/2) , transform.position.y, transform.position.z);
}
}
}
Thanks in advance for any help.
you're using an object pooler. are you sure it's resetting everything?
Here's what I'm using for the object pooler. using System.Collections; using System.Collections.Generic; using UnityEngine;
public class ObjectPooler : $$anonymous$$onoBehaviour {
public GameObject pooledObject;
public int poolAmount;
List<GameObject> pooledObjects;
// Use this for initialization
void Start () {
pooledObjects = new List<GameObject> ();
for (int i = 0; i < poolAmount; i++) {
GameObject obj = (GameObject)Instantiate (pooledObject);
obj.SetActive (false);
pooledObjects.Add (obj);
}
}
public GameObject GetPooledObject (){
for (int i = 0; i < pooledObjects.Count; i++) {
if (!pooledObjects [i].activeInHierarchy) {
return pooledObjects [i];
}
}
GameObject obj = (GameObject)Instantiate (pooledObject);
obj.SetActive (false);
pooledObjects.Add (obj);
return obj;
}
}
Why are you saying you're repeatedly instantiating and destroying with an object pool? Generally a pool's entire purpose is to reuse objects, so as to avoid destroying and instantiating. Are you certain your objects with the inactive child were instantiated ins$$anonymous$$d of reused?
I'd add a series of debugs to verify when you encounter the inactive child if that object was just now instantiated, or is just being reused.
I figured it out. I had a script that was attached to the child that caused it to be inactive after leaving the screen. I removed it so that the parent object was the only one being deactivated. Thanks for talking to me, it made me think better.
Your answer
Follow this Question
Related Questions
I can not debug with Dell Venue 8 1 Answer
Bilboard rendering issue 0 Answers
Deploying AssetBundle with Android Platform. 0 Answers
Instantiate()creates two objects? 1 Answer