using System.Collections; using UnityEngine; using UnityEngine.UI; using TMPro; /// /// 报警灯组件,支持不同优先级的闪烁模式 /// public class AlarmLightComponent : MonoBehaviour { [Header("报警灯设置")] // public Image alarmLight; public TextMeshProUGUI AlarmInfoText; public Color highPriorityColor = Color.red; public Color mediumPriorityColor = Color.yellow; public Color lowPriorityColor = Color.yellow; public Color normalColor = Color.gray; public Color healthyColor = Color.green; // ✅ 健康状态颜色(绿色) [Header("闪烁设置")] public float blinkInterval = 0.5f; // 500ms闪烁周期 private AlarmPriority currentPriority = AlarmPriority.None; private bool isBlinking = false; private Coroutine blinkCoroutine; void Awake() { // if (alarmLight == null) // alarmLight = GetComponent(); ResetLight(); DCSAlarmManager.OnAlarmCleared += OnAllAlarmsCleared; } /// /// 设置报警状态 /// public void SetAlarmState(AlarmPriority priority, bool isActive) { if (blinkCoroutine != null) { StopCoroutine(blinkCoroutine); blinkCoroutine = null; } currentPriority = priority; isBlinking = isActive; if (!isActive) { ResetLight(); return; } switch (priority) { case AlarmPriority.High: // 高优先级:红灯闪烁 blinkCoroutine = StartCoroutine(BlinkLight(highPriorityColor)); break; case AlarmPriority.Medium: // 中优先级:黄灯闪烁 blinkCoroutine = StartCoroutine(BlinkLight(mediumPriorityColor)); break; case AlarmPriority.Low: // 低优先级:黄灯常亮 // alarmLight.color = lowPriorityColor; AlarmInfoText.color = lowPriorityColor; break; default: ResetLight(); break; } } private void OnAllAlarmsCleared() { if (blinkCoroutine != null) { StopCoroutine(blinkCoroutine); blinkCoroutine = null; } isBlinking = false; currentPriority = AlarmPriority.None; if (AlarmInfoText != null) { // alarmLight.color = healthyColor; // ✅ 显示绿色健康状态 AlarmInfoText.color = healthyColor; } Debug.Log("[报警灯] 切换到健康状态(绿色)"); } /// /// 闪烁协程 /// private IEnumerator BlinkLight(Color color) { while (isBlinking) { // alarmLight.color = color; AlarmInfoText.color = color; yield return new WaitForSeconds(blinkInterval); // alarmLight.color = normalColor; AlarmInfoText.color = normalColor; yield return new WaitForSeconds(blinkInterval); } } /// /// 重置灯光状态 /// private void ResetLight() { // if (alarmLight != null) // alarmLight.color = normalColor; if (AlarmInfoText != null) AlarmInfoText.color = normalColor; isBlinking = false; currentPriority = AlarmPriority.None; } void OnDestroy() { if (blinkCoroutine != null) { StopCoroutine(blinkCoroutine); } DCSAlarmManager.OnAlarmCleared -= OnAllAlarmsCleared; } }