Unity中的引用计数器(RefCount)

引用计数使用场景:

有一间黑色的屋子,里边有一盏灯。当第一个人进屋的时候灯会打开,之后进来的人则不用再次打开了,因为已经打开过了。当屋子里所有人都离开了的时候,灯则会关闭。

引用计数器工具 :

namespace QFramework
{
    public interface IRefCount
    {
        int RefCount { get; }
        void Retain(object refOwner = null);
        void Release(object refOwner = null);
    }
    public class SimpleRC : IRefCount
    {
        public int RefCount { get; private set; }

        public void Retain(object refOwner = null)
        {
            RefCount++;
        }

        public void Release(object refOwner = null)
        {
            RefCount--;
            if(RefCount == 0)
            {
                OnZeroRef();
            }
        }
        
        protected virtual void OnZeroRef()
        {

        }
    }
}

举例实现:


using UnityEngine;
namespace QFramework
{
    public class SimpleRCExample : MonoBehaviour
    {
#if UNITY_EDITOR
        [UnityEditor.MenuItem("QFramework/Example/22.SimpleRCExample", false, 22)]
        static void MenuClick()
        {
            var room = new Room();

            room.EnterPeople();
            room.EnterPeople();
            room.EnterPeople();

            room.LeavePeople();
            room.LeavePeople();
            room.LeavePeople();

            room.EnterPeople(); 
        }
#endif

        class Light
        {
            public void Open()
            {
                Debug.Log("灯打开了");
            }
            public void Close()
            {
                Debug.Log("灯关闭了");
            }
        }

        class Room:SimpleRC 
        {
            Light mLight = new Light();

            public void EnterPeople()
            {
                if (RefCount == 0)
                {
                    mLight.Open();
                }
                Retain();
                Debug.LogFormat("一个人进入房间,当前房间有{0}个人", RefCount);
            }

            public void LeavePeople()
            {
                Release();

                Debug.LogFormat("一个人离开房间,当前房间有{0}个人", RefCount);
            }

            protected override void OnZeroRef()
            {
                mLight.Close();
            }
        }
    }
}

 运行结果:

猜你喜欢

转载自blog.csdn.net/qq_40323256/article/details/88038521