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

551 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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}");
// }
// }
// }