Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/VRScreenFade.cs
2026-02-21 16:45:37 +08:00

177 lines
3.4 KiB
C#

using System.Collections;
using BitStrap;
using UnityEngine;
public class VRScreenFade : MonoBehaviour
{
[Tooltip("Fade duration")]
public float fadeTime = 2f;
[Tooltip("Screen color at maximum fade")]
public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1f);
public bool fadeOnStart = true;
public int renderQueue = 5000;
private float uiFadeAlpha;
[ReadOnly]
public MeshRenderer fadeRenderer;
[ReadOnly]
public MeshFilter fadeMesh;
[ReadOnly]
public Material fadeMaterial;
[ReadOnly]
public bool isFading;
public float currentAlpha { get; private set; }
private void Awake()
{
fadeMaterial = new Material(Shader.Find("Oculus/Unlit Transparent Color"));
fadeMesh = base.gameObject.AddComponent<MeshFilter>();
fadeRenderer = base.gameObject.AddComponent<MeshRenderer>();
Mesh mesh = new Mesh();
fadeMesh.mesh = mesh;
Vector3[] array = new Vector3[4];
float num = 2f;
float num2 = 2f;
float z = 1f;
array[0] = new Vector3(0f - num, 0f - num2, z);
array[1] = new Vector3(num, 0f - num2, z);
array[2] = new Vector3(0f - num, num2, z);
array[3] = new Vector3(num, num2, z);
mesh.vertices = array;
mesh.triangles = new int[6] { 0, 2, 1, 2, 3, 1 };
mesh.normals = new Vector3[4]
{
-Vector3.forward,
-Vector3.forward,
-Vector3.forward,
-Vector3.forward
};
mesh.uv = new Vector2[4]
{
new Vector2(0f, 0f),
new Vector2(1f, 0f),
new Vector2(0f, 1f),
new Vector2(1f, 1f)
};
SetFadeLevel(0f);
}
public void FadeOut()
{
StartCoroutine(Fade(0f, 1f));
}
public void FadeIn()
{
StartCoroutine(Fade(1f, 0f));
}
public void Fade(float value, float time, bool startInput = false)
{
if (time == 0f)
{
currentAlpha = value;
SetMaterialAlpha();
}
else if (!startInput)
{
StartCoroutine(Fade(fadeMaterial.color.a, value));
}
}
private void OnLevelFinishedLoading(int level)
{
StartCoroutine(Fade(1f, 0f));
}
private void Start()
{
if (fadeOnStart)
{
StartCoroutine(Fade(1f, 0f));
}
}
private void OnEnable()
{
if (!fadeOnStart)
{
SetFadeLevel(0f);
}
}
private void OnDestroy()
{
if (fadeRenderer != null)
{
Object.Destroy(fadeRenderer);
}
if (fadeMaterial != null)
{
Object.Destroy(fadeMaterial);
}
if (fadeMesh != null)
{
Object.Destroy(fadeMesh);
}
}
public void SetUIFade(float level)
{
uiFadeAlpha = Mathf.Clamp01(level);
SetMaterialAlpha();
}
public void SetFadeLevel(float level)
{
currentAlpha = level;
SetMaterialAlpha();
}
private IEnumerator Fade(float startAlpha, float endAlpha)
{
float elapsedTime = 0f;
while (elapsedTime < fadeTime)
{
elapsedTime += Time.deltaTime;
currentAlpha = Mathf.Lerp(startAlpha, endAlpha, Mathf.Clamp01(elapsedTime / fadeTime));
SetMaterialAlpha();
yield return new WaitForEndOfFrame();
}
}
private IEnumerator Fade(float startAlpha, float endAlpha, float time)
{
float elapsedTime = 0f;
while (elapsedTime < time)
{
elapsedTime += Time.deltaTime;
currentAlpha = Mathf.Lerp(startAlpha, endAlpha, Mathf.Clamp01(elapsedTime / time));
SetMaterialAlpha();
yield return new WaitForEndOfFrame();
}
}
private void SetMaterialAlpha()
{
Color color = fadeColor;
color.a = Mathf.Max(currentAlpha, uiFadeAlpha);
isFading = color.a > 0f;
if (fadeMaterial != null)
{
fadeMaterial.color = color;
fadeMaterial.renderQueue = renderQueue;
fadeRenderer.material = fadeMaterial;
fadeRenderer.enabled = isFading;
}
}
}