Unity-Technologies/UnityCsReference · error · ArgumentException

submeshIndex must be between 0 and

Error message

submeshIndex must be between 0 and {submeshCount - 1}, but was {submeshIndex}

What it means

instanceToTransmissiveIndex's second guard throws ArgumentException when submeshIndex >= inst.submeshMaterialIndices.Length. After the instance is valid, the submesh index is bounded by that instance's own submesh count (resolved via instance(instanceIndex)).

Solutions

  1. Fetch the Instance and bound submeshIndex to its submeshMaterialIndices.Length.
  2. Do not assume a shared submesh count.
  3. Use strict < for the loop bound.

Example fix

// before
int tIdx = lightBaker.instanceToTransmissiveIndex(instIdx, subIdx);

// after
Instance inst = lightBaker.instance(instIdx);
if (subIdx >= inst.submeshMaterialIndices.Length) continue;
int tIdx = lightBaker.instanceToTransmissiveIndex(instIdx, subIdx);
Defensive patterns

Strategy: validation

Validate before calling

Instance inst = lightBaker.instance(instanceIndex);
int submeshCount = inst.submeshMaterialIndices.Length;
if (submeshIndex < submeshCount)
    int tIdx = lightBaker.instanceToTransmissiveIndex(instanceIndex, submeshIndex);

Prevention

When it happens

Trigger: Calling instanceToTransmissiveIndex with a submeshIndex not bounded by the instance's submesh count; reusing a submesh count from a different instance.

Common situations: Assuming uniform submesh counts across instances; hardcoded submesh indices for multi-submesh meshes; iterating with <=.

Related errors


AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13). Data as JSON: /api/errors/521e9717c51cd0f9. Report an issue: GitHub.

Appendix: source

Thrown at Editor/Mono/GI/LightBaker.bindings.cs:562

        {
            if (instanceIndex >= instanceCount)
                throw new ArgumentException($"index must be between 0 and {instanceCount - 1}, but was {instanceIndex}");
            return Internal_instanceAlbedoEmissiveIndex(instanceIndex);
        }
        public int instanceToEmissiveIndex(uint instanceIndex)
        {
            if (instanceIndex >= instanceCount)
                throw new ArgumentException($"index must be between 0 and {instanceCount - 1}, but was {instanceIndex}");
            return Internal_instanceAlbedoEmissiveIndex(instanceIndex);
        }
        public int instanceToTransmissiveIndex(uint instanceIndex, uint submeshIndex)
        {
            if (instanceIndex >= instanceCount)
                throw new ArgumentException($"index must be between 0 and {instanceCount - 1}, but was {instanceIndex}");
            Instance inst = instance(instanceIndex);
            int submeshCount = inst.submeshMaterialIndices.Length;
            if (submeshIndex >= submeshCount)
                throw new ArgumentException($"submeshIndex must be between 0 and {submeshCount - 1}, but was {submeshIndex}");
            int materialIndex = inst.submeshMaterialIndices[submeshIndex];
            if (materialIndex == -1)
                throw new ArgumentException($"material for submesh {submeshIndex} did not exist.");

            return Internal_instanceTransmissiveIndex(instanceIndex, submeshIndex);
        }

        public extern uint albedoTextureCount { get; }
        public extern uint albedoTexturePropertiesCount { get; }
        extern TextureData Internal_GetAlbedoTextureData(uint index);
        extern void Internal_SetAlbedoTextureData(uint index, TextureData textureData);

        public TextureData GetAlbedoTextureData(uint index)
        {
            if (index >= albedoTextureCount)
                throw new ArgumentException($"index must be between 0 and {albedoTextureCount - 1}, but was {index}");
            return Internal_GetAlbedoTextureData(index);
        }

View on GitHub (pinned to 225b0fbdb5)