// using System.Collections; // using System.Collections.Generic; // using TMPro; // using UnityEngine; // using UnityEngine.UI; // /// // /// 报警覆盖面板 // /// 在报警发生时覆盖主界面,提供视觉和听觉警示 // /// // public class AlarmOverlayPanel : BasePanel // { // [Header("报警显示组件")] // public Image Background; // public TextMeshProUGUI ReasonText; // public TextMeshProUGUI TimeText; // public TextMeshProUGUI PriorityText; // [Header("操作按钮")] // public Button MuteButton; // public Button AcknowledgeButton; // public Button CloseButton; // [Header("音频组件")] // public AudioSource AlarmAudioSource; // public AudioClip AlarmAudioClip; // [Header("视觉效果设置")] // public float BlinkInterval = 0.5f; // 闪烁间隔 // public Color HighPriorityColor = new Color(1, 0, 0, 0.6f); // 高优先级颜色(红色) // public Color MediumPriorityColor = new Color(1, 0.83f, 0, 0.5f); // 中优先级颜色(橙色) // public Color LowPriorityColor = new Color(1, 1, 0, 0.3f); // 低优先级颜色(黄色) // private AlarmEvent _currentAlarm; // private bool _isBlinking = false; // private Coroutine _blinkCoroutine; // private bool _audioMuted = false; // private float _audioVolume = 0.8f; // // 音频设置保存键 // private const string AUDIO_VOLUME_KEY = "AlarmAudio_Volume"; // private const string AUDIO_MUTED_KEY = "AlarmAudio_Muted"; // public override void Init() // { // InitializeButtons(); // InitializeAudio(); // LoadAudioSettings(); // // 初始状态隐藏面板 // gameObject.SetActive(false); // // 注册报警事件 // RegisterAlarmEvents(); // } // /// // /// 初始化音频组件 // /// // private void InitializeAudio() // { // AlarmAudioSource.Play(); // } // /// // /// 加载报警音频文件 // /// // private void LoadAlarmAudioClip() // { // // 尝试从Resources/Audio/目录加载 // string[] possiblePaths = { // "Audio/DiDiDiDi", // "Audio/didididi", // "Audio/alarm", // "Audio/Alarm", // "DiDiDiDi" // }; // foreach (string path in possiblePaths) // { // AlarmAudioClip = Resources.Load(path); // if (AlarmAudioClip != null) // { // AlarmAudioSource.Play(); // Debug.Log($"AlarmOverlayPanel: 加载报警音频文件成功: {path}"); // break; // } // } // if (AlarmAudioClip == null) // { // Debug.LogWarning("AlarmOverlayPanel: 未找到报警音频文件,请将音频文件放在Resources/Audio/DiDiDiDi路径下"); // } // } // private void RegisterAlarmEvents() // { // // 注册DCSAlarmManager的报警事件 // DCSAlarmManager.OnAlarmRaised += HandleAlarm; // DCSAlarmManager.OnMuteStateChanged += OnMuteStateChanged; // Debug.Log("AlarmOverlayPanel: 已注册DCSAlarmManager事件"); // } // private void InitializeButtons() // { // if (MuteButton != null) // { // MuteButton.onClick.AddListener(OnMuteClicked); // } // if (AcknowledgeButton != null) // { // AcknowledgeButton.onClick.AddListener(OnAcknowledgeClicked); // } // if (CloseButton != null) // { // CloseButton.onClick.AddListener(OnCloseClicked); // } // } // private void HandleAlarm(AlarmPriority priority, string reason) // { // // 检查DCSAlarmManager的静音状态 // if (DCSAlarmManager.Instance != null && DCSAlarmManager.Instance.IsMuted) // { // Debug.Log($"[AlarmOverlayPanel] 报警覆盖静音状态: [{priority}] {reason}"); // return; // } // // 创建临时AlarmEvent对象来兼容现有的显示逻辑 // var alarmEvent = new AlarmEvent // { // Id = UnityEngine.Random.Range(1000, 9999), // Priority = priority, // Reason = reason, // Time = System.DateTime.Now // }; // _currentAlarm = alarmEvent; // Debug.Log($"[AlarmOverlayPanel] 接收到报警事件: [{priority}] {reason}"); // // 检查当前GameObject是否已经激活,如果没有则通过UIManager显示 // if (!gameObject.activeInHierarchy) // { // try // { // // 尝试通过UIManager显示,这会自动管理面板的层级和生命周期 // var shownPanel = UIManager.Instance.ShowPanel(); // if (shownPanel != null && shownPanel != this) // { // // 如果显示的是另一个实例,让那个实例处理报警 // shownPanel.SetAlarmEvent(alarmEvent); // Debug.Log($"[AlarmOverlayPanel] 通过UIManager显示报警面板"); // return; // } // } // catch (System.Exception ex) // { // Debug.LogWarning($"[AlarmOverlayPanel] UIManager显示失败: {ex.Message},使用当前实例显示"); // } // } // // 直接在当前实例上显示报警 // ShowAlarmOverlay(alarmEvent); // } // private void OnMuteStateChanged(bool isMuted) // { // // 处理静音状态变化,可以更新UI显示 // Debug.Log($"AlarmOverlayPanel: 静音状态变更为 {isMuted}"); // } // /// // /// 设置报警事件(公共方法,供外部调用) // /// // public void SetAlarmEvent(AlarmEvent alarmEvent) // { // // 检查DCSAlarmManager的静音状态 // if (DCSAlarmManager.Instance != null && DCSAlarmManager.Instance.IsMuted) // { // // 高优先级报警可以覆盖静音状态显示面板 // if (alarmEvent.Priority != AlarmPriority.High) // { // Debug.Log($"[AlarmOverlayPanel] 外部设置报警被静音阻止: [{alarmEvent.Priority}] {alarmEvent.Reason}"); // return; // } // else // { // Debug.Log($"[AlarmOverlayPanel] 高优先级报警覆盖静音状态: [{alarmEvent.Priority}] {alarmEvent.Reason}"); // } // } // _currentAlarm = alarmEvent; // ShowAlarmOverlay(alarmEvent); // } // /// // /// 显示报警覆盖层 // /// // public void ShowAlarmOverlay(AlarmEvent alarmEvent) // { // // 最后一次检查静音状态(双重保险) // if (DCSAlarmManager.Instance != null && DCSAlarmManager.Instance.IsMuted && alarmEvent.Priority != AlarmPriority.High) // { // Debug.Log($"[AlarmOverlayPanel] 显示时检测到静音状态,阻止显示报警: [{alarmEvent.Priority}] {alarmEvent.Reason}"); // return; // } // // 激活面板 // gameObject.SetActive(true); // // 设置报警信息 // if (ReasonText != null) // { // ReasonText.text = alarmEvent.Reason; // } // if (TimeText != null) // { // TimeText.text = alarmEvent.Time.ToString("HH:mm:ss"); // } // if (PriorityText != null) // { // PriorityText.text = GetPriorityText(alarmEvent.Priority); // } // // 根据优先级设置背景颜色和效果 // SetAlarmVisualEffect(alarmEvent.Priority); // // 开始闪烁效果 // if (alarmEvent.Priority == AlarmPriority.High) // { // StartBlinking(); // } // else // { // StopBlinking(); // } // // 播放报警音频 // PlayAlarmAudio(alarmEvent.Priority); // // 显示面板(使用BasePanel的淡入效果) // ShowMe(false); // 报警需要立即显示,不使用淡入效果 // // 自动隐藏低优先级报警 // if (alarmEvent.Priority == AlarmPriority.Low) // { // StartCoroutine(AutoHideAlarm(5f)); // 5秒后自动隐藏 // } // Debug.Log($"AlarmOverlayPanel: 显示报警 [{alarmEvent.Priority}] {alarmEvent.Reason}"); // } // /// // /// 设置报警视觉效果 // /// // private void SetAlarmVisualEffect(AlarmPriority priority) // { // if (Background != null) // { // Color targetColor = LowPriorityColor; // switch (priority) // { // case AlarmPriority.High: // targetColor = HighPriorityColor; // break; // case AlarmPriority.Medium: // targetColor = MediumPriorityColor; // break; // case AlarmPriority.Low: // targetColor = LowPriorityColor; // break; // } // Background.color = targetColor; // } // } // /// // /// 获取优先级显示文本 // /// // private string GetPriorityText(AlarmPriority priority) // { // switch (priority) // { // case AlarmPriority.High: return "高优先级报警"; // case AlarmPriority.Medium: return "中优先级报警"; // case AlarmPriority.Low: return "低优先级报警"; // default: return "报警"; // } // } // /// // /// 开始闪烁效果 // /// // private void StartBlinking() // { // if (!_isBlinking) // { // _isBlinking = true; // _blinkCoroutine = StartCoroutine(BlinkCoroutine()); // } // } // /// // /// 停止闪烁效果 // /// // private void StopBlinking() // { // if (_isBlinking) // { // _isBlinking = false; // if (_blinkCoroutine != null) // { // StopCoroutine(_blinkCoroutine); // _blinkCoroutine = null; // } // } // } // /// // /// 闪烁协程 // /// // private IEnumerator BlinkCoroutine() // { // while (_isBlinking && Background != null) // { // // 淡出 // var originalColor = Background.color; // Background.color = new Color(originalColor.r, originalColor.g, originalColor.b, 0.2f); // yield return new WaitForSeconds(BlinkInterval); // // 淡入 // Background.color = originalColor; // yield return new WaitForSeconds(BlinkInterval); // } // } // /// // /// 自动隐藏报警 // /// // private IEnumerator AutoHideAlarm(float delay) // { // yield return new WaitForSeconds(delay); // HideAlarmOverlay(); // } // /// // /// 隐藏报警覆盖层 // /// // public void HideAlarmOverlay() // { // StopBlinking(); // StopAlarmAudio(); // // 使用BasePanel的HideMe方法,与其他面板保持一致 // HideMe(true, () => // { // gameObject.SetActive(false); // }); // Debug.Log("[AlarmOverlayPanel] 报警面板已隐藏"); // } // #region 音频播放功能 // /// // /// 播放报警音频 // /// // private void PlayAlarmAudio(AlarmPriority priority) // { // if (AlarmAudioSource == null || AlarmAudioClip == null || _audioMuted) // return; // // 检查DCSAlarmManager的静音状态 // if (DCSAlarmManager.Instance != null && DCSAlarmManager.Instance.IsMuted) // { // Debug.Log("AlarmOverlayPanel: 报警音频被DCSAlarmManager静音阻止"); // return; // } // // 根据优先级决定是否播放 // bool shouldPlay = ShouldPlayAudioForPriority(priority); // if (!shouldPlay) // { // Debug.Log($"AlarmOverlayPanel: 优先级 {priority} 不播放音频"); // return; // } // // 设置音量 // float volumeMultiplier = GetVolumeMultiplierForPriority(priority); // AlarmAudioSource.volume = _audioVolume * volumeMultiplier; // // 播放音频 // AlarmAudioSource.Play(); // Debug.Log($"AlarmOverlayPanel: 播放报警音频,优先级: {priority}, 音量: {AlarmAudioSource.volume:F2}"); // } // /// // /// 停止报警音频 // /// // private void StopAlarmAudio() // { // if (AlarmAudioSource != null && AlarmAudioSource.isPlaying) // { // AlarmAudioSource.Stop(); // Debug.Log("AlarmOverlayPanel: 停止播放报警音频"); // } // } // /// // /// 根据优先级决定是否播放音频 // /// // private bool ShouldPlayAudioForPriority(AlarmPriority priority) // { // return priority switch // { // AlarmPriority.High => true, // 高优先级总是播放 // AlarmPriority.Medium => true, // 中优先级播放 // AlarmPriority.Low => false, // 低优先级不播放音频 // _ => false // }; // } // /// // /// 根据优先级获取音量倍数 // /// // private float GetVolumeMultiplierForPriority(AlarmPriority priority) // { // return priority switch // { // AlarmPriority.High => 1.0f, // 高优先级最大音量 // AlarmPriority.Medium => 0.8f, // 中优先级80%音量 // AlarmPriority.Low => 0.6f, // 低优先级60%音量 // _ => 0.8f // }; // } // /// // /// 设置音频音量 // /// // public void SetAudioVolume(float volume) // { // _audioVolume = Mathf.Clamp01(volume); // if (AlarmAudioSource != null && AlarmAudioSource.isPlaying) // { // AlarmAudioSource.volume = _audioVolume; // } // SaveAudioSettings(); // } // /// // /// 设置音频静音 // /// // public void SetAudioMute(bool mute) // { // _audioMuted = mute; // if (mute && AlarmAudioSource != null && AlarmAudioSource.isPlaying) // { // StopAlarmAudio(); // } // SaveAudioSettings(); // } // /// // /// 保存音频设置 // /// // private void SaveAudioSettings() // { // PlayerPrefs.SetFloat(AUDIO_VOLUME_KEY, _audioVolume); // PlayerPrefs.SetInt(AUDIO_MUTED_KEY, _audioMuted ? 1 : 0); // PlayerPrefs.Save(); // } // /// // /// 加载音频设置 // /// // private void LoadAudioSettings() // { // _audioVolume = PlayerPrefs.GetFloat(AUDIO_VOLUME_KEY, 0.8f); // _audioMuted = PlayerPrefs.GetInt(AUDIO_MUTED_KEY, 0) == 1; // } // #endregion // #region 按钮事件处理 // private void OnMuteClicked() // { // if (DCSAlarmManager.Instance != null) // { // DCSAlarmManager.Instance.SetMute(true, 5); // 静音5分钟 // Debug.Log("报警已通过DCSAlarmManager静音5分钟"); // } // // 同时静音当前面板的音频 // SetAudioMute(true); // HideAlarmOverlay(); // } // private void OnAcknowledgeClicked() // { // // 确认报警但不静音系统,只停止当前音频 // StopAlarmAudio(); // Debug.Log($"已确认报警: {_currentAlarm?.Reason}"); // HideAlarmOverlay(); // } // private void OnCloseClicked() // { // // 关闭报警,停止音频 // StopAlarmAudio(); // HideAlarmOverlay(); // } // #endregion // void OnDisable() // { // UnregisterAlarmEvents(); // StopBlinking(); // } // void OnDestroy() // { // UnregisterAlarmEvents(); // StopBlinking(); // } // private void UnregisterAlarmEvents() // { // // 注销DCSAlarmManager事件 // try // { // DCSAlarmManager.OnAlarmRaised -= HandleAlarm; // DCSAlarmManager.OnMuteStateChanged -= OnMuteStateChanged; // } // catch (System.Exception ex) // { // Debug.LogWarning($"AlarmOverlayPanel: 注销DCSAlarmManager事件时发生异常: {ex.Message}"); // } // } // }