EllanJiang/GameFramework · error · GameFrameworkException

Resource loader is invalid.

Error message

Resource loader is invalid.

What it means

AssetObject.Create validates that the resourceLoader argument is non-null, since the created AssetObject needs the loader for reference counting and release/shutdown logic. This is the last null-argument guard before the object is acquired from the ReferencePool.

Solutions

  1. Only create AssetObjects through ResourceLoader.LoadAsset so the loader is always supplied.
  2. If calling Create directly, pass the live ResourceLoader instance (e.g. m_ResourceManager.m_ResourceLoader).
  3. Ensure the loader field is initialized before any load call (order Awake/Start correctly).

Example fix

// before
AssetObject.Create(name, target, deps, resource, helper, null);
// after
AssetObject.Create(name, target, deps, resource, helper, m_ResourceLoader);
Defensive patterns

Strategy: validation

Validate before calling

if (loader == null) throw new InvalidOperationException("ResourceLoader must be initialized before creating AssetObjects.");

Type guard

bool LoaderReady => m_ResourceLoader != null;

Prevention

When it happens

Trigger: Calling AssetObject.Create with resourceLoader == null, e.g. from custom code outside the normal ResourceLoader.LoadAsset flow, or passing an uninitialized loader field.

Common situations: Testing/standalone scripts constructing AssetObject directly without a loader; loader field assigned in Awake but Create called in constructor before assignment; wrong argument order in a custom overload.

Related errors


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

Appendix: source

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

                {
                    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))
                        {
                            resourceLoader.m_AssetDependencyCount[dependencyAsset] = referenceCount + 1;
                        }
                        else
                        {

View on GitHub (pinned to d0c010b051)