151 lines
4.9 KiB
C#
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();
|
|
}
|
|
}
|