2025-10-21 14:18:31 +09:00

165 lines
4.8 KiB
C#

// Stylized Water 3 by Staggart Creations (http://staggart.xyz)
// COPYRIGHT PROTECTED UNDER THE UNITY ASSET STORE EULA (https://unity.com/legal/as-terms)
// • Copying or referencing source code for the production of new asset store, or public, content is strictly prohibited!
// • Uploading this file to a public repository will subject it to an automated DMCA takedown request.
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace StylizedWater3
{
[ExecuteAlways]
[AddComponentMenu("Stylized Water 3/Water Custom Time")]
public class SetCustomWaterTime : MonoBehaviour
{
public enum Mode
{
None,
Interval,
Time,
EditorTime,
Speed,
[InspectorName("System Time (UTC)")]
SystemTime,
Custom
}
public Mode mode = Mode.Custom;
//Parameters for different modes
[Min(0.02f)]
public float interval = 0.2f;
public float speed = 0f;
[Min(0f)]
public float customTime = 0f;
private float elapsedTime;
private DateTime _startTime;
private void OnEnable()
{
RenderPipelineManager.beginContextRendering += OnBeginFrame;
_startTime = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0);
}
private void OnBeginFrame(ScriptableRenderContext context, List<Camera> cams)
{
SetTime();
}
private void SetTime()
{
#if UNITY_EDITOR
if (mode == Mode.EditorTime)
{
WaterObject.CustomTime = (float)UnityEditor.EditorApplication.timeSinceStartup;
return;
}
#endif
if (mode == Mode.None)
{
ResetTime();
return;
}
if (mode == Mode.Interval)
{
elapsedTime += Time.deltaTime;
if (elapsedTime >= interval)
{
elapsedTime = 0;
WaterObject.CustomTime = Time.time;
}
}
else if (mode == Mode.Time)
{
WaterObject.CustomTime = Time.time;
}
else if (mode == Mode.Speed)
{
elapsedTime += Time.deltaTime * speed;
WaterObject.CustomTime = elapsedTime;
}
else if (mode == Mode.SystemTime)
{
WaterObject.CustomTime = (float)(DateTime.UtcNow - _startTime).TotalMilliseconds * 0.001f;
}
else if (mode == Mode.Custom)
{
WaterObject.CustomTime = customTime;
}
}
private void ResetTime()
{
elapsedTime = 0f;
//Revert to using normal time
WaterObject.CustomTime = -1;
}
private void OnDisable()
{
RenderPipelineManager.beginContextRendering -= OnBeginFrame;
ResetTime();
}
}
#if UNITY_EDITOR
[CustomEditor(typeof(SetCustomWaterTime))]
public class SetCustomWaterTimeEditor : Editor
{
private SerializedProperty mode;
private SerializedProperty interval;
private SerializedProperty speed;
private SerializedProperty customTime;
private void OnEnable()
{
mode = serializedObject.FindProperty("mode");
interval = serializedObject.FindProperty("interval");
speed = serializedObject.FindProperty("speed");
customTime = serializedObject.FindProperty("customTime");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(mode);
if (mode.intValue == (int)SetCustomWaterTime.Mode.Interval)
{
EditorGUILayout.PropertyField(interval);
}
else if (mode.intValue == (int)SetCustomWaterTime.Mode.Speed)
{
EditorGUILayout.PropertyField(speed);
}
else if (mode.intValue == (int)SetCustomWaterTime.Mode.Custom)
{
EditorGUILayout.PropertyField(customTime);
}
if(WaterObject.CustomTime > 0 && mode.intValue != (int)SetCustomWaterTime.Mode.Custom) EditorGUILayout.HelpBox($"Time: {WaterObject.CustomTime}", MessageType.None);
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
}
}
}
#endif
}