より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Unity標準のObjectPoolで遊んでみる

Unity標準のObjectPoolを触ってみることにしました。

一通りやりたいことはできそうだなと。

    public class TokenPoolManager : SingletonMonoBehaviour<TokenPoolManager>
    {
        [SerializeField] private GameObject tokenPrefab;
        
        public ObjectPool<Token> TokenPool => _tokenPool ??= new ObjectPool<Token>(CreateFunc, ActionOnGet, ActionOnRelease);

        private void ActionOnRelease(Token obj)
        {
            obj.gameObject.transform.SetParent(transform);
            obj.gameObject.SetActive(false);
        }

        private static int _nextId;
        private ObjectPool<Token> _tokenPool;

        private void ActionOnGet(Token obj)
        {
            obj.gameObject.SetActive(true);
        }

        private Token CreateFunc()
        {
            var go = Instantiate(tokenPrefab);
            var token = go.GetComponent<Token>();
            return token;
        }
    }

ポイントは

public ObjectPool TokenPool => _tokenPool ??= new ObjectPool(CreateFunc, ActionOnGet, ActionOnRelease);

でしょうか。

単純にTokenPool = ほにゃららと初期化しようとするとstaticメソッドしか引数に渡せないためです。