384 lines
15 KiB
C#
384 lines
15 KiB
C#
using UnityEngine;
|
||
using TMPro;
|
||
using Animancer;
|
||
using Logic;
|
||
using RuntimeData;
|
||
using UnityEngine.UI;
|
||
using System.Collections.Generic;
|
||
using Logic.Audio;
|
||
using Logic.Multilingual;
|
||
using TH1Renderer;
|
||
using UnityEngine.Tilemaps;
|
||
|
||
// 数据结构
|
||
public struct CenterMessageData
|
||
{
|
||
public UICenterMessageType Type;
|
||
public bool HasChat;
|
||
public string Title;
|
||
//public string Type;
|
||
public string Message;
|
||
public Sprite Sprite;
|
||
public string ChatBubbleText;
|
||
public Color ChatBubblColor;
|
||
public GridData StartGrid;//存储meetPlayer的时候, 是在哪个grid meet的
|
||
}
|
||
public class CenterMessageUI
|
||
{
|
||
//用于帝国陨落的黑白图像
|
||
private Material _grayScaleMat;
|
||
|
||
private Main _main;
|
||
private MapData _mapData;
|
||
public GameObject ROCenterMessageUI;
|
||
|
||
private CanvasGroup canvasGroup;
|
||
private Button button;
|
||
public bool isShowingNow = false;
|
||
private int _closeButtonMoney = 0;
|
||
|
||
//存储正在显示的message如果有grid的话,
|
||
private GridData _startGrid;
|
||
|
||
|
||
|
||
//临时使用!!TODO 删除
|
||
public PlayerDataAssets PlayerData;
|
||
|
||
|
||
private Queue<CenterMessageData> _messageQueue = new Queue<CenterMessageData>(); // 新增:排队系统
|
||
|
||
public CenterMessageUI(Main main, MapData mapData)
|
||
{
|
||
_main = main;
|
||
_mapData = mapData;
|
||
ROCenterMessageUI = UIManager.Instance.ROUIManager.transform.Find("CenterMessagePanel").gameObject;
|
||
|
||
canvasGroup = ROCenterMessageUI.GetComponent<CanvasGroup>();
|
||
|
||
for (int i = 0; i < ROCenterMessageUI.transform.childCount; i++)
|
||
{
|
||
Transform child = ROCenterMessageUI.transform.GetChild(i);
|
||
if (child.name == "Button")
|
||
{
|
||
button = child.GetComponent<Button>();
|
||
button.onClick.AddListener(Hide);
|
||
}
|
||
}
|
||
canvasGroup.alpha = 0;
|
||
ROCenterMessageUI.gameObject.SetActive(false);
|
||
|
||
_grayScaleMat = Resources.Load<Material>("Materials/GrayScale");
|
||
PlayerData = Resources.Load<PlayerDataAssets>("DataAssets/PlayerDataAssets");
|
||
}
|
||
|
||
public void Update()
|
||
{
|
||
if (DebugCenter.Instance.DebugHideCenterMessage)
|
||
return;
|
||
// 如果没有正在显示,并且有排队的消息,就开始显示
|
||
if (!isShowingNow && _messageQueue.Count > 0)
|
||
{
|
||
ShowNext();
|
||
}
|
||
|
||
foreach (var player in _mapData.PlayerMap.PlayerDataList)
|
||
{
|
||
if (player.DieMark && !player.Alive)
|
||
{
|
||
player.DieMark = false;
|
||
SetCenterMessageShow(UICenterMessageID.ForcesFallen,player);
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
public void SetCenterMessageShow(UICenterMessageID id, PlayerData playerData, GridData grid = null)
|
||
{
|
||
if (!Table.Instance.UICenterMessageDataAssets.GetUICenterMessageInfo(id, out var info))
|
||
return;
|
||
if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(playerData, out var playerInfo))
|
||
return;
|
||
|
||
|
||
//临时使用 TODO 删掉
|
||
PlayerData.GetPlayerInfo(playerData, out var playerInfoTmp);
|
||
|
||
|
||
//奇观完成或者开始
|
||
if (info.Type == UICenterMessageType.WonderFinish || info.Type == UICenterMessageType.WonderStart)
|
||
{
|
||
if(!Table.Instance.GridAndResourceDataAssets.GetWonderInfoByType(info.WonderType,playerData,out var c))
|
||
return;
|
||
|
||
|
||
string nameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(c.Name));
|
||
string messageFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Message));
|
||
string titleFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Title));
|
||
messageFinal = messageFinal.Replace("{name}", nameFinal);
|
||
|
||
// 新建一条消息,加入队列
|
||
CenterMessageData data = new CenterMessageData
|
||
{
|
||
HasChat = false,
|
||
Title = titleFinal,
|
||
Message = messageFinal,
|
||
Type = info.Type,
|
||
Sprite = c.Sprite
|
||
};
|
||
_messageQueue.Enqueue(data);
|
||
}
|
||
|
||
//游戏开始
|
||
if (info.Type == UICenterMessageType.StartGame)
|
||
{
|
||
|
||
Table.Instance.PlayerDataAssets.GetPlayerInfo(playerData, out var info2);
|
||
MultilingualManager.Instance.SetUIText(ROCenterMessageUI.transform.Find("ChatArea/Mask/RightName").GetComponent<TextMeshProUGUI>(),info2.LeaderName);
|
||
//ROCenterMessageUI.transform.Find("ChatArea/Mask/RightChar").GetComponent<Image>().sprite = info2.LeaderIllustration;
|
||
//ROCenterMessageUI.transform.Find("SoloChat/Mask/RightChar").GetComponent<Image>().sprite = info2.LeaderIllustration;
|
||
|
||
string messageFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Message));
|
||
string titleFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Title));
|
||
// 新建一条消息,加入队列
|
||
CenterMessageData data = new CenterMessageData
|
||
{
|
||
HasChat = true,
|
||
Title = titleFinal,
|
||
Message = messageFinal,
|
||
Type = info.Type,
|
||
Sprite = playerInfo.LeaderIllustration,
|
||
ChatBubbleText = playerInfoTmp.GetRandomStartChat(),
|
||
//ChatBubbleText = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.GetRandomStartChat())),
|
||
ChatBubblColor = playerInfo.Color
|
||
};
|
||
_messageQueue.Enqueue(data);
|
||
}
|
||
|
||
//帝国陨落
|
||
if (info.Type == UICenterMessageType.ForcesFallen)
|
||
{
|
||
string civNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.CivName));
|
||
string messageFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Message));
|
||
messageFinal = messageFinal.Replace("{name}", civNameFinal);
|
||
string titleFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Title));
|
||
// 新建一条消息,加入队列
|
||
CenterMessageData data = new CenterMessageData
|
||
{
|
||
HasChat = true,
|
||
Title = titleFinal,
|
||
Message = messageFinal,
|
||
Type = info.Type,
|
||
Sprite = playerInfo.LeaderIllustration,
|
||
ChatBubbleText = playerInfoTmp.GetRandomLoseChat(),
|
||
//ChatBubbleText = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.GetRandomLoseChat())),
|
||
ChatBubblColor = playerInfo.Color
|
||
};
|
||
_messageQueue.Enqueue(data);
|
||
}
|
||
|
||
//遇到新的对手
|
||
if (info.Type == UICenterMessageType.MeetNewPlayer)
|
||
{
|
||
|
||
if(!_mapData.GetCapitalCityDataByPlayerId(playerData.Id,out var city))
|
||
return;
|
||
var cost = city.Level * 2 - 1;
|
||
_closeButtonMoney = cost;
|
||
|
||
string forceNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.ForceName));
|
||
string leaderNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.LeaderName));
|
||
string civNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.CivName));
|
||
string messagFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Message));
|
||
string titleFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Title));
|
||
messagFinal = messagFinal.Replace("{money}", cost.ToString())
|
||
.Replace("{civName}", civNameFinal)
|
||
.Replace("{forceName}", forceNameFinal)
|
||
.Replace("{leaderName}", leaderNameFinal);
|
||
titleFinal = titleFinal.Replace("{civName}", civNameFinal)
|
||
.Replace("{forceName}",forceNameFinal);
|
||
|
||
|
||
// 新建一条消息,加入队列
|
||
CenterMessageData data = new CenterMessageData
|
||
{
|
||
HasChat = true,
|
||
Title = titleFinal,
|
||
Message = messagFinal,
|
||
Type = info.Type,
|
||
Sprite = playerInfo.LeaderIllustration,
|
||
ChatBubbleText = playerInfoTmp.GetRandomMeetChat(),
|
||
//ChatBubbleText = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.GetRandomMeetChat())),
|
||
ChatBubblColor = playerInfo.Color,
|
||
StartGrid = grid
|
||
};
|
||
_messageQueue.Enqueue(data);
|
||
}
|
||
|
||
|
||
}
|
||
public void SetCenterMessageShow(UICenterMessageID id, UnitData unit)
|
||
{
|
||
if (!Table.Instance.UICenterMessageDataAssets.GetUICenterMessageInfo(id, out var info))
|
||
return;
|
||
if (!_mapData.GetPlayerDataByUnitId(unit.Id, out var player))
|
||
return;
|
||
|
||
|
||
|
||
if (info.Type == UICenterMessageType.MeetNewPlayer)
|
||
{
|
||
|
||
if(!_mapData.GetCapitalCityDataByPlayerId(player.Id,out var city))
|
||
return;
|
||
var cost = city.Level * 2 - 1;
|
||
_closeButtonMoney = cost;
|
||
if (!Table.Instance.UnitTypeDataAssets.GetUnitSprite(_mapData, unit, out var sprite))
|
||
return;
|
||
if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var playerInfo))
|
||
return;
|
||
|
||
|
||
string forceNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.ForceName));
|
||
string leaderNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.LeaderName));
|
||
string civNameFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(playerInfo.CivName));
|
||
string messagFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Message));
|
||
string titleFinal = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Title));
|
||
messagFinal = messagFinal.Replace("{money}", cost.ToString())
|
||
.Replace("{civName}", civNameFinal)
|
||
.Replace("{forceName}", forceNameFinal)
|
||
.Replace("{leaderName}", leaderNameFinal);
|
||
titleFinal = titleFinal.Replace("{civName}", civNameFinal)
|
||
.Replace("{forceName}",forceNameFinal);
|
||
|
||
|
||
// 新建一条消息,加入队列
|
||
CenterMessageData data = new CenterMessageData
|
||
{
|
||
HasChat = false,
|
||
Title = titleFinal,
|
||
Message = messagFinal,
|
||
Type = info.Type,
|
||
Sprite = sprite,
|
||
//ChatSprite = playerInfo.LeaderIllustration,
|
||
//ChatName = playerInfo.LeaderName
|
||
};
|
||
_messageQueue.Enqueue(data);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
// 显示当前排队中的下一条
|
||
private void ShowNext()
|
||
{
|
||
if (_messageQueue.Count == 0)
|
||
return;
|
||
|
||
var data = _messageQueue.Dequeue();
|
||
|
||
isShowingNow = true;
|
||
ROCenterMessageUI.SetActive(true);
|
||
|
||
if (data.StartGrid != null)
|
||
_startGrid = data.StartGrid;
|
||
// 更新内容
|
||
var titleText = ROCenterMessageUI.transform.Find("Title").GetComponent<TextMeshProUGUI>();
|
||
titleText.text = data.Title;
|
||
|
||
var messageText = ROCenterMessageUI.transform.Find("HorizontalArea").transform.Find("Message").GetComponent<TextMeshProUGUI>();
|
||
messageText.text = data.Message;
|
||
var imageChar = ROCenterMessageUI.transform.Find("HorizontalArea/ImageMask/ImageChar");
|
||
var imageResource = ROCenterMessageUI.transform.Find("HorizontalArea/ImageMask/ImageResource");
|
||
if (data.Type == UICenterMessageType.WonderFinish || data.Type == UICenterMessageType.WonderStart)
|
||
{
|
||
imageResource.gameObject.SetActive(true);
|
||
imageResource.GetComponent<Image>().sprite = data.Sprite;
|
||
imageChar.gameObject.SetActive(false);
|
||
//image.SetNativeSize();
|
||
}
|
||
else
|
||
{
|
||
imageChar.gameObject.SetActive(true);
|
||
imageChar.GetComponent<Image>().sprite = data.Sprite;
|
||
if (data.Type == UICenterMessageType.ForcesFallen)
|
||
imageChar.GetComponent<Image>().material = _grayScaleMat;
|
||
else
|
||
imageChar.GetComponent<Image>().material = null;
|
||
imageResource.gameObject.SetActive(false);
|
||
}
|
||
|
||
var chat = ROCenterMessageUI.transform.Find("HorizontalArea/ChatBubble");
|
||
//处理对话
|
||
if (data.HasChat)
|
||
{
|
||
chat.gameObject.SetActive(true);
|
||
chat.GetComponent<Image>().color = data.ChatBubblColor;
|
||
chat.Find("Text").GetComponent<TextMeshProUGUI>().text = data.ChatBubbleText;
|
||
|
||
}
|
||
else
|
||
{
|
||
chat.gameObject.SetActive(false);
|
||
}
|
||
|
||
|
||
// 播放淡入动画
|
||
AnimancerComponent animancer = ROCenterMessageUI.GetComponent<AnimancerComponent>();
|
||
AnimationClip animationB = Resources.Load<AnimationClip>("Animations/UI/CenterMessageFadeIn");
|
||
animancer.Play(animationB);
|
||
|
||
//消息队列填加该条消息
|
||
UIManager.Instance.MessageUI.AddMessageData(data);
|
||
}
|
||
|
||
// 玩家点击关闭,开始淡出
|
||
public void Hide()
|
||
{
|
||
//如果遇到了新的文明,获得了钱,那么要在关闭的时候结算这笔钱
|
||
if (_closeButtonMoney > 0)
|
||
{
|
||
if (_startGrid != null)
|
||
{
|
||
//播放获得钱的小动画
|
||
MapRenderer.Instance.ProjectileManager.CreateCoinProjectile(Table.Instance.GridToWorld(_startGrid),_closeButtonMoney);
|
||
|
||
int k = 0;
|
||
while (k < _closeButtonMoney)
|
||
{
|
||
|
||
Timer.Instance.TimerRegister(this, () =>
|
||
{
|
||
_mapData.PlayerMap.SelfPlayerData.PlayerWealth += 1;
|
||
},Table.Instance.AnimDataAssets.ProjectileCoinMoveTime + k * 0.05f);
|
||
k++;
|
||
}
|
||
|
||
}
|
||
else
|
||
_mapData.PlayerMap.SelfPlayerData.PlayerWealth += _closeButtonMoney;
|
||
|
||
|
||
}
|
||
|
||
_closeButtonMoney = 0;
|
||
|
||
AnimancerComponent animancer = ROCenterMessageUI.GetComponent<AnimancerComponent>();
|
||
AnimationClip animationB = Resources.Load<AnimationClip>("Animations/UI/CenterMessageFadeOut");
|
||
animancer.Play(animationB);
|
||
|
||
Timer.Instance.TimerRegister(ROCenterMessageUI, OnCompleteFadeOut, 0.2f);
|
||
}
|
||
|
||
// 淡出结束后,继续下一条或关闭UI
|
||
private void OnCompleteFadeOut()
|
||
{
|
||
ROCenterMessageUI.gameObject.SetActive(false);
|
||
isShowingNow = false;
|
||
|
||
// 如果还有下一条消息,下一帧自动播放
|
||
}
|
||
|
||
|
||
} |