551 lines
17 KiB
C#
551 lines
17 KiB
C#
// 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}");
|
||
// }
|
||
// }
|
||
// }
|