using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Serialization; namespace NiloToon.NiloToonURP { [ExecuteAlways] public class NiloToonCharacterLightController : MonoBehaviour { internal static List AllNiloToonCharacterLightControllers = new(); //----------------------------------------------------------------------------- [Header("Main Light - Tint Color")] [OverrideDisplayName("Enable?")] [Revertible] public bool enableMainLightTintColor = false; [DisableIf("enableMainLightTintColor",false)] [OverrideDisplayName(" Color")] [Revertible] public Color mainLightTintColor = Color.white; [DisableIf("enableMainLightTintColor",false)] [OverrideDisplayName(" Intensity")] [Revertible] public float mainLightIntensityMultiplier = 1; //----------------------------------------------------------------------------- [Header("Main Light - Tint Color (by Light)")] [OverrideDisplayName("Enable?")] [Revertible] public bool enableMainLightTintColorByLight = false; [DisableIf("enableMainLightTintColorByLight",false)] [OverrideDisplayName(" Strength")] [Revertible] [Range(0,1)] public float mainLightTintColorByLight_Strength = 1; [DisableIf("enableMainLightTintColorByLight",false)] [OverrideDisplayName(" From Light")] //[Revertible] // won't work for reference type field public Light mainLightTintColorByLight_Target = null; [DisableIf("enableMainLightTintColorByLight",false)] [OverrideDisplayName(" Desaturate")] [Revertible] [Range(0,1)] public float mainLightTintColorByLight_Desaturate = 0; //----------------------------------------------------------------------------- [Header("Main Light - Add Color")] [OverrideDisplayName("Enable?")] [Revertible] public bool enableMainLightAddColor = false; [DisableIf("enableMainLightAddColor",false)] [OverrideDisplayName(" Color")] [Revertible] public Color mainLightAddColor = Color.black; [DisableIf("enableMainLightAddColor",false)] [OverrideDisplayName(" Intensity")] [Revertible] public float mainLightAddColorIntensity = 1; //----------------------------------------------------------------------------- [Header("Main Light - Add Color (by Light)")] [OverrideDisplayName("Enable?")] [Revertible] public bool enableMainLightAddColorByLight = false; [DisableIf("enableMainLightAddColorByLight",false)] [OverrideDisplayName(" Strength")] [Revertible] [Range(0,1)] public float mainLightAddColorByLight_Strength = 1; [DisableIf("enableMainLightAddColorByLight",false)] [OverrideDisplayName(" From Light")] //[Revertible] // won't work for reference type field public Light mainLightAddColorByLight_Target = null; [DisableIf("enableMainLightAddColorByLight",false)] [OverrideDisplayName(" Desaturate")] [Revertible] [Range(0,1)] public float mainLightAddColorByLight_Desaturate = 0; //----------------------------------------------------------------------------- [Header("Character Mask")] [HelpBox("- When List is empty, this script will apply to all characters.\n" + "- When List is not empty, this script will only apply to target characters in the list.")] [OverrideDisplayName("Enabled?")] [Revertible] public bool enableTargetCharacterMask = true; [OverrideDisplayName(" Mask")] public List targetCharactersMask = new(); private void OnEnable() { // https://docs.unity3d.com/ScriptReference/ExecuteAlways.html // If a MonoBehaviour runs Play logic in Play Mode and fails to check if its GameObject is part of the playing world, // a Prefab being edited in Prefab Mode may incorrectly trigger logic intended only to be run as part of the game. if (!Application.isPlaying || Application.IsPlaying(gameObject)) { AddToGlobalList(); } } private void OnDisable() { RemoveFromGlobalList(); } private void OnDestroy() { RemoveFromGlobalList(); } private void OnValidate() { mainLightIntensityMultiplier = Mathf.Max(0, mainLightIntensityMultiplier); mainLightAddColorIntensity = Mathf.Max(0, mainLightAddColorIntensity); } private void AddToGlobalList() { // Lazy init if (AllNiloToonCharacterLightControllers == null) AllNiloToonCharacterLightControllers = new List(); AllNiloToonCharacterLightControllers.Add(this); } private void RemoveFromGlobalList() { AllNiloToonCharacterLightControllers?.Remove(this); } internal bool AffectsCharacter(int characterID) { if (!enableTargetCharacterMask || targetCharactersMask == null || targetCharactersMask.Count == 0) return true; foreach (var character in targetCharactersMask) { if(!character) continue; if (character.characterID == characterID) return true; } return false; } } #if UNITY_EDITOR [CustomEditor(typeof(NiloToonCharacterLightController))] [CanEditMultipleObjects] public class NiloToonCharacterLightControllerUI : Editor { public override void OnInspectorGUI() { EditorGUILayout.HelpBox( "This script controls how NiloToon character(s) receive various kinds of lights.\n\n" + "All active NiloToonCharacterLightController(s) will be combined together behind the scene, then apply the final setting to each NiloToon character defining how they should receive lights.", MessageType.Info); DrawDefaultInspector(); } } #endif }