Files
JJBB/Assets/Project/Script/GUI/Message/CentreNoticeLogic.cs
2024-08-23 15:49:34 +08:00

130 lines
4.2 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.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;
}
}
}