EllanJiang/GameFramework · critical · GameFrameworkException
You must set resource manager first.
Error message
You must set resource manager first.
What it means
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.
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.
Example fix
// before
dataProvider.ReadData("Assets/Config.dat", 0, null); // resource manager not set
// after
dataProvider.SetResourceManager(m_ResourceManager);
dataProvider.SetDataProviderHelper(m_Helper);
dataProvider.ReadData("Assets/Config.dat", 0, null); Defensive patterns
Strategy: validation
Validate before calling
if (m_ResourceManager == null) { /* initialize framework / call SetResourceManager */ }
dataProvider.ReadData(assetName, 0, userData); Type guard
bool IsReady(DataProvider p) => p != null; // plus ensure SetResourceManager was invoked in init
Try / catch
try { dataProvider.ReadData(name, 0, null); }
catch (GameFrameworkException e) when (e.Message.Contains("resource manager")) { Log.Error("DataProvider not initialized: call SetResourceManager first."); } Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- You must set data provider helper first.
- You must set data helper first.
- Resource helper is invalid.
- Compressed helper is invalid.
- JSON helper is invalid.
AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15).
Data as JSON: /api/errors/88e38900c93f0114.
Report an issue: GitHub.
Appendix: source
Thrown at GameFramework/Base/DataProvider/DataProvider.cs:186
/// </summary>
/// <param name="dataAssetName">内容资源名称。</param>
/// <param name="userData">用户自定义数据。</param>
public void ReadData(string dataAssetName, object userData)
{
ReadData(dataAssetName, Constant.DefaultPriority, userData);
}
/// <summary>
/// 读取数据。
/// </summary>
/// <param name="dataAssetName">内容资源名称。</param>
/// <param name="priority">加载数据资源的优先级。</param>
/// <param name="userData">用户自定义数据。</param>
public void ReadData(string dataAssetName, int priority, object userData)
{
if (m_ResourceManager == null)
{
throw new GameFrameworkException("You must set resource manager first.");
}
if (m_DataProviderHelper == null)
{
throw new GameFrameworkException("You must set data provider helper first.");
}
HasAssetResult result = m_ResourceManager.HasAsset(dataAssetName);
switch (result)
{
case HasAssetResult.AssetOnDisk:
case HasAssetResult.AssetOnFileSystem:
m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData);
break;
case HasAssetResult.BinaryOnDisk:
m_ResourceManager.LoadBinary(dataAssetName, m_LoadBinaryCallbacks, userData);
break;View on GitHub (pinned to d0c010b051)