2025-07-22 15:39:27 +08:00

61 lines
2.1 KiB
C#

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<FakeShadowLightConfig>() is FakeShadowLightConfig fsc && fsc)
{
lightsData = fsc.lightData;
}
}
#if UNITY_EDITOR
private void OnTriggerStay(Collider other)
{
if (other.GetComponent<FakeShadowLightConfig>() 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));
}
}
}