Heroes_of_Hiis/Assets/Polaris - Low Poly Ecosystem/Poseidon - Low Poly Water S.../Sample/Scripts/LightController.cs

137 lines
3.9 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Rendering;
namespace Pinwheel.Poseidon
{
[ExecuteInEditMode]
public class LightController : MonoBehaviour
{
public Light lightComponent;
public Rect moveArea;
public float moveSpeed = 10;
public float hueSpeed = 10;
public float saturationSpeed = 20;
public float valueSpeed = 30;
public float intensitySpeed = 10;
public float baseIntensity = 3;
public float yPos = 3;
private Vector3 actualTarget;
private Vector3 lookAtTarget;
private float hue;
private float saturation;
private float value;
private float intensity;
private int frameCount = 0;
private const float DELTA_TIME = 0.0167f;
private void OnEnable()
{
hue = Random.value * 360;
saturation = Random.value * 100;
value = Random.value * 100;
intensity = Random.value;
frameCount = 0;
SampleActualTarget();
Camera.onPreCull += OnPreCullCamera;
#if POSEIDON_URP
RenderPipelineManager.beginCameraRendering += OnBeginCameraRenderingSRP;
#endif
}
private void OnDisable()
{
Camera.onPreCull -= OnPreCullCamera;
#if POSEIDON_URP
RenderPipelineManager.beginCameraRendering -= OnBeginCameraRenderingSRP;
#endif
}
public void OnPreCullCamera(Camera cam)
{
Animate();
}
private void OnBeginCameraRenderingSRP(ScriptableRenderContext context, Camera cam)
{
Animate();
}
private void Animate()
{
if (!moveArea.Contains(new Vector2(actualTarget.x, actualTarget.y)) ||
IsCloseEnoughToTarget())
{
SampleActualTarget();
}
frameCount += 1;
if (frameCount >= 2)
{
SampleLookatTarget();
frameCount = 0;
}
Vector3 dir = (lookAtTarget - transform.position).normalized;
Vector3 forward = Vector3.MoveTowards(transform.forward, dir, 3 * DELTA_TIME);
transform.forward = forward;
transform.position += forward * moveSpeed * DELTA_TIME;
if (lightComponent != null)
{
hue += hueSpeed * DELTA_TIME;
saturation += saturationSpeed * DELTA_TIME;
value += valueSpeed * DELTA_TIME;
intensity += intensitySpeed * DELTA_TIME;
Color c = Color.HSVToRGB(
Mathf.Sin(hue * Mathf.Deg2Rad) * 0.5f + 0.5f,
Mathf.Sin(saturation * Mathf.Deg2Rad) * 0.5f + 0.5f,
Mathf.Sin(value * Mathf.Deg2Rad) * 0.5f + 0.5f);
lightComponent.color = c;
lightComponent.intensity = baseIntensity * (Mathf.Sin(intensity * Mathf.Deg2Rad) * 0.5f + 0.5f);
}
}
private bool IsCloseEnoughToTarget()
{
float threshold = 10;
return Vector3.Distance(transform.position, actualTarget) <= threshold;
}
private void SampleActualTarget()
{
float randX = Random.value;
float randY = Random.value;
actualTarget = new Vector3(
Mathf.Lerp(moveArea.min.x, moveArea.max.x, randX),
yPos,
Mathf.Lerp(moveArea.min.y, moveArea.max.y, randY));
}
private void SampleLookatTarget()
{
Vector3 p = Random.insideUnitSphere * 50;
p.y = 0;
lookAtTarget = actualTarget + p;
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawCube(actualTarget, Vector3.one);
Gizmos.DrawRay(transform.position, transform.forward);
}
}
}