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
- Fetch the Instance and bound submeshIndex to its submeshMaterialIndices.Length.
- Do not assume a shared submesh count.
- 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
- Bound submeshIndex to the specific instance's submeshMaterialIndices.Length.
- Submesh counts vary per instance; never assume uniformity.
- Use strict < comparisons.
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
- submeshIndex must be between 0 and {theInstance.submeshMater
- index must be between 0 and {albedoTextureCount - 1}, but wa
- index must be between 0 and {emissiveTextureCount - 1}, but
- index must be between 0 and {instanceCount - 1}, but was {in
- index must be between 0 and {terrainCount - 1}, but was {ind
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/521e9717c51cd0f9.
Report an issue: GitHub.