diff --git a/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs b/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs index becf276b1..0f162ceb9 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs @@ -193,7 +193,8 @@ namespace UniGLTF public enum Messages { - DIFFERENT_MATERIAL_COUNT, + MATERIALS_LESS_THAN_SUBMESH_COUNT, + MATERIALS_GREATER_THAN_SUBMESH_COUNT, MATERIALS_CONTAINS_NULL, UNKNOWN_SHADER, } @@ -205,18 +206,22 @@ namespace UniGLTF // invalid materials.len if (info.Renderer.sharedMaterials.Length < info.Mesh.subMeshCount) { - // すべての submesh に material が割り当てられていない - yield return Validation.Error(Messages.DIFFERENT_MATERIAL_COUNT.Msg()); + // submesh より material の方が少ない + yield return Validation.Error(Messages.MATERIALS_LESS_THAN_SUBMESH_COUNT.Msg()); } - else if (info.Renderer.sharedMaterials.Length > info.Mesh.subMeshCount) + else { - // 未使用の material がある - yield return Validation.Warning(Messages.DIFFERENT_MATERIAL_COUNT.Msg()); - } - else if (info.Renderer.sharedMaterials.Any(x => x == null)) - { - // material に null が含まれる(unity で magenta になっているはず) - yield return Validation.Error($"{info.Renderer}: {Messages.MATERIALS_CONTAINS_NULL.Msg()}"); + if (info.Renderer.sharedMaterials.Length > info.Mesh.subMeshCount) + { + // submesh より material の方が多い + yield return Validation.Warning(Messages.MATERIALS_GREATER_THAN_SUBMESH_COUNT.Msg()); + } + + if (info.Renderer.sharedMaterials.Take(info.Mesh.subMeshCount).Any(x => x == null)) + { + // material に null が含まれる(unity で magenta になっているはず) + yield return Validation.Error($"{info.Renderer}: {Messages.MATERIALS_CONTAINS_NULL.Msg()}"); + } } } diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs index 72cd34ad3..a2d8058fa 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs @@ -6,20 +6,26 @@ namespace UniGLTF { public class MeshExportValidatorTests { + static GameObject CreateTestObject(Material[] materials) + { + var root = new GameObject("root"); + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + cube.transform.SetParent(root.transform); + + var renderer = cube.GetComponent(); + renderer.sharedMaterials = materials; + return root; + } + [Test] public void NoMaterialTest() { var validator = ScriptableObject.CreateInstance(); - var root = new GameObject("root"); + // 0 material + var root = CreateTestObject(new Material[0]); try { - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - cube.transform.SetParent(root.transform); - - var renderer = cube.GetComponent(); - renderer.sharedMaterials = new Material[0]; - validator.SetRoot(root, MeshExportSettings.Default); var vs = validator.Validate(root); Assert.False(vs.All(x => x.CanExport)); @@ -35,16 +41,11 @@ namespace UniGLTF public void NullMaterialTest() { var validator = ScriptableObject.CreateInstance(); - var root = new GameObject("root"); + // null を含む + var root = CreateTestObject(new Material[] { null }); try { - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - cube.transform.SetParent(root.transform); - - var renderer = cube.GetComponent(); - renderer.sharedMaterials = new Material[] { null }; - validator.SetRoot(root, MeshExportSettings.Default); var vs = validator.Validate(root); Assert.False(vs.All(x => x.CanExport)); @@ -60,16 +61,11 @@ namespace UniGLTF public void NullMaterialsTest() { var validator = ScriptableObject.CreateInstance(); - var root = new GameObject("root"); + // null を含むかつ submeshCount より多い + var root = CreateTestObject(new Material[] { null, null }); try { - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - cube.transform.SetParent(root.transform); - - var renderer = cube.GetComponent(); - renderer.sharedMaterials = new Material[] { null, null }; - validator.SetRoot(root, MeshExportSettings.Default); var vs = validator.Validate(root); Assert.False(vs.All(x => x.CanExport));