{"record":{"id":"6c0ecafee0addb81","repo":"EllanJiang/GameFramework","slug":"you-must-set-resource-helper-first","errorCode":null,"errorMessage":"You must set resource helper first.","messagePattern":"You must set resource helper first\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/ResourceManager.ResourceLoader.cs","lineNumber":434,"sourceCode":"\n                m_TaskPool.AddTask(mainTask);\n                if (!resourceInfo.Ready)\n                {\n                    m_ResourceManager.UpdateResource(resourceInfo.ResourceName);\n                }\n            }\n\n            /// <summary>\n            /// 异步卸载场景。\n            /// </summary>\n            /// <param name=\"sceneAssetName\">要卸载场景资源的名称。</param>\n            /// <param name=\"unloadSceneCallbacks\">卸载场景回调函数集。</param>\n            /// <param name=\"userData\">用户自定义数据。</param>\n            public void UnloadScene(string sceneAssetName, UnloadSceneCallbacks unloadSceneCallbacks, object userData)\n            {\n                if (m_ResourceManager.m_ResourceHelper == null)\n                {\n                    throw new GameFrameworkException(\"You must set resource helper first.\");\n                }\n\n                object asset = null;\n                if (m_SceneToAssetMap.TryGetValue(sceneAssetName, out asset))\n                {\n                    m_SceneToAssetMap.Remove(sceneAssetName);\n                    m_AssetPool.Unspawn(asset);\n                    m_AssetPool.ReleaseObject(asset);\n                }\n                else\n                {\n                    throw new GameFrameworkException(Utility.Text.Format(\"Can not find asset of scene '{0}'.\", sceneAssetName));\n                }\n\n                m_ResourceManager.m_ResourceHelper.UnloadScene(sceneAssetName, unloadSceneCallbacks, userData);\n            }\n\n            /// <summary>","sourceCodeStart":416,"sourceCodeEnd":452,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceLoader.cs#L416-L452","documentation":"Thrown by ResourceLoader.UnloadScene when the resource helper (m_ResourceHelper) has not been assigned on the loader. Unloading scene assets requires the helper to release underlying assets; call SetResourceHelper before any UnloadScene call.","triggerScenarios":"Calling UnloadScene (or ResourceLoader.UnloadScene) when ResourceManager.m_ResourceHelper is null — i.e. SetResourceHelper was never called before unloading a scene.","commonSituations":"Forgetting resourceComponent.SetResourceHelper(...) during initialization, unloading scenes in a code path that runs before resource component setup, or a custom bootstrap that skips helper registration.","solutions":["Call resourceComponent.SetResourceHelper(new DefaultResourceHelper()) (or your custom helper) during startup, before any scene unload.","Reorder initialization so the resource helper is registered before UnloadScene can be called.","Guard scene unload calls behind an initialization-complete flag."],"exampleFix":"// before\nresourceComponent.UnloadScene(sceneName, unloadCallbacks);\n// after\nresourceComponent.SetResourceHelper(new DefaultResourceHelper()); // at init time\nresourceComponent.UnloadScene(sceneName, unloadCallbacks);","handlingStrategy":"validation","validationCode":"// Verify the helper is set before unloading\nif (!resourceComponent.ResourceHelperSet) // or your own init flag\n    { Log.Error(\"Resource helper not set; aborting UnloadScene\"); return; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call SetResourceHelper during early initialization","Gate unload calls behind an init-complete flag","Keep framework setup order: pool manager -> resource helper -> usage"],"tags":["gameframework","resource-management","initialization-order","helper-not-set"],"backgroundTag":"missing-dependency","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}