diff --git a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs index d25f25d..0d382ee 100644 --- a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs +++ b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs @@ -1,9 +1,4 @@ using UnityEngine; -using System; -using UnityEngine.Networking; -using System.Runtime.CompilerServices; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; using Unity.VisualScripting; using System.Collections.Generic; @@ -89,22 +84,34 @@ void ChangeShader(Material mat, string shaderName) /// public static void ChangeMtoon10ShaderToUnlitOfGameobject(GameObject targetObject) { - SkinnedMeshRenderer[] skinedMeshrenderers = targetObject.GetComponentsInChildren(); - foreach (SkinnedMeshRenderer renderer in skinedMeshrenderers) foreach (Material mat in renderer.materials) ChangeMToon10ShaderToUnlit(mat); - - MeshRenderer[] meshrenderers = targetObject.GetComponentsInChildren(); - foreach (MeshRenderer renderer in meshrenderers) foreach (Material mat in renderer.materials) ChangeMToon10ShaderToUnlit(mat); + ChangeToUnlitMaterialsRecursive(targetObject.transform); + static void ChangeToUnlitMaterialsRecursive(Transform target) + { + if (target.TryGetComponent(out var renderer)) + { + var materialsCopy = renderer.materials; + for (int i = 0; i < materialsCopy.Length; i++) + { + materialsCopy[i] = GetUnlitMaterialMadeByMToon10Shader(materialsCopy[i]); + } + renderer.materials = materialsCopy; + } + foreach (Transform child in target) + { + ChangeToUnlitMaterialsRecursive(child); + } + } } /// /// Change URP/MToon10 shader to URP/Unlit shader. /// /// - static void ChangeMToon10ShaderToUnlit(Material mat_original) + static Material GetUnlitMaterialMadeByMToon10Shader(Material mat_original) { if (mat_original.shader.name != "VRM10/Universal Render Pipeline/MToon10") { - return; // Exit if the shader is not MToon10 + return mat_original; // Exit if the shader is not MToon10 } // Create a temporary copy of the material to extract properties @@ -113,8 +120,26 @@ static void ChangeMToon10ShaderToUnlit(Material mat_original) // Create a new material with the Unlit shader Material newMat = new(Shader.Find("Universal Render Pipeline/Unlit")); - // Change the shader - newMat.shader = Shader.Find("Universal Render Pipeline/Unlit"); + // Handle Surface Type (Opaque/Transparent) + bool isTransparent = tempMat.GetFloat("_AlphaMode") > 0 || tempMat.GetFloat("_TransparentWithZWrite") > 0; + + if (isTransparent) + { + // Set surface type to Transparent and enable Alpha Clipping + newMat.SetFloat("_Surface", 1.0f); // Set to Transparent + newMat.SetFloat("_AlphaClip", 1.0f); // Enable Alpha Clipping + + // Set blend modes for transparent materials + newMat.SetFloat("_SrcBlend", (float)UnityEngine.Rendering.BlendMode.SrcAlpha); + newMat.SetFloat("_DstBlend", (float)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + newMat.SetFloat("_ZWrite", 0.0f); // Typically, ZWrite is off for transparent materials + } + else + { + // Set surface type to Opaque and disable Alpha Clipping + newMat.SetFloat("_Surface", 0.0f); // Set to Opaque + newMat.SetFloat("_AlphaClip", 0.0f); // Disable Alpha Clipping + } // Transfer texture and color properties if (tempMat.HasProperty("_MainTex") && newMat.HasProperty("_BaseMap")) @@ -132,34 +157,15 @@ static void ChangeMToon10ShaderToUnlit(Material mat_original) newMat.SetFloat("_Cutoff", tempMat.GetFloat("_Cutoff")); } - // Handle Surface Type (Opaque/Transparent) - bool isTransparent = tempMat.GetFloat("_AlphaMode") > 0 || tempMat.GetFloat("_TransparentWithZWrite") > 0; - if (isTransparent) - { - newMat.SetFloat("_Surface", 1.0f); // Set to Transparent - newMat.SetFloat("_AlphaClip", 1.0f); // Enable Alpha Clipping - } - else - { - newMat.SetFloat("_Surface", 0.0f); // Set to Opaque - newMat.SetFloat("_AlphaClip", 0.0f); // Disable Alpha Clipping - } - - // Set blend modes for transparent materials - if (isTransparent) - { - newMat.SetFloat("_SrcBlend", (float)UnityEngine.Rendering.BlendMode.SrcAlpha); - newMat.SetFloat("_DstBlend", (float)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); - newMat.SetFloat("_ZWrite", 0.0f); // Typically, ZWrite is off for transparent materials - } - // Dispose of the temporary material - UnityEngine.Object.DestroyImmediate(tempMat); + DestroyImmediate(tempMat); // Additional blend mode settings can be adjusted here if needed - // Apply the new material - mat_original = newMat; + // Set shader again (I don't know why this is necessary, but it doesn't work without it) + newMat.shader = Shader.Find("Universal Render Pipeline/Unlit"); + + return newMat; }