TH1/Unity/Assets/Scripts/UI/CenterMessageUI.cs
2025-07-21 02:09:11 +08:00

384 lines
15 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 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;
// 如果还有下一条消息,下一帧自动播放
}
}