internal void Reset()
        {
            if (m_SerialId <= 0)
            {
                throw new InvalidOperationException("Already reset.");
            }

            m_AssetCache.RemoveAccessor(this);
            ResetCallbacks();

            m_AssetCache.ReduceRetainCount();
            m_AssetCache = null;
            m_SerialId   = 0;
        }
        internal void Init(AssetCache assetCache, LoadAssetCallbackSet callbackSet, object context)
        {
            if (m_SerialId > 0)
            {
                throw new InvalidOperationException("Oops, I'm not reset.");
            }

            m_AssetCache = assetCache ?? throw new ArgumentNullException(nameof(assetCache), "Oops!");
            m_SerialId   = NextSerialId();

            m_AssetCache.IncreaseRetainCount();

            CallbackSet = callbackSet;
            Context     = context;
            m_AssetCache.AddAccessor(this);
        }