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;
}