130 lines
4.2 KiB
C#
130 lines
4.2 KiB
C#
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;
|
||
}
|
||
}
|
||
} |