Files
2026-06-09 20:53:26 +09:00

79 lines
2.3 KiB
C#

using UnityEngine;
namespace ToonScapes.tools
{
[ExecuteAlways]
public class SunFacingFX : MonoBehaviour
{
[Tooltip("Optional manual assignment of the directional light (sun)")]
public Light sunLight;
[Tooltip("If enabled, will automatically find the scene's main directional light")]
public bool autoFindSun = true;
[Tooltip("If true, will rotate opposite to the light direction")]
public bool invertDirection = false;
[Tooltip("How smoothly the object rotates toward the light direction (0 = instant)")]
[Range(0f, 1f)]
public float smoothFactor = 0.2f;
private Quaternion targetRotation;
private void Update()
{
UpdateSunReference();
if (sunLight == null)
return;
RotateTowardsSun();
}
private void UpdateSunReference()
{
if (!autoFindSun)
return;
if (sunLight == null || sunLight.type != LightType.Directional)
{
// Try RenderSettings.sun first
sunLight = RenderSettings.sun;
// If none assigned, find the first directional light in the scene
if (sunLight == null)
{
foreach (var l in Object.FindObjectsByType<Light>(FindObjectsSortMode.None))
{
if (l.type == LightType.Directional)
{
sunLight = l;
break;
}
}
}
}
}
private void RotateTowardsSun()
{
Vector3 direction = invertDirection ? sunLight.transform.forward : -sunLight.transform.forward;
// Compute target rotation
targetRotation = Quaternion.LookRotation(direction, Vector3.up);
// Apply smooth rotation
if (smoothFactor > 0f)
{
float t = 1f - Mathf.Pow(1f - smoothFactor, Time.deltaTime * 60f);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, t);
}
else
{
transform.rotation = targetRotation;
}
}
}
}