MayHeCome/Assets/仪式/C#/YiShiUI.cs
2024-12-18 17:55:34 +08:00

490 lines
16 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;
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);
}
}