Unity-Technologies/UnityCsReference · error · ArgumentException

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

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)).

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)

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.