Files
JJBB/Assets/Project/Script/GUI/Message/CentreNoticeLogic.cs

130 lines
4.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CentreNoticeLogic : MonoBehaviour
{
private readonly float[] m_fNewsTime = new float[3];
private readonly List<int> m_indexs = new List<int>();
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<Text>();
_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;
}
}
}