using UnityEngine; using UnityEditor; using System.Collections.Generic; public class LightLogicPreset : ScriptableObject { public List lampRendererNames = new(); public List lightRendererNames = new(); public Material lampRendererMaterial; public Material lightRendererMaterial; public Color lightColour; public string newChildObjectName = "LightLogic"; public bool onlyUseActiveLights = true; } public class AutoSetupLightLogic : EditorWindow { private LightLogicPreset preset; [MenuItem("Tools/Auto Setup Light Logic")] public static void ShowWindow() { GetWindow("Auto Setup Light Logic"); } private void OnGUI() { GUILayout.Label("Auto Setup Light Logic", EditorStyles.boldLabel); GUILayout.Space(5); preset = (LightLogicPreset)EditorGUILayout.ObjectField("Preset", preset, typeof(LightLogicPreset), false); if (preset == null) { EditorGUILayout.HelpBox("Assign a Light Logic Preset to continue.", MessageType.Info); if (GUILayout.Button("Create New Preset")) { CreateNewPreset(); } return; } GUILayout.Space(10); if (GUILayout.Button("Setup Light Logic for Selected Objects")) { SetupForSelectedObjects(); } if (GUILayout.Button("Apply Preset To Existing Light Logic")) { ApplyToExistingLightLogic(); } GUILayout.Space(10); if (GUILayout.Button("Save Current Preset")) { EditorUtility.SetDirty(preset); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } private void CreateNewPreset() { string path = EditorUtility.SaveFilePanelInProject("Create Light Logic Preset", "New Light Logic Preset", "asset", "Please enter a file name to save the preset to"); if (!string.IsNullOrEmpty(path)) { var newPreset = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(newPreset, path); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); preset = newPreset; } } private void SetupForSelectedObjects() { foreach (var obj in Selection.gameObjects) { Undo.RegisterFullObjectHierarchyUndo(obj, "Setup Light Logic"); GameObject logicGO = new GameObject(preset.newChildObjectName); logicGO.transform.SetParent(obj.transform); logicGO.transform.localPosition = Vector3.zero; var logic = logicGO.AddComponent(); logic._lampRendererMaterial = preset.lampRendererMaterial; logic._lightRendererMaterial = preset.lightRendererMaterial; logic._lightColour = preset.lightColour; logic._lampRenderer = FindRenderersByNames(obj.transform, preset.lampRendererNames); logic._lightRend = FindRenderersByNames(obj.transform, preset.lightRendererNames); logic._light = FindLightsInParent(obj.transform, preset.onlyUseActiveLights); EditorUtility.SetDirty(logic); } } private void ApplyToExistingLightLogic() { foreach (var obj in Selection.gameObjects) { var logic = obj.GetComponentInChildren(); if (logic == null) continue; Undo.RecordObject(logic, "Update Light Logic Settings"); logic._lampRendererMaterial = preset.lampRendererMaterial; logic._lightRendererMaterial = preset.lightRendererMaterial; logic._lightColour = preset.lightColour; logic._lampRenderer = FindRenderersByNames(obj.transform, preset.lampRendererNames); logic._lightRend = FindRenderersByNames(obj.transform, preset.lightRendererNames); logic._light = FindLightsInParent(obj.transform, preset.onlyUseActiveLights); EditorUtility.SetDirty(logic); } } private Renderer[] FindRenderersByNames(Transform parent, List names) { List result = new(); foreach (Transform child in parent.GetComponentsInChildren(true)) { if (names.Contains(child.name)) { var renderer = child.GetComponent(); if (renderer != null) { result.Add(renderer); } } } return result.ToArray(); } private Light[] FindLightsInParent(Transform parent, bool onlyActive) { List lights = new(); foreach (var light in parent.GetComponentsInChildren(true)) { if (!onlyActive || light.gameObject.activeInHierarchy) { lights.Add(light); } } return lights.ToArray(); } }