DCS/ruiyiweiUX/Assets/Scripts/Views/AlarmOverlayPanel.cs

551 lines
17 KiB
C#
Raw Normal View History

2026-06-09 13:59:11 +08:00
// using System.Collections;
// using System.Collections.Generic;
// using TMPro;
// using UnityEngine;
// using UnityEngine.UI;
// /// <summary>
// /// 报警覆盖面板
// /// 在报警发生时覆盖主界面,提供视觉和听觉警示
// /// </summary>
// 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();
// }
// /// <summary>
// /// 初始化音频组件
// /// </summary>
// private void InitializeAudio()
// {
// AlarmAudioSource.Play();
// }
// /// <summary>
// /// 加载报警音频文件
// /// </summary>
// private void LoadAlarmAudioClip()
// {
// // 尝试从Resources/Audio/目录加载
// string[] possiblePaths = {
// "Audio/DiDiDiDi",
// "Audio/didididi",
// "Audio/alarm",
// "Audio/Alarm",
// "DiDiDiDi"
// };
// foreach (string path in possiblePaths)
// {
// AlarmAudioClip = Resources.Load<AudioClip>(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<AlarmOverlayPanel>();
// 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}");
// }
// /// <summary>
// /// 设置报警事件(公共方法,供外部调用)
// /// </summary>
// 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);
// }
// /// <summary>
// /// 显示报警覆盖层
// /// </summary>
// 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}");
// }
// /// <summary>
// /// 设置报警视觉效果
// /// </summary>
// 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;
// }
// }
// /// <summary>
// /// 获取优先级显示文本
// /// </summary>
// private string GetPriorityText(AlarmPriority priority)
// {
// switch (priority)
// {
// case AlarmPriority.High: return "高优先级报警";
// case AlarmPriority.Medium: return "中优先级报警";
// case AlarmPriority.Low: return "低优先级报警";
// default: return "报警";
// }
// }
// /// <summary>
// /// 开始闪烁效果
// /// </summary>
// private void StartBlinking()
// {
// if (!_isBlinking)
// {
// _isBlinking = true;
// _blinkCoroutine = StartCoroutine(BlinkCoroutine());
// }
// }
// /// <summary>
// /// 停止闪烁效果
// /// </summary>
// private void StopBlinking()
// {
// if (_isBlinking)
// {
// _isBlinking = false;
// if (_blinkCoroutine != null)
// {
// StopCoroutine(_blinkCoroutine);
// _blinkCoroutine = null;
// }
// }
// }
// /// <summary>
// /// 闪烁协程
// /// </summary>
// 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);
// }
// }
// /// <summary>
// /// 自动隐藏报警
// /// </summary>
// private IEnumerator AutoHideAlarm(float delay)
// {
// yield return new WaitForSeconds(delay);
// HideAlarmOverlay();
// }
// /// <summary>
// /// 隐藏报警覆盖层
// /// </summary>
// public void HideAlarmOverlay()
// {
// StopBlinking();
// StopAlarmAudio();
// // 使用BasePanel的HideMe方法与其他面板保持一致
// HideMe(true, () =>
// {
// gameObject.SetActive(false);
// });
// Debug.Log("[AlarmOverlayPanel] 报警面板已隐藏");
// }
// #region 音频播放功能
// /// <summary>
// /// 播放报警音频
// /// </summary>
// 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}");
// }
// /// <summary>
// /// 停止报警音频
// /// </summary>
// private void StopAlarmAudio()
// {
// if (AlarmAudioSource != null && AlarmAudioSource.isPlaying)
// {
// AlarmAudioSource.Stop();
// Debug.Log("AlarmOverlayPanel: 停止播放报警音频");
// }
// }
// /// <summary>
// /// 根据优先级决定是否播放音频
// /// </summary>
// private bool ShouldPlayAudioForPriority(AlarmPriority priority)
// {
// return priority switch
// {
// AlarmPriority.High => true, // 高优先级总是播放
// AlarmPriority.Medium => true, // 中优先级播放
// AlarmPriority.Low => false, // 低优先级不播放音频
// _ => false
// };
// }
// /// <summary>
// /// 根据优先级获取音量倍数
// /// </summary>
// private float GetVolumeMultiplierForPriority(AlarmPriority priority)
// {
// return priority switch
// {
// AlarmPriority.High => 1.0f, // 高优先级最大音量
// AlarmPriority.Medium => 0.8f, // 中优先级80%音量
// AlarmPriority.Low => 0.6f, // 低优先级60%音量
// _ => 0.8f
// };
// }
// /// <summary>
// /// 设置音频音量
// /// </summary>
// public void SetAudioVolume(float volume)
// {
// _audioVolume = Mathf.Clamp01(volume);
// if (AlarmAudioSource != null && AlarmAudioSource.isPlaying)
// {
// AlarmAudioSource.volume = _audioVolume;
// }
// SaveAudioSettings();
// }
// /// <summary>
// /// 设置音频静音
// /// </summary>
// public void SetAudioMute(bool mute)
// {
// _audioMuted = mute;
// if (mute && AlarmAudioSource != null && AlarmAudioSource.isPlaying)
// {
// StopAlarmAudio();
// }
// SaveAudioSettings();
// }
// /// <summary>
// /// 保存音频设置
// /// </summary>
// private void SaveAudioSettings()
// {
// PlayerPrefs.SetFloat(AUDIO_VOLUME_KEY, _audioVolume);
// PlayerPrefs.SetInt(AUDIO_MUTED_KEY, _audioMuted ? 1 : 0);
// PlayerPrefs.Save();
// }
// /// <summary>
// /// 加载音频设置
// /// </summary>
// 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}");
// }
// }
// }