Files
beyond/Assets/ThirdParty/Invector-3rdPersonController/Basic Locomotion/Scripts/Generic/Utils/vSkyboxFade.cs
2024-11-20 15:21:28 +01:00

135 lines
5.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Invector
{
[vClassHeader("Skybox Fade", helpBoxText = "A Skybox with Cubemap type is Required to use this Component", useHelpBox = true)]
public class vSkyboxFade : vMonoBehaviour
{
public SkyboxFadeSettings defaultSkyboxSettings;
public List<SkyboxFadeSettings> fadeSettings;
SkyboxFadeSettings currentFadeSettings;
SkyboxFadeSettings lastFadeSettings;
SkyboxFadeSettings targetFadeSettings;
Material skybox;
bool exitRoutine;
private void Start()
{
skybox = RenderSettings.skybox;
lastFadeSettings = new SkyboxFadeSettings();
//defaultSkyboxSettings = new SkyboxFadeSettings(skybox);
currentFadeSettings = defaultSkyboxSettings.Copy();
currentFadeSettings = new SkyboxFadeSettings(skybox);
skybox.SetColor("_Tint", defaultSkyboxSettings.tint);
skybox.SetFloat("_Exposure", defaultSkyboxSettings.exposure);
skybox.SetFloat("_Rotation", defaultSkyboxSettings.rotation);
}
private void OnApplicationQuit()
{
skybox.SetColor("_Tint", defaultSkyboxSettings.tint);
skybox.SetFloat("_Exposure", defaultSkyboxSettings.exposure);
skybox.SetFloat("_Rotation", defaultSkyboxSettings.rotation);
}
public void Fade(string _fadeName)
{
targetFadeSettings = fadeSettings.Find(f => f.name.Equals(_fadeName));
if (targetFadeSettings != null)
{
exitRoutine = true;
StartCoroutine(FadeRoutine());
}
}
public void FadeToDefault()
{
targetFadeSettings = defaultSkyboxSettings.Copy();
exitRoutine = true;
StartCoroutine(FadeRoutine());
}
IEnumerator FadeRoutine()
{
yield return new WaitForEndOfFrame();
exitRoutine = false;
//defaultSkyboxSettings.curve = defaultCurve;
//defaultSkyboxSettings.fadeTime = defaultFadeTime;
lastFadeSettings.tint = currentFadeSettings.tint;
lastFadeSettings.exposure = currentFadeSettings.exposure;
lastFadeSettings.rotation = currentFadeSettings.rotation;
float timer = 0;
if (!(lastFadeSettings.tint == targetFadeSettings.tint && lastFadeSettings.exposure == targetFadeSettings.exposure && targetFadeSettings.rotation == lastFadeSettings.rotation))
{
do
{
currentFadeSettings.tint = Color.Lerp(lastFadeSettings.tint, targetFadeSettings.tint, targetFadeSettings.curve.Evaluate(timer));
currentFadeSettings.exposure = Mathf.Lerp(lastFadeSettings.exposure, targetFadeSettings.exposure, targetFadeSettings.curve.Evaluate(timer));
currentFadeSettings.rotation = Mathf.Lerp(lastFadeSettings.rotation, targetFadeSettings.rotation, targetFadeSettings.curve.Evaluate(timer));
skybox.SetColor("_Tint", currentFadeSettings.tint);
skybox.SetFloat("_Exposure", currentFadeSettings.exposure);
skybox.SetFloat("_Rotation", currentFadeSettings.rotation);
yield return null;
if (timer >= 1)
{
break;
}
timer += Time.fixedDeltaTime / targetFadeSettings.fadeTime;
}
while (!exitRoutine);
}
}
[System.Serializable]
public class SkyboxFadeSettings
{
public string name = "My SkySettings";
public AnimationCurve curve = AnimationCurve.Linear(0.0f, 0.0f, 1.0f, 1.0f);
public float fadeTime = 1f;
public Color tint = new Color(0.5f, 0.5f, 0.5f, 0.5f);
[Range(0f, 8f)]
public float exposure = 1f;
[Range(0f, 360f)]
public float rotation = 0f;
public SkyboxFadeSettings()
{
}
public SkyboxFadeSettings(Material mat)
{
tint = mat.GetColor("_Tint");
exposure = mat.GetFloat("_Exposure");
rotation = mat.GetFloat("_Rotation");
}
public void CopyMaterial(Material mat)
{
tint = mat.GetColor("_Tint");
exposure = mat.GetFloat("_Exposure");
rotation = mat.GetFloat("_Rotation");
}
public SkyboxFadeSettings Copy()
{
var fadeSettings = new SkyboxFadeSettings();
fadeSettings.curve = curve;
fadeSettings.fadeTime = fadeTime;
fadeSettings.tint = tint;
fadeSettings.exposure = exposure;
fadeSettings.rotation = rotation;
return fadeSettings;
}
}
}
}