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