EllanJiang/GameFramework · error · GameFrameworkException

Unload scene success callback is invalid.

Error message

Unload scene success callback is invalid.

What it means

The UnloadSceneCallbacks constructor requires a non-null unload-scene success callback; the failure callback may be omitted but the success callback is mandatory. Passing null means the framework could not notify the caller when a scene finishes unloading, so it throws immediately. This is a fail-fast argument check.

Solutions

  1. Provide a valid UnloadSceneSuccessCallback delegate to the constructor
  2. Check that the method assigned to the success callback is not conditionally null
  3. Only construct UnloadSceneCallbacks after the handler is assigned

Example fix

// before
new UnloadSceneCallbacks(null, OnUnloadSceneFailure);
// after
new UnloadSceneCallbacks(OnUnloadSceneSuccess, OnUnloadSceneFailure);
Defensive patterns

Strategy: validation

Validate before calling

if (onSuccess == null) { Log.Error("Unload scene success callback required"); return; }

Type guard

bool HasSuccessCallback(UnloadSceneSuccessCallback cb) => cb != null;

Try / catch

try { var cbs = new UnloadSceneCallbacks(onSuccess, onFailure); } catch (GameFrameworkException ex) when (ex.Message == "Unload scene success callback is invalid.") { Log.Error(ex, "Missing success callback"); }

Prevention

When it happens

Trigger: Constructing UnloadSceneCallbacks with null for the unloadSceneSuccessCallback parameter, e.g. when passing callbacks to ResourceManager's UnloadScene API.

Common situations: Passing an uninitialized delegate/method-group reference, a conditional callback that was never assigned, or copying callback-creation code and leaving the success handler out.

Related errors


AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15). Data as JSON: /api/errors/2a270af7830b3c5a. Report an issue: GitHub.

Appendix: source

Thrown at GameFramework/Resource/UnloadSceneCallbacks.cs:36

        /// <summary>
        /// 初始化卸载场景回调函数集的新实例。
        /// </summary>
        /// <param name="unloadSceneSuccessCallback">卸载场景成功回调函数。</param>
        public UnloadSceneCallbacks(UnloadSceneSuccessCallback unloadSceneSuccessCallback)
            : this(unloadSceneSuccessCallback, null)
        {
        }

        /// <summary>
        /// 初始化卸载场景回调函数集的新实例。
        /// </summary>
        /// <param name="unloadSceneSuccessCallback">卸载场景成功回调函数。</param>
        /// <param name="unloadSceneFailureCallback">卸载场景失败回调函数。</param>
        public UnloadSceneCallbacks(UnloadSceneSuccessCallback unloadSceneSuccessCallback, UnloadSceneFailureCallback unloadSceneFailureCallback)
        {
            if (unloadSceneSuccessCallback == null)
            {
                throw new GameFrameworkException("Unload scene success callback is invalid.");
            }

            m_UnloadSceneSuccessCallback = unloadSceneSuccessCallback;
            m_UnloadSceneFailureCallback = unloadSceneFailureCallback;
        }

        /// <summary>
        /// 获取卸载场景成功回调函数。
        /// </summary>
        public UnloadSceneSuccessCallback UnloadSceneSuccessCallback
        {
            get
            {
                return m_UnloadSceneSuccessCallback;
            }
        }

        /// <summary>

View on GitHub (pinned to d0c010b051)