using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CentreNoticeLogic : MonoBehaviour { private readonly float[] m_fNewsTime = new float[3]; private readonly List m_indexs = new List(); public Text[] m_News; public GameObject[] m_NewsObject; public Image[] m_NoticeBG; private readonly int m_nTimeMax = 3; private readonly Transform[] m_ObjTransform = new Transform[3]; //缓存Transform,提高运行效率,必须在Awake的时候就进行赋值 private GameObject _skillWarning; private Text _skillWarningText; private SkillWarningData _skillWarningData; // 区分技能警告和普通警告 - 技能警告应该处于固定位置,不收到其他提示挤压 private static CentreNoticeLogic _instance; private void Awake() { _skillWarning = transform.Find("SkillWarning").gameObject; _skillWarningText = _skillWarning.GetComponentInChildren(); _instance = this; } private void OnDestroy() { if (_instance == this) _instance = null; } // Use this for initialization private void Start() { _skillWarning.gameObject.SetActive(false); for (var i = 0; i < m_NewsObject.Length; i++) { m_NewsObject[i].SetActive(false); m_ObjTransform[i] = m_NewsObject[i].transform; m_fNewsTime[i] = Time.realtimeSinceStartup; m_indexs.Add(i); } //InvokeRepeating("DoSomeThing", 0, 0.2f); } // Update is called once per frame private void Update() { var curData = GUIData.GetNotifyData(); if (null != curData) AddNotice(curData); for (var i = 0; i < m_NewsObject.Length; i++) if (m_NewsObject[i].activeSelf) if (Time.realtimeSinceStartup - m_fNewsTime[i] > m_nTimeMax) { m_fNewsTime[i] = Time.realtimeSinceStartup; m_NewsObject[i].SetActive(false); } if (_skillWarningData != null) { if (!_skillWarningData.isActive) { if (Time.time > _skillWarningData.startTime) { _skillWarningData.isActive = true; _skillWarningText.text = _skillWarningData.content; _skillWarning.SetActive(true); } } else if (Time.time > _skillWarningData.endTime || LoadingWindow._IsLoadingScene) HideSkillWarning(); } } private void AddNotice(string notice) { var index = m_indexs[0]; m_News[index].text = notice; m_NewsObject[index].SetActive(true); m_fNewsTime[index] = Time.realtimeSinceStartup; m_NoticeBG[index].rectTransform.sizeDelta = new Vector3(m_News[index].preferredWidth + 100, m_News[index].preferredHeight + 8, 0); m_indexs.Add(index); m_indexs.RemoveAt(0); for (var i = 0; i < m_indexs.Count; i++) { var pos = m_ObjTransform[m_indexs[i]].localPosition; pos.y = 0 - 35 * i; m_ObjTransform[m_indexs[i]].localPosition = pos; } } public static void ShowSkillWarning(string content, float startInterval, float duration) { if (_instance != null) { // 移除上一次的技能预警 _instance.HideSkillWarning(); var startTime = Time.time + startInterval; var endTime = startTime + duration; _instance._skillWarningData = new SkillWarningData(content, startTime, endTime); } } public void HideSkillWarning() { _skillWarningData = null; _skillWarning.SetActive(false); } private class SkillWarningData { public readonly string content; public readonly float startTime; public readonly float endTime; public bool isActive; public SkillWarningData(string content, float startTime, float endTime) { this.content = content; this.startTime = startTime; this.endTime = endTime; } } }