using UnityEngine; using UnityEngine.UI; using DG.Tweening; using Yarn.Unity; public class ScreenEffectManager : MonoBehaviour { public static ScreenEffectManager Instance { get; private set; } public Image blackoutPanel; // 黑屏面板 public Image redFlashPanel; // 红色闪烁面板 public float shakeDuration = 1.0f; // 震屏持续时间 public float shakeIntensity = 0.1f; // 震屏强度 private Vector3 originalCameraPosition; private void Awake() { // 确保单例模式 if (Instance != null && Instance != this) { Destroy(gameObject); } else { Instance = this; DontDestroyOnLoad(gameObject); // 可选:保持在场景加载之间 } } private void Start() { // 保存初始相机位置 originalCameraPosition = Camera.main.transform.localPosition; } // 震屏效果 [YarnCommand("shakeScreen")] public void ShakeScreen() { Camera.main.transform.DOPunchPosition(Vector3.one * shakeIntensity, shakeDuration, 10, 1); } // 黑屏淡入淡出效果 [YarnCommand("fadeIn")] public void FadeBlackout(bool enable, float duration) { if (enable) { blackoutPanel.gameObject.SetActive(true); blackoutPanel.DOFade(1, duration).OnComplete(() => blackoutPanel.gameObject.SetActive(true)); } else { blackoutPanel.DOFade(0, duration).OnComplete(() => blackoutPanel.gameObject.SetActive(false)); } } // 红色闪烁效果 [YarnCommand("flashRed")] public void FlashRed(float duration) { redFlashPanel.gameObject.SetActive(true); redFlashPanel.DOFade(1, duration / 2).OnComplete(() => { redFlashPanel.DOFade(0, duration / 2).OnComplete(() => { redFlashPanel.gameObject.SetActive(false); }); }); } }