public GameObject Instanciate(
            IRecycleInstanceController controller, GameObject defaultPrefab,
            Vector3 position, Quaternion rotation)
        {
            int index;

            if (_emptyObjectIndex.Count != 0)
            {
                index = _emptyObjectIndex.Peek();
                _emptyObjectIndex.Dequeue();
            }
            else
            {
                GameObject obj = Object.Instantiate(defaultPrefab);
                _gameObjects.Add(obj);
                index = _gameObjects.Count - 1;
            }

            _gameObjects[index].transform.position = position;
            _gameObjects[index].transform.rotation = defaultPrefab.transform.rotation * rotation;

            controller.SetData(_gameObjects[index]);
            _usedIndexDictionary.Add(controller, index);

            return(_gameObjects[index]);
        }
        public void Remove(IRecycleInstanceController controller)
        {
            int index = _usedIndexDictionary[controller];

            controller.ClearData(_gameObjects[index]);

            _usedIndexDictionary.Remove(controller);
            _emptyObjectIndex.Enqueue(index);
        }