Files
HauntedBloodlines/Assets/Editor/LightLogicPreset.cs
2025-05-29 22:31:40 +03:00

151 lines
4.9 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
public class LightLogicPreset : ScriptableObject
{
public List<string> lampRendererNames = new();
public List<string> 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<AutoSetupLightLogic>("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<LightLogicPreset>();
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<ChangeLightColour>();
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<ChangeLightColour>();
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<string> names)
{
List<Renderer> result = new();
foreach (Transform child in parent.GetComponentsInChildren<Transform>(true))
{
if (names.Contains(child.name))
{
var renderer = child.GetComponent<Renderer>();
if (renderer != null)
{
result.Add(renderer);
}
}
}
return result.ToArray();
}
private Light[] FindLightsInParent(Transform parent, bool onlyActive)
{
List<Light> lights = new();
foreach (var light in parent.GetComponentsInChildren<Light>(true))
{
if (!onlyActive || light.gameObject.activeInHierarchy)
{
lights.Add(light);
}
}
return lights.ToArray();
}
}