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