using System; using UnityEngine; namespace X.Rendering.Feature { public class FakeShadowPlayer : MonoBehaviour { private static readonly int PROP_LIGHTS_ARRAY = Shader.PropertyToID("_FakeShadowsLights"); private static readonly int PROP_PLAYER_SHADOW_POSITION = Shader.PropertyToID("_PlayerPosition"); private static readonly int PROP_FAKE_SHADOWS_ARGS = Shader.PropertyToID("_FakeShadowsArgs"); private static readonly Vector4 DEFAULT_LIGHT_VALUE = new Vector4(0f, 0f, 0f, 1f); private Vector4[] lightsData = new Vector4[4] { DEFAULT_LIGHT_VALUE, DEFAULT_LIGHT_VALUE, DEFAULT_LIGHT_VALUE, DEFAULT_LIGHT_VALUE }; [SerializeField] private Vector3 playerPositionOffset = new Vector3(0f, 0.1f, 0f); [SerializeField] private float playerRadius = 0.1f; [SerializeField, Range(0f, 1f)] private float shadowStrength = 0.7f; private void OnTriggerEnter(Collider other) { if (other.GetComponent() is FakeShadowLightConfig fsc && fsc) { lightsData = fsc.lightData; } } #if UNITY_EDITOR private void OnTriggerStay(Collider other) { if (other.GetComponent() is FakeShadowLightConfig fsc && fsc) { lightsData = fsc.lightData; } } #endif private void OnTriggerExit(Collider other) { lightsData[0] = DEFAULT_LIGHT_VALUE; lightsData[1] = DEFAULT_LIGHT_VALUE; lightsData[2] = DEFAULT_LIGHT_VALUE; lightsData[3] = DEFAULT_LIGHT_VALUE; } private void Update() { Shader.SetGlobalVectorArray(PROP_LIGHTS_ARRAY, lightsData); Shader.SetGlobalVector(PROP_PLAYER_SHADOW_POSITION, this.transform.position + playerPositionOffset); Shader.SetGlobalVector(PROP_FAKE_SHADOWS_ARGS, new Vector4(playerRadius, shadowStrength, 0, 0)); } } }