Example #1
0
        /// <summary>
        /// Objectを作る処理をObjectへの参照を作る処理に加工する
        /// </summary>
        /// <param name="createDelegate">プールオブジェクトを作る処理(Unity.Object)</param>
        /// <returns>プールオブジェクトを作る処理(Unity.Objectへの参照)</returns>
        protected virtual ObjectPool <Object.UnityReference <T> > .CreateDelegate ProcessCreateDelegate(ObjectPool <T> .CreateDelegate createDelegate)
        {
            return(() =>
            {
                var createdObject = createDelegate();
                var reference = new Object.UnityReference <T>(createdObject);

                // 監視中のUnity.ObjectがDestroy()された場合には監視から取り除く
                reference
                .ObserveEveryValueChanged(target => target.target == null)
                .Where(brokenReference => brokenReference)
                .Subscribe(brokenReference =>
                {
                    this.RemoveObject(reference);
                },
                           e =>
                {
                    Debug.LogError(e);
                    this.RemoveObject(reference);
                },
                           () =>
                {
                    this.RemoveObject(reference);
                });

                return reference;
            });
        }
Example #2
0
        /// <summary>
        /// プールオブジェクトを取り除く
        /// </summary>
        /// <param name="reference">取り除くプールオブジェクトへの参照</param>
        /// <remarks>取り除かれたオブジェクトは破棄されます</remarks>
        protected virtual void RemoveObject(Object.UnityReference <T> reference)
        {
            var removedRef = this.objectPool.RemoveObject(reference);

            if (removedRef.target != null)
            {
                UnityEngine.Object.Destroy(removedRef.target);
            }
        }