EllanJiang/GameFramework · critical · GameFrameworkException
You must set data provider helper first.
Error message
You must set data provider helper first.
What it means
ReadData also requires an IDataProviderHelper (the object that actually parses loaded bytes) to be assigned via SetDataProviderHelper. When m_DataProviderHelper is null, even with a resource manager present, the provider cannot parse the binary and throws. Like error 1, it is a setup-order failure.
Solutions
- Call SetDataProviderHelper(helper) with a valid IDataProviderHelper implementation before ReadData.
- In Unity, verify the helper component is attached and assigned on the corresponding GameFramework component.
- Check initialization code so resource manager and helper are both set in the same init routine.
Example fix
// before
dataProvider.SetResourceManager(m_ResourceManager);
dataProvider.ReadData("Assets/Config.dat", 0, null);
// after
dataProvider.SetResourceManager(m_ResourceManager);
dataProvider.SetDataProviderHelper(new ConfigHelper());
dataProvider.ReadData("Assets/Config.dat", 0, null); Defensive patterns
Strategy: validation
Validate before calling
if (m_DataProviderHelper == null) { /* attach/assign the helper component */ }
dataProvider.ReadData(assetName, 0, userData); Type guard
bool HasHelper(IDataProviderHelper h) => h != null;
Try / catch
try { dataProvider.ReadData(name, 0, null); }
catch (GameFrameworkException e) when (e.Message.Contains("data provider helper")) { Log.Error("Assign an IDataProviderHelper via SetDataProviderHelper before reading data."); } Prevention
- Always pair SetResourceManager with SetDataProviderHelper during init.
- Verify inspector assignments on GameFramework components after renaming helpers.
- Unit-test provider setup before load in tooling.
When it happens
Trigger: Calling ReadData(dataAssetName, priority, userData) after SetResourceManager but before SetDataProviderHelper, or never calling SetDataProviderHelper at all on the DataProvider instance.
Common situations: Forgetting to add/configure the helper (e.g. a DataTableHelper or ConfigHelper) in the Unity inspector; renaming or removing the helper component so the framework can't resolve it; custom helpers not registered in a custom flow.
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 resource manager 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/68ebe378f64cce1d.
Report an issue: GitHub.
Appendix: source
Thrown at GameFramework/Base/DataProvider/DataProvider.cs:191
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;
case HasAssetResult.BinaryOnFileSystem:
int dataLength = m_ResourceManager.GetBinaryLength(dataAssetName);
EnsureCachedBytesSize(dataLength);
if (dataLength != m_ResourceManager.LoadBinaryFromFileSystem(dataAssetName, s_CachedBytes))View on GitHub (pinned to d0c010b051)