Example #1
0
        /// <summary>
        /// gets an object from the pool, instantiating a new gameobject if necessary
        /// </summary>
        public GameObject GetObject(InstantiationData i)
        {
            GameObject g;

            bool newObj = false;

            if (transform.childCount > 0)
            {
                int ind = 0;
                while (ind < transform.childCount)
                {
                    GameObject go = transform.GetChild(ind).gameObject;
                    PoolToken  pt = go.GetComponent <PoolToken>();
                    if (pt == null || pt.usable == true)
                    {
                        g = go;
                        break;
                    }
                    ind++;
                }
                if (ind >= transform.childCount)
                {
                    throw new Exception("No usable objects in pool. This should never happen.");
                }
                g = transform.GetChild(ind).gameObject;
            }
            else
            {
                g      = LoadInactiveObject();
                newObj = true;
            }
            i.GameObject = g;

            SendMessage("PreObjectActivate", i, SendMessageOptions.DontRequireReceiver);

            g.transform.parent   = null;
            g.transform.position = i.Position;
            g.transform.rotation = i.Rotation;

            var rigidbody = g.GetComponent <Rigidbody>();

            if (rigidbody != null)
            {
                rigidbody.velocity        = Vector3.zero;
                rigidbody.angularVelocity = Vector3.zero;
            }

            var token = PoolToken.AddPoolToken(g, PrefabString, i);

            token.firstInstantiate = newObj;
            if (ObjectPool.objectPool.AutoNameObjects)
            {
                g.name = getPoolNameFromPrefabPath(PrefabString) + "." + i.OwnerId + "." + token.tokenId;
            }

            g.SetActive(prefabDefaultActive);
            SendMessage("PostObjectActivate", i, SendMessageOptions.DontRequireReceiver);

            if (!newObj && prefabDefaultActive)
            {
                g.BroadcastMessage("Awake", SendMessageOptions.DontRequireReceiver);
                g.BroadcastMessage("Start", SendMessageOptions.DontRequireReceiver);
            }

            addPlayerObject(i.OwnerId, g);
            ManagedObjects.AddManagedObject(g);
            g.BroadcastMessage("OnObjectPoolInstantiate", SendMessageOptions.DontRequireReceiver);
            return(g);
        }