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.2f; // Duration for the flash effect public float FadeDuration = 1.0f; // Duration for the fade effect public float MaxBloomAmount = 500.0f; // Maximum bloom amount public float MinBloomAmount = 1.0f; // Minimum bloom amount public float MaxBloomThreshold = 0.5f; // Maximum bloom threshold public float MinBloomThreshold = 0.0f; // Minimum bloom threshold 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); } else { Debug.LogError("Material is not assigned."); } } public void setChoice(string type) { switch (type) { case "save": // material.SetFloat("_BloomAmount", 1.0f); // material.SetFloat("_BloomThreshold", 0.0f); material.SetFloat("_FadeAmount", 1.0f); // StartCoroutine(FadeCoroutine("_FadeAmount", 0.0f, 1.0f, FlashDuration)); StartCoroutine(FadeCoroutine("_BloomIntensity", material.GetFloat("_BloomIntensity"), MaxBloomAmount, FlashDuration / 2)); StartCoroutine(FadeCoroutine("_BloomThreshold", material.GetFloat("_BloomThreshold"), MinBloomThreshold, FlashDuration / 2, () => { // After the fade is complete, reset the bloom amount to 1.0f StartCoroutine(FadeCoroutine("_BloomIntensity", material.GetFloat("_BloomIntensity"), MinBloomAmount, FlashDuration / 2, null, FlashDuration)); StartCoroutine(FadeCoroutine("_BloomThreshold", material.GetFloat("_BloomThreshold"), MaxBloomThreshold, FlashDuration / 2, () => { StartCoroutine(FadeCoroutine("_FadeAmount", material.GetFloat("_FadeAmount"), 0.0f, FadeDuration)); }, FlashDuration)); } )); break; case "discard": // material.SetFloat("_BloomAmount", 1.0f); // material.SetFloat("_BloomThreshold", 0.5f); // material.SetFloat("_FadeAmount", 0.0f); StartCoroutine(FadeCoroutine("_FadeAmount", material.GetFloat("_FadeAmount"), 0.0f, FadeDuration)); StartCoroutine(FadeCoroutine("_BloomIntensity", material.GetFloat("_BloomIntensity"), MinBloomAmount, FadeDuration)); break; case "reset": Reset(); break; default: Debug.LogWarning("Unknown effect type: " + type); break; } } }