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 // Start is called before the first frame update void Start() { if (rawImage == null) { rawImage = GetComponentInChildren(); } if (rawImage != null) { material = rawImage.material; // material = rawImage.GetComponent().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 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); 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)); }, 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(FadeCoroutine("_FadeAmount", material.GetFloat("_FadeAmount"), 0.0f, FadeDuration, null, ShortFadeDuration * FlashCount * 2)); break; case "reset": Reset(); break; default: Debug.LogWarning("Unknown effect type: " + type); break; } } }