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