EllanJiang/GameFramework · error · GameFrameworkException

Resource helper is invalid.

Error message

Resource helper is invalid.

What it means

AssetObject.Create validates that the resourceHelper argument is non-null. The helper is needed later for releasing/unloading the asset, so an AssetObject cannot be constructed without one. Fail-fast guard inside the resource loader.

Solutions

  1. Set the resource helper before loading: m_ResourceManager.SetResourceHelper(new DefaultResourceHelper()) or via ResourceComponent's inspector.
  2. Check argument order at the AssetObject.Create call site to ensure the helper isn't shifted/null.
  3. Initialize ResourceManager fully (helper, paths, pools) before any asset load.

Example fix

// before
m_ResourceManager.InitResources(); // helper never set
// after
m_ResourceManager.SetResourceHelper(new DefaultResourceHelper());
m_ResourceManager.InitResources();
Defensive patterns

Strategy: validation

Validate before calling

if (resourceComponent.ResourceHelper == null) resourceComponent.ResourceHelper = new DefaultResourceHelper();

Type guard

bool HelperReady => m_ResourceManager.m_ResourceHelper != null;

Prevention

When it happens

Trigger: Calling AssetObject.Create with resourceHelper == null, typically when wiring a custom resource helper or when the ResourceManager was initialized without setting m_ResourceHelper.

Common situations: Forgot to assign the resource helper (e.g. in ResourceComponent Start or ResourceManager initialize) before loading assets; a refactor renamed/reordered arguments so null landed in the helper slot.

Related errors


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

Appendix: source

Thrown at GameFramework/Resource/ResourceManager.ResourceLoader.AssetObject.cs:59

                        return base.CustomCanReleaseFlag && targetReferenceCount <= 0;
                    }
                }

                public static AssetObject Create(string name, object target, List<object> dependencyAssets, object resource, IResourceHelper resourceHelper, ResourceLoader resourceLoader)
                {
                    if (dependencyAssets == null)
                    {
                        throw new GameFrameworkException("Dependency assets is invalid.");
                    }

                    if (resource == null)
                    {
                        throw new GameFrameworkException("Resource is invalid.");
                    }

                    if (resourceHelper == null)
                    {
                        throw new GameFrameworkException("Resource helper is invalid.");
                    }

                    if (resourceLoader == null)
                    {
                        throw new GameFrameworkException("Resource loader is invalid.");
                    }

                    AssetObject assetObject = ReferencePool.Acquire<AssetObject>();
                    assetObject.Initialize(name, target);
                    assetObject.m_DependencyAssets.AddRange(dependencyAssets);
                    assetObject.m_Resource = resource;
                    assetObject.m_ResourceHelper = resourceHelper;
                    assetObject.m_ResourceLoader = resourceLoader;

                    foreach (object dependencyAsset in dependencyAssets)
                    {
                        int referenceCount = 0;
                        if (resourceLoader.m_AssetDependencyCount.TryGetValue(dependencyAsset, out referenceCount))

View on GitHub (pinned to d0c010b051)