diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs index 39c9877c0..d30f029bc 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs @@ -18,6 +18,16 @@ namespace VRMShaders m_externalMap = externalMaterialMap; } + static Dictionary s_fallbackShaders = new Dictionary + { + {"VRM/UnlitTexture", "Unlit/Texture"}, + {"VRM/UnlitTransparent", "Unlit/Transparent"}, + {"VRM/UnlitCutout", "Unlit/Transparent Cutout"}, + // 互換性は無いがとりあえず、 + {"VRM/UnlitTransparentZWrite", "VRM/MToon"}, + {"UniGLTF/StandardVColor", UniGLTF.UniUnlit.Utils.ShaderName}, + }; + public struct MaterialLoadInfo { public readonly Material Asset; @@ -109,29 +119,47 @@ namespace VRMShaders getTexture = (_) => Task.FromResult(null); } - material = new Material(Shader.Find(matDesc.ShaderName)); + var shaderName = matDesc.ShaderName; + if (String.IsNullOrEmpty(shaderName)) + { + throw new Exception("no shader name"); + } + if (s_fallbackShaders.TryGetValue(shaderName, out string fallback)) + { + Debug.LogWarning($"fallback: {shaderName} => {fallback}"); + shaderName = fallback; + } + + var shader = Shader.Find(shaderName); + if (shader == null) + { + throw new Exception($"shader: {shaderName} not found"); + } + + material = new Material(shader); material.name = matDesc.SubAssetKey.Name; - foreach(var kv in matDesc.TextureSlots) + foreach (var kv in matDesc.TextureSlots) { var texture = await getTexture(kv.Value); - if(texture!=null){ + if (texture != null) + { material.SetTexture(kv.Key, texture); SetTextureOffsetAndScale(material, kv.Key, kv.Value.Offset, kv.Value.Scale); } } - foreach(var kv in matDesc.Colors) + foreach (var kv in matDesc.Colors) { material.SetColor(kv.Key, kv.Value); } - foreach(var kv in matDesc.Vectors) + foreach (var kv in matDesc.Vectors) { material.SetVector(kv.Key, kv.Value); } - foreach(var kv in matDesc.FloatValues) + foreach (var kv in matDesc.FloatValues) { material.SetFloat(kv.Key, kv.Value); } @@ -141,7 +169,7 @@ namespace VRMShaders material.renderQueue = matDesc.RenderQueue.Value; } - foreach(var action in matDesc.Actions) + foreach (var action in matDesc.Actions) { action(material); } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/VRMShaders.GLTF.IO.Runtime.asmdef b/Assets/VRMShaders/GLTF/IO/Runtime/VRMShaders.GLTF.IO.Runtime.asmdef index a0e6a1dc5..ae4551ebf 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/VRMShaders.GLTF.IO.Runtime.asmdef +++ b/Assets/VRMShaders/GLTF/IO/Runtime/VRMShaders.GLTF.IO.Runtime.asmdef @@ -1,13 +1,14 @@ { "name": "VRMShaders.GLTF.IO.Runtime", - "references": [], + "references": [ + "VRMShaders.GLTF.UniUnlit.Runtime" + ], + "optionalUnityReferences": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": false, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false + "defineConstraints": [] } \ No newline at end of file