Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class ObjectPool
- {
- #region Fields
- private GameObject _parentObject;
- private Dictionary<int, GameObject> _sourceByObjectId =
- new Dictionary<int, GameObject>();
- private Dictionary<GameObject, Stack<GameObject>> _storage =
- new Dictionary<GameObject, Stack<GameObject>>();
- #endregion
- #region Methods
- public void SetParentObject(GameObject parentObject)
- {
- _parentObject = parentObject;
- }
- public void Create(GameObject source, int count)
- {
- Stack<GameObject> objectsStack;
- bool hasStack = _storage.TryGetValue(source, out objectsStack);
- if (!hasStack)
- {
- objectsStack = new Stack<GameObject>();
- _storage[source] = objectsStack;
- }
- for (int i = 0; i < count; i++)
- {
- var pooledObject = Object.Instantiate(source) as GameObject;
- pooledObject.SetActive(false);
- pooledObject.name = source.name;
- if (_parentObject != null)
- {
- pooledObject.transform.parent = _parentObject.transform;
- }
- objectsStack.Push(pooledObject);
- int objectId = pooledObject.GetInstanceID();
- _sourceByObjectId[objectId] = source;
- }
- }
- public GameObject Get(GameObject source)
- {
- return Get(source, Vector3.zero, Quaternion.identity);
- }
- public GameObject Get(GameObject source, Vector3 initialPosition, Quaternion initialRotation)
- {
- Stack<GameObject> objectsStack;
- bool hasStack = _storage.TryGetValue(source, out objectsStack);
- if (!hasStack)
- {
- objectsStack = new Stack<GameObject>();
- _storage[source] = objectsStack;
- }
- GameObject pooledObject = null;
- if (objectsStack.Count == 0)
- {
- pooledObject = Object.Instantiate(source) as GameObject;
- pooledObject.name = source.name;
- int objectId = pooledObject.GetInstanceID();
- _sourceByObjectId[objectId] = source;
- }
- else
- {
- pooledObject = objectsStack.Pop();
- pooledObject.SetActive(true);
- }
- pooledObject.transform.parent = null;
- pooledObject.transform.position = initialPosition;
- pooledObject.transform.rotation = initialRotation;
- return pooledObject;
- }
- public void Release(GameObject releasedObject)
- {
- int objectId = releasedObject.GetInstanceID();
- GameObject source;
- bool hasSource = _sourceByObjectId.TryGetValue(objectId, out source);
- if (!hasSource)
- {
- throw new UnityException("Not found a source of pooled object.");
- }
- releasedObject.SetActive(false);
- if (_parentObject != null)
- {
- releasedObject.transform.parent = _parentObject.transform;
- }
- Stack<GameObject> objectsStack = _storage[source];
- objectsStack.Push(releasedObject);
- }
- #endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment