diff --git a/Assets/VRM/UniGLTF/Scripts/Extensions/StringExtensions.cs b/Assets/VRM/UniGLTF/Scripts/Extensions/StringExtensions.cs index d181c7d40..92dbdbb7e 100644 --- a/Assets/VRM/UniGLTF/Scripts/Extensions/StringExtensions.cs +++ b/Assets/VRM/UniGLTF/Scripts/Extensions/StringExtensions.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Text.RegularExpressions; using UnityEngine; namespace UniGLTF @@ -63,6 +64,8 @@ namespace UniGLTF }; public static string EscapeFilePath(this string path) { + path = Regex.Replace(path, @"[\u0000-\u001F\u007F]", "+"); + foreach(var x in EscapeChars) { path = path.Replace(x, '+'); diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExportSettings.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExportSettings.cs index 3a5838a1e..7ae1ff610 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExportSettings.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExportSettings.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using UniGLTF; +using UnityEditor; using UnityEngine; @@ -92,6 +93,8 @@ namespace VRM public bool RemoveVertexColor = false; #endregion + private const int MAX_LENGTH = 64; + public struct Validation { /// @@ -190,7 +193,7 @@ namespace VRM if (ReduceBlendshape && Source.GetComponent() == null) { - yield return Validation.Error("ReduceBlendshapeSize is need VRMBlendShapeProxy, you need to convert to VRM once."); + yield return Validation.Error("ReduceBlendshapeSize needs VRMBlendShapeProxy. You need to convert to VRM once."); } var vertexColor = Source.GetComponentsInChildren().Any(x => x.sharedMesh.colors.Length > 0); @@ -228,6 +231,67 @@ namespace VRM yield return Validation.Warning(string.Format("unknown material '{0}' is used. this will export as `Standard` fallback", material.shader.name)); } + + foreach (var material in materials) + { + if (material.name.Length > MAX_LENGTH) + yield return Validation.Error(string.Format("FileName '{0}' is too long. ", material.name)); + } + + var textureNameList = new List(); + foreach (var material in materials) + { + var shader = material.shader; + int propertyCount = ShaderUtil.GetPropertyCount(shader); + for (int i = 0; i < propertyCount; i++) + { + if (ShaderUtil.GetPropertyType(shader, i) == ShaderUtil.ShaderPropertyType.TexEnv) + { + if ((material.GetTexture(ShaderUtil.GetPropertyName(shader, i)) != null)) + { + var textureName = material.GetTexture(ShaderUtil.GetPropertyName(shader, i)).name; + if (!textureNameList.Contains(textureName)) + textureNameList.Add(textureName); + } + } + } + } + + foreach (var textureName in textureNameList) + { + if (textureName.Length > MAX_LENGTH) + yield return Validation.Error(string.Format("FileName '{0}' is too long. ", textureName)); + } + + var vrmMeta = Source.GetComponent(); + if (vrmMeta != null) + { + if (vrmMeta.Meta != null) + { + if (vrmMeta.Meta.Thumbnail != null) + { + var thumbnailName = vrmMeta.Meta.Thumbnail.name; + if (thumbnailName.Length > MAX_LENGTH) + yield return Validation.Error(string.Format("FileName '{0}' is too long. ", thumbnailName)); + } + } + } + + var meshFilters = Source.GetComponentsInChildren(); + var meshesName = meshFilters.Select(x => x.sharedMesh.name).Distinct(); + foreach (var meshName in meshesName) + { + if (meshName.Length > MAX_LENGTH) + yield return Validation.Error(string.Format("FileName '{0}' is too long. ", meshName)); + } + + var skinnedmeshRenderers = Source.GetComponentsInChildren(); + var skinnedmeshesName = skinnedmeshRenderers.Select(x => x.sharedMesh.name).Distinct(); + foreach (var skinnedmeshName in skinnedmeshesName) + { + if (skinnedmeshName.Length > MAX_LENGTH) + yield return Validation.Error(string.Format("FileName '{0}' is too long. ", skinnedmeshName)); + } } ///