You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

160 lines
5.2 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SetChoiceEffect : MonoBehaviour
{
[SerializeField]
public RawImage rawImage;
Material material;
public float FlashDuration = 0.1f; // Duration for the flash effect
public float FadeDuration = 1.0f; // Duration for the fade effect
public float MinFadeAmount = 0.2f; // Minimum fade amount for discard effect
public int FlashCount = 3; // Number of flashes for discard effect
public float ShortFadeDuration = 0.1f; // Duration for short fade effect
public float ImageOffsetY = 0.05f; // Offset for the image in the shader
public CanvasGroup mainCanvas;
// Start is called before the first frame update
void Start()
{
if (rawImage == null)
{
rawImage = GetComponentInChildren<RawImage>();
}
if (rawImage != null)
{
material = rawImage.material;
// material = rawImage.GetComponent<Renderer>().material;
setChoice("reset"); // Set default effect
}
else
{
Debug.LogError("RawImage component not found on this GameObject.");
}
}
// Update is called once per frame
void Update()
{
material.SetFloat("_OffsetY", ImageOffsetY);
}
private IEnumerator FadeCanvasGroup(CanvasGroup canvasGroup, float startAlpha, float endAlpha, float duration, Action onComplete = null, float delay = 0f)
{
if (delay > 0f)
yield return new WaitForSeconds(delay);
canvasGroup.alpha = startAlpha;
float elapsedTime = 0f;
while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
canvasGroup.alpha = Mathf.Lerp(startAlpha, endAlpha, elapsedTime / duration);
yield return null;
}
canvasGroup.alpha = endAlpha;
onComplete?.Invoke();
}
private IEnumerator FadeCoroutine(string name, float from, float to, float duration, Action onComplete = null, float delay = 0f)
{
if (delay > 0f)
yield return new WaitForSeconds(delay);
float elapsedTime = 0f;
while (elapsedTime < duration)
{
float t = elapsedTime / duration;
// Ease in-out (smoothstep)
float easeT = t * t * (3f - 2f * t);
float value = Mathf.Lerp(from, to, easeT);
material.SetFloat(name, value);
elapsedTime += Time.deltaTime;
yield return null;
}
material.SetFloat(name, to); // Ensure final value is set
onComplete?.Invoke(); // Invoke the callback if provided
}
public void Reset()
{
if (material != null)
{
// material.SetFloat("_BloomIntensity", MinBloomAmount);
// material.SetFloat("_BloomThreshold", MaxBloomThreshold);
material.SetFloat("_FadeAmount", 1.0f);
// mainCanvas.alpha = 1.0f; // Reset canvas alpha
material.SetFloat("_FlashAmount", 0.0f);
}
else
{
Debug.LogError("Material is not assigned.");
}
}
public void setChoice(string type)
{
switch (type)
{
case "save":
material.SetFloat("_FadeAmount", 1.0f);
StartCoroutine(FadeCoroutine("_FlashAmount", 0.0f, 1.0f, FlashDuration / 2,
() =>
{
StartCoroutine(FadeCoroutine("_FlashAmount", material.GetFloat("_FlashAmount"), 0.0f, FlashDuration / 2, () =>
{
StartCoroutine(FadeCoroutine("_FadeAmount", material.GetFloat("_FadeAmount"), 0.0f, FadeDuration));
// StartCoroutine(FadeCanvasGroup(mainCanvas, mainCanvas.alpha, 0.0f, FadeDuration,null, FlashDuration));
}, FlashDuration));
}
));
break;
case "discard":
for (int i = 0; i < FlashCount; ++i)
{
StartCoroutine(FadeCoroutine("_FadeAmount", 1.0f, MinFadeAmount, ShortFadeDuration, () =>
{
StartCoroutine(FadeCoroutine("_FadeAmount", MinFadeAmount, 1.0f, ShortFadeDuration));
}, i * ShortFadeDuration * 2));
// StartCoroutine(FadeCanvasGroup(mainCanvas, 1.0f, MinFadeAmount, ShortFadeDuration, () =>
// {
// StartCoroutine(FadeCanvasGroup(mainCanvas, MinFadeAmount, 1.0f, ShortFadeDuration));
// }, i * ShortFadeDuration * 2));
}
StartCoroutine(FadeCoroutine("_FadeAmount", material.GetFloat("_FadeAmount"), 0.0f, FadeDuration, null, ShortFadeDuration * FlashCount * 2));
// StartCoroutine(FadeCanvasGroup(mainCanvas, mainCanvas.alpha, 0.0f, FadeDuration, null, ShortFadeDuration * FlashCount * 2));
break;
case "reset":
Reset();
break;
default:
Debug.LogWarning("Unknown effect type: " + type);
break;
}
}
}