{"record":{"id":"88e38900c93f0114","repo":"EllanJiang/GameFramework","slug":"you-must-set-resource-manager-first","errorCode":null,"errorMessage":"You must set resource manager first.","messagePattern":"You must set resource manager first\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"critical","filePath":"GameFramework/Base/DataProvider/DataProvider.cs","lineNumber":186,"sourceCode":"        /// </summary>\n        /// <param name=\"dataAssetName\">内容资源名称。</param>\n        /// <param name=\"userData\">用户自定义数据。</param>\n        public void ReadData(string dataAssetName, object userData)\n        {\n            ReadData(dataAssetName, Constant.DefaultPriority, userData);\n        }\n\n        /// <summary>\n        /// 读取数据。\n        /// </summary>\n        /// <param name=\"dataAssetName\">内容资源名称。</param>\n        /// <param name=\"priority\">加载数据资源的优先级。</param>\n        /// <param name=\"userData\">用户自定义数据。</param>\n        public void ReadData(string dataAssetName, int priority, object userData)\n        {\n            if (m_ResourceManager == null)\n            {\n                throw new GameFrameworkException(\"You must set resource manager first.\");\n            }\n\n            if (m_DataProviderHelper == null)\n            {\n                throw new GameFrameworkException(\"You must set data provider helper first.\");\n            }\n\n            HasAssetResult result = m_ResourceManager.HasAsset(dataAssetName);\n            switch (result)\n            {\n                case HasAssetResult.AssetOnDisk:\n                case HasAssetResult.AssetOnFileSystem:\n                    m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData);\n                    break;\n\n                case HasAssetResult.BinaryOnDisk:\n                    m_ResourceManager.LoadBinary(dataAssetName, m_LoadBinaryCallbacks, userData);\n                    break;","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Base/DataProvider/DataProvider.cs#L168-L204","documentation":"DataProvider.ReadData(string, int, object) requires an IResourceManager to have been set via SetResourceManager before it can check/load the data asset. If m_ResourceManager is null the provider cannot resolve the asset, so it throws immediately. This is an initialization-order error, not a data problem.","triggerScenarios":"Calling ReadData(dataAssetName, priority, userData) on a DataProvider (e.g. a DataTable or Config component) whose SetResourceManager was never called — typically when the component's Awake/initialize path was skipped or run out of order.","commonSituations":"Manually instantiating a data provider class in tests or tooling without wiring the resource manager; Unity component execution order changed so ReadData runs before FrameworkEntry initialization; custom code path bypassing the normal GameFramework initialization.","solutions":["Call SetResourceManager(resourceManager) on the data provider before any ReadData call.","Ensure the GameFramework initialization component runs before the component that calls ReadData (check Script Execution Order).","If instantiating DataProvider manually, replicate the wiring done by the framework entry point."],"exampleFix":"// before\ndataProvider.ReadData(\"Assets/Config.dat\", 0, null); // resource manager not set\n// after\ndataProvider.SetResourceManager(m_ResourceManager);\ndataProvider.SetDataProviderHelper(m_Helper);\ndataProvider.ReadData(\"Assets/Config.dat\", 0, null);","handlingStrategy":"validation","validationCode":"if (m_ResourceManager == null) { /* initialize framework / call SetResourceManager */ }\ndataProvider.ReadData(assetName, 0, userData);","typeGuard":"bool IsReady(DataProvider p) => p != null; // plus ensure SetResourceManager was invoked in init","tryCatchPattern":"try { dataProvider.ReadData(name, 0, null); }\ncatch (GameFrameworkException e) when (e.Message.Contains(\"resource manager\")) { Log.Error(\"DataProvider not initialized: call SetResourceManager first.\"); }","preventionTips":["Initialize GameFramework components in a fixed order (resource manager before data providers).","Wire SetResourceManager/SetDataProviderHelper in one init method.","Add a readiness assert before first ReadData in debug builds."],"tags":["initialization","missing-dependency","dataprovider"],"backgroundTag":"missing-dependency","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}