#if UNITY_EDITOR using UnityEditor; using UnityEngine; using System.Collections.Generic; namespace Bitd { public class LiltoonShadowAdder : EditorWindow { private List gameObjects = new List(); // µå·¡±× ¾Ø µå·ÓÀ¸·Î ¹ÞÀº GameObject ¸ñ·Ï private string shaderNameToCheck = "lilToon"; // È®ÀÎÇÒ ½¦ÀÌ´õ À̸§ private string parameterNameToCheck = "_ShadowReceive"; // È®ÀÎÇÒ ÆÄ¶ó¹ÌÅÍ À̸§ [Range(0, 1f)] private float parameterValue = 1f; [MenuItem("Bitd/(¸±Å÷)±×¸²ÀÚ »ý¼º±â", false, 102)] public static void ShowWindow() { GetWindow("±×¸²ÀÚ »ý¼º±â"); } void OnGUI() { GUILayout.Label("¾Æ·¡¿¡ °ÔÀÓ¿ÀºêÁ§Æ®µéÀ» ³Ö¾îÁÖ¼¼¿ä", EditorStyles.boldLabel); GUILayout.Label("¼ÓÇÏ´Â ¸ÓƼ¸®¾óÀÇ \"±×¸²ÀÚ¸¦ ¹Þ´Â\" °ªÀÌ Àϰý ¼öÁ¤µË´Ï´Ù.", EditorStyles.helpBox); // µå·¡±× ¾Ø µå·Ó ±¸¿ª »ý¼º GUILayout.Space(10); GUILayout.Label("¼öÁ¤ÇÒ °ÔÀÓ¿ÀºêÁ§Æ®µé:", EditorStyles.helpBox); Rect dropArea = GUILayoutUtility.GetRect(0, 50, GUILayout.ExpandWidth(true)); HandleDragAndDrop(dropArea); // µå·¡±×µÈ °ÔÀÓ ¿ÀºêÁ§Æ® ¸®½ºÆ® Ç¥½Ã GUILayout.Label("Ãß°¡µÈ °ÔÀÓ¿ÀºêÁ§Æ®:", EditorStyles.boldLabel); foreach (var go in gameObjects) { EditorGUILayout.ObjectField(go, typeof(GameObject), true); } GUILayout.Space(5); // Àû¿ë ¹öư if (GUILayout.Button("±×¸²ÀÚ¸¦ ¹Þ´Â = 1·Î ¸¸µé±â")) { ModifyMaterials(); gameObjects.Clear(); } } // µå·¡±× ¾Ø µå·Ó ó¸® void HandleDragAndDrop(Rect dropArea) { Event evt = Event.current; switch (evt.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!dropArea.Contains(evt.mousePosition)) return; DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (evt.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (Object draggedObject in DragAndDrop.objectReferences) { if (draggedObject is GameObject) { gameObjects.Add((GameObject)draggedObject); // °ÔÀÓ ¿ÀºêÁ§Æ® Ãß°¡ } } evt.Use(); } break; } } // MaterialÀ» ã¾Æ¼­ ÆÄ¶ó¹ÌÅ͸¦ ¼öÁ¤ÇÏ´Â ÇÔ¼ö void ModifyMaterials() { foreach (GameObject go in gameObjects) { if (go == null) continue; // °ÔÀÓ ¿ÀºêÁ§Æ®¿Í ÀÚ½Ä ¿ÀºêÁ§Æ®µé °¡Á®¿À±â List renderers = FindAllRenderers(go); foreach (Renderer renderer in renderers) { // °¢ ·»´õ·¯¿¡¼­ »ç¿ëÇÏ´Â ¸ðµç ¸ÓƼ¸®¾ó È®ÀÎ foreach (Material material in renderer.sharedMaterials) { if (material != null && material.shader != null) { // ƯÁ¤ ½¦ÀÌ´õÀÎÁö È®ÀÎ if (material.shader.name.Contains(shaderNameToCheck)) { // ÆÄ¶ó¹ÌÅͰ¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÏ°í ¼öÁ¤ if (material.HasProperty(parameterNameToCheck)) { material.SetFloat(parameterNameToCheck, parameterValue); Debug.Log($"{go.name}¿¡ ÀÖ´Â {material.name} ¸ÓƼ¸®¾óÀÌ ¼öÁ¤µÇ¾ú¾î¿ä!"); } else { Debug.Log($"{go.name}ÀÇ {material.name} ¸ÓƼ¸®¾ó¿¡´Â ÇØ´ç °ªÀÌ ¾ø¾ú¾î¿ä!"); } } } } } } // º¯°æ »çÇ× ÀúÀå AssetDatabase.SaveAssets(); } // ºñȰ¼ºÈ­µÈ ¿ÀºêÁ§Æ®±îÁö Æ÷ÇÔÇÑ ¸ðµç ·»´õ·¯¸¦ ã´Â ÇÔ¼ö List FindAllRenderers(GameObject obj) { List allRenderers = new List(); // ºñȰ¼ºÈ­µÈ ¿ÀºêÁ§Æ®µµ Æ÷ÇÔÇÏ¿© ¸ðµç ¿ÀºêÁ§Æ® ¼öÁý Object[] allObjects = EditorUtility.CollectDeepHierarchy(new Object[] { obj }); // °¢ ¿ÀºêÁ§Æ®¿¡¼­ Renderer ÄÄÆ÷³ÍÆ® ÃßÃâ foreach (Object o in allObjects) { if (o is GameObject) { GameObject go = (GameObject)o; Renderer[] renderers = go.GetComponentsInChildren(true); // true¸¦ »ç¿ëÇØ ºñȰ¼ºÈ­µÈ ÀڽıîÁö Æ÷ÇÔ allRenderers.AddRange(renderers); } } return allRenderers; } } } #endif