Streamingle_URP/Assets/External/NiloToonURP/Runtime/NiloToonCharacterLightController.cs
2025-10-31 03:28:00 +09:00

179 lines
6.5 KiB
C#

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<NiloToonCharacterLightController> 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<NiloToonPerCharacterRenderController> 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<NiloToonCharacterLightController>();
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
}