MayHeCome/Assets/仪式/C#/YiShiUI.cs

490 lines
16 KiB
C#
Raw Normal View History

2024-12-18 09:55:34 +00:00
using System.Collections;
using System.Collections.Generic;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Playables;
using UnityEngine.UI;
[System.Serializable]
public struct GodComingTimes
{
public GodType godType;
public int Count;
public string GetGodName()
{
string godname = "";
switch (godType)
{
case GodType.Sun:
godname = "日神";
break;
case GodType.war:
godname = "战神";
break;
case GodType.spring:
godname = "春神";
break;
default:
break;
}
return godname;
}
}
public class YiShiUI : MonoSingleton<YiShiUI>
{
[Header("仪式模式")]
public YiShiItem yishiitem;
public PlayableDirector playableDirector;
[Header("交换接口")]
public List<UIItem> ItemUIs;
public YiShiItems YishiItemBag;
private int NeedResourceCount;//资源目前数量
private InputField inputField; // 引用InputField
public List<GodComingTimes> godComingTimes;
[Header("日战春")]
public List<Sprite> Godsprites;
public List<Sprite> ResourceSprite;
public int YiShiMode = 0;
private bool isRun;//仪式正在进行
private bool isGetreward = true;//已经领取到奖励
YiShiReward yiShiReward;
public GameObject bag;
public override void Awake()
{
base.Awake();
GameProcedureManager.Instance.FaithCount += 1000;
playableDirector.stopped += OnPlayableDirectorStopped;
//GameProcedureManager.Instance.StoneCount = 1000;
//GameProcedureManager.Instance.FaithCount = 1000;
transform.Find("仪式/开始仪式按钮").GetComponent<Button>().onClick.AddListener(CreatBtn);
inputField = transform.Find("仪式/放置/数量输入框").GetComponent<InputField>();
inputField.onValueChanged.AddListener(delegate { ValidateInput(); });
transform.Find("仪式/放置/减").GetComponent<Button>().onClick.AddListener(CutReourceCount);
transform.Find("仪式/放置/加").GetComponent<Button>().onClick.AddListener(AddReourceCount);
BlindRewardUIClose(transform.Find("奖励界面"));
BlindRewardUICloseTwo(transform.Find("关闭图"));
}
private void OnEnable()
{
if (isRun)
{
gameObject.SetActive(false); return;
}
if (isGetreward)
{
transform.Find("仪式").gameObject.SetActive(true);
BagActive(true);
}
yishiitem = YishiItemBag.yiShiItems[YiShiMode];
RefreshRemains();
BlindYishiItem();
}
public void BagActive(bool open)
{
if (bag.activeSelf == !open)
{
transform.parent.Find("TopBar/背包按钮").GetComponent<Button>().onClick.Invoke();
}
}
private void OnDisable()
{
Remainsclear();
if (NeedResourceCount > 0)
{
yishiitem.AddResource(NeedResourceCount);
NeedResourceCount = 0;
}
}
private void Update()
{
Debug.LogWarning(GameProcedureManager.Instance.StoneCount + "---" + NeedResourceCount + GameProcedureManager.Instance.FaithCount);
}
public void RefreshRemains()
{
for (int i = 0; i < ItemUIs.Count; i++)
{
ItemUIs[i].Refresh();
}
}
public void Remainsclear()
{
BagControl.Instance.remainsModes.Clear();
BagControl.Instance.Refresh();
if (NeedResourceCount > 0)
{
inputField.text = 0.ToString();
}
}
#region
private void OnPlayableDirectorStopped(PlayableDirector director)
{
Debug.LogWarning("播放结束");
if (director == playableDirector)
{
Debug.LogWarning("播放结束22");
isRun = false;
isGetreward = false;
gameObject.SetActive(true);
AfterGetReward();//奖励
playableDirector.transform.parent.gameObject.SetActive(false);
}
}
public void OnPlayableDirectorStopped()
{
playableDirector.Stop();
}
private void CreatBtn() //仪式开始
{
if (NeedResourceCount > 0)
{
if (GameProcedureManager.Instance.FaithCount >= yishiitem.NeedFaith)
{
List<RemainsItem> remainsItems = new List<RemainsItem>();
for (int i = 0; i < ItemUIs.Count; i++)
{
if (ItemUIs[i].ItemName != "")//存在遗物
{
remainsItems.Add(BagControl.Instance.bag.GetRemainsItem(ItemUIs[i].ItemName));
}
}
yiShiReward = yishiitem.StartYishi(NeedResourceCount, remainsItems);//开始进行资源计算并获得奖励
BagControl.Instance.CutRemains();//消耗遗物
RefreshRemains();
inputField.text = 0.ToString();
playableDirector.transform.parent.gameObject.SetActive(true);
playableDirector.Play();
isRun = true;
gameObject.SetActive(false);
BagActive(false);
transform.Find("仪式").gameObject.SetActive(false);
}
}
}
private void AfterGetReward()
{
OpenRewardUI(yiShiReward);
isGetreward = true;
}
private void AddReourceCount() //添加资源数量
{
int Anum = NeedResourceCount % 10;
int cutcount = 10;
if (Anum != 0)//有余数
{
cutcount = 10 - Anum;
}
if (yishiitem.CutResource(cutcount) >= 0)//成功减少
{
NeedResourceCount += cutcount;
inputField.text = NeedResourceCount.ToString();
}
else//负数不成功减少
{
int allcount = yishiitem.ReResourceCount();
if (allcount > 0)//还有剩余继续榨干
{
yishiitem.CutResource(allcount);
NeedResourceCount += allcount;
inputField.text = NeedResourceCount.ToString();
}
}
}
private void CutReourceCount()//减少资源s
{
if (NeedResourceCount > 0)
{
int cutcount = 10;
if (NeedResourceCount < 10)
{
cutcount = NeedResourceCount;
}
else
{
int num1 = NeedResourceCount % 10;
if (num1 != 0)
{
cutcount = num1;
}
}
yishiitem.AddResource(cutcount);
NeedResourceCount -= cutcount;
inputField.text = NeedResourceCount.ToString();
}
}
// 验证输入值是否为数字,并进行资源计算
void ValidateInput()
{
string inputValue = inputField.text; // 获取输入的文本
int parsedValue;
int totalNum = yishiitem.ReResourceCount() + NeedResourceCount;
// 尝试将输入转换为整数
if (int.TryParse(inputValue, out parsedValue))
{
if (!parsedValue.ToString().StartsWith(inputValue))
{
Debug.Log(inputValue + "--" + parsedValue.ToString());
inputField.text = parsedValue.ToString();
return;
}
if (parsedValue >= 0 && parsedValue <= totalNum)
{
int OffsetNum = parsedValue - NeedResourceCount;
if (OffsetNum > 0) // 增加资源
{
yishiitem.CutResource(OffsetNum);
}
else if (OffsetNum < 0) // 减少资源
{
yishiitem.AddResource(-OffsetNum);
}
// 更新参数
NeedResourceCount = parsedValue;
Debug.Log("输入有效,参数已更新:" + NeedResourceCount);
}
else if (parsedValue < 0) // 输入小于0重置为0
{
inputField.text = "0";
}
else if (parsedValue > totalNum) // 输入超出最大资源
{
parsedValue = totalNum;
inputField.text = parsedValue.ToString();
}
}
else
{
inputField.text = NeedResourceCount.ToString();
// 输入无效(非数字),可以给出提示或者处理
Debug.LogWarning("请输入有效的数字!");
}
}
private void BlindYishiItem()
{
transform.Find("仪式/仪式名称/名字").GetComponent<Text>().text = yishiitem.YiShiname.ToString();
transform.Find("仪式/神赐叶片").GetComponent<Image>().sprite = yishiitem.Sprite;
transform.Find("仪式/开始仪式按钮/所需信仰值").GetComponent<Text>().text = "×" + yishiitem.NeedFaith.ToString();
transform.Find("仪式/神赐叶片/描述/旨意/资源/祷词").GetComponent<TextMeshProUGUI>().text = TextUp(yishiitem.RemainsPrayer);
transform.Find("仪式/神赐叶片/描述/旨意/遗物/祷词").GetComponent<TextMeshProUGUI>().text = TextUp(yishiitem.RemainsPrayer);
transform.Find("仪式/神赐叶片/描述/旨意/降神/祷词").GetComponent<TextMeshProUGUI>().text = TextUp(yishiitem.GodPrayer);
PrayerText();
}
private void BlindRewardUIClose(Transform rewardUI)//
{
Image imageToClick = rewardUI.GetComponent<Image>();
imageToClick.GetComponent<Image>().gameObject.AddComponent<EventTrigger>();
EventTrigger trigger = imageToClick.GetComponent<EventTrigger>();
// 创建PointerClick事件
EventTrigger.Entry entry = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerClick
};
entry.callback.AddListener((data) =>
{
rewardUI.gameObject.SetActive(false);
gameObject.SetActive(false);
playableDirector.time = 0;
playableDirector.Evaluate();
});
trigger.triggers.Add(entry);
}
private void BlindRewardUICloseTwo(Transform rewardUI)//
{
Image imageToClick = rewardUI.GetComponent<Image>();
imageToClick.GetComponent<Image>().gameObject.AddComponent<EventTrigger>();
EventTrigger trigger = imageToClick.GetComponent<EventTrigger>();
// 创建PointerClick事件
EventTrigger.Entry entry = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerClick
};
entry.callback.AddListener((data) => { gameObject.SetActive(false); BagActive(false); });
trigger.triggers.Add(entry);
}
#endregion
#region
/// <summary>
/// 开始奖励
/// </summary>
/// <param name="yiShiReward"></param>
private void OpenRewardUI(YiShiReward yiShiReward)
{
Transform RewardUi = transform.Find("奖励界面");
RewardUi.gameObject.SetActive(true);
RewardUi.Find("奖励文本").GetComponent<TextMeshProUGUI>().text = "";
switch (yiShiReward.rewardtype)
{
case RewardType.God://神降
AddGodTimes(yiShiReward.God);
Debug.LogWarning("神降");
break;
case RewardType.Remains://遗物
Debug.LogWarning("遗物");
List<RemainsItem> items = yiShiReward.remains;
RewardUi.Find("奖励item").GetComponent<Image>().sprite = items[0].remainssprite;
RewardUi.Find("奖励文本").GetComponent<TextMeshProUGUI>().text = "获得" + items[0].name;
BagControl.Instance.AddRemains(items[0]);//将奖励添加进背包
break;
case RewardType.Resource://资源
Debug.LogWarning("资源");
GetResourceReward(yiShiReward.resourceKind, yiShiReward.Resourcecount);
break;
default:
break;
}
}
private void AddGodTimes(GodType godType) //降神次数加1
{
GetGodReward(godType);
for (int i = 0; i < godComingTimes.Count; i++)
{
if (godComingTimes[i].godType == godType)
{
GodComingTimes godTimes = godComingTimes[i];
godTimes.Count++;
godComingTimes[i] = godTimes;
}
}
}
private void GetGodReward(GodType godType)
{
int index = 0;
string str = "";
switch (godType)
{
case GodType.Sun:
index = 0;
str = "召唤日神!!!(强制白昼)";
GameProcedureManager.Instance.ForceDay();
break;
case GodType.war:
index = 1;
str = "召唤战神!!!";
break;
case GodType.spring:
index = 2;
str = "召唤春神!!!(全局倍率+5)";
break;
default:
break;
}
transform.Find("奖励界面/奖励item").GetComponent<Image>().sprite = Godsprites[index];
transform.Find("奖励界面/奖励文本").GetComponent<TextMeshProUGUI>().text = str;
}
private void GetResourceReward(ResourceKind resourceKind, int count)
{
//int index = 0;
string str = "";
switch (resourceKind)
{
case ResourceKind.Stone://index = 0;
str = "石头+" + count.ToString();
break;
case ResourceKind.faith://index = 1;
str = "信仰+" + count.ToString();
break;
case ResourceKind.wood://index = 2;
str = "木头+" + count;
break;
default:
break;
}
//transform.Find("奖励界面/奖励item").GetComponent<Image>().sprite = Godsprites[index];
transform.Find("奖励界面/奖励文本").GetComponent<TextMeshProUGUI>().text = str;
}
#endregion
private string TextUp(string originalText)//文本从上到下排布
{
// 将文本按段落拆分
string[] lines = originalText.Split('\n');
// 创建一个 StringBuilder 用于存储最终生成的竖排文本
StringBuilder formattedText = new StringBuilder();
// 找到每一段的最长长度,保证每列字符能够对齐
int maxLineLength = 0;
foreach (string line in lines)
{
if (line.Length > maxLineLength)
maxLineLength = line.Length;
}
// 构建竖排文本,从右向左读取
for (int i = 0; i < maxLineLength; i++)
{
for (int j = lines.Length - 1; j >= 0; j--)
{
// 检查当前行是否有字符
if (i < lines[j].Length)
{
formattedText.Append(lines[j][i]);
}
else
{
// 如果当前行没有字符,补空格
formattedText.Append(" ");
}
}
// 每列结束后换行
formattedText.Append("\n");
}
return formattedText.ToString();
}
public void PrayerText()
{
List<RemainsItem> remainsItems = new List<RemainsItem>();
for (int i = 0; i < ItemUIs.Count; i++)
{
if (ItemUIs[i].ItemName != "")//存在遗物
{
remainsItems.Add(BagControl.Instance.bag.GetRemainsItem(ItemUIs[i].ItemName));
}
}
string ratestr = yishiitem.GetRate(RewardType.Resource, remainsItems);
transform.Find("仪式/神赐叶片/描述/旨意/资源/概率").GetComponent<TextMeshProUGUI>().text = TextUp(ratestr);
Debug.LogWarning(ratestr);
ratestr = yishiitem.GetRate(RewardType.Remains, remainsItems);
transform.Find("仪式/神赐叶片/描述/旨意/遗物/概率").GetComponent<TextMeshProUGUI>().text = TextUp(ratestr);
Debug.LogWarning(ratestr);
ratestr = yishiitem.GetRate(RewardType.God, remainsItems);
transform.Find("仪式/神赐叶片/描述/旨意/降神/概率").GetComponent<TextMeshProUGUI>().text = TextUp(ratestr);
Debug.LogWarning(ratestr);
}
}