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

209 lines
7.3 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 UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class UIItem : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
public bool NoBag;
private RectTransform rectTransform;
public string ItemName = "";
public int Count = 1;
private bool canDrag;
public void OnBeginDrag(PointerEventData eventData)
{
if (ItemName != "")
{
RemainsKind kind = BagControl.Instance.bag.GetRemainsItem(ItemName).kind;
if (kind == RemainsKind.YishiRemains)
{
canDrag = true;
rectTransform = BagControl.Instance.ChangeDragUI(ItemName);
rectTransform.anchoredPosition = eventData.position;
}
else if (kind == RemainsKind.ScreeenRemains)
{
if (ItemName == "太阳神之眼")
{
GameObject obj = Instantiate(BagControl.Instance.bag.SunRemains);
obj.name = ItemName;
}
else
{
GameObject obj = Instantiate(BagControl.Instance.bag.OtherRemains);
obj.name = ItemName;
obj.GetComponent<BuildRemains>().ChangeRemainskind(ItemName);
// obj.GetComponent<SpriteRenderer>().sprite = transform.GetComponent<Image>().sprite;
}
BagControl.Instance.CloseBagTwo();
BagControl.Instance.bag.CutItems(ItemName);
BagControl.Instance.Refresh();
}
}
}
public void OnDrag(PointerEventData eventData)
{
if (canDrag)
{
rectTransform.anchoredPosition = eventData.position;
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (canDrag)
{
YishiRemainsEvent(eventData);
canDrag = false;
rectTransform.gameObject.SetActive(false);
}
}
public void YishiRemainsEvent(PointerEventData eventData) //仪式遗物
{
// 发射一条射线检测鼠标下的第一个UI
RaycastResult result = RaycastUI(eventData);
// 检测UI元素的tag
if (result.gameObject != null && result.gameObject.CompareTag("bagitem")) // 替换 "YourTargetTag" 为你想要检测的 tag
{
if (result.gameObject.TryGetComponent(out UIItem UiItem))
{
if (UiItem != this)//不等于自身
{
if (NoBag)//自身不是背包
{
if (!UiItem.NoBag)//是背包item
{
if (UiItem.ItemName == ItemName || UiItem.ItemName == "" || BagControl.Instance.bag.GetRemainsItem(UiItem.ItemName).kind != RemainsKind.YishiRemains)//两种类相同(合并)或者item为空
{
BagControl.Instance.RemoveIn(ItemName);//移入背包
Refresh();
}
else
{
BagControl.Instance.RemoveIn(ItemName);//先移入背包
BagControl.Instance.RemoveOut(UiItem.ItemName);//再移出背包
ItemName = UiItem.ItemName;
GetUI();
}
}
else//两个都可交互(都不为背包item)
{
if (UiItem.ItemName == "")
{
UiItem.ItemName = ItemName;
Refresh();
UiItem.GetUI();
}
else
{
ExChange(UiItem);//交换
}
}
}
else//自身是背包
{
if (UiItem.NoBag)//另一个不是背包
{
if (UiItem.ItemName == "")//空的,
{
Debug.LogWarning("背包,不是背包" + ItemName);
string name = ItemName;
BagControl.Instance.RemoveOut(ItemName);//直接移出包
UiItem.ItemName = name;
UiItem.GetUI();
}
else//不为空,也需交换
{
string name = ItemName;
BagControl.Instance.RemoveIn(UiItem.ItemName);//移入背包
BagControl.Instance.RemoveOut(ItemName);
UiItem.ItemName = ItemName;
UiItem.GetUI();
}
}
}
BagControl.Instance.Refresh();
YiShiUI.Instance.PrayerText();
}
}
}
}
private RaycastResult RaycastUI(PointerEventData eventData)
{
// 存储射线结果
List<RaycastResult> results = new List<RaycastResult>();
// 创建射线检测器找到与鼠标位置相交的UI元素
GraphicRaycaster raycaster = BagControl.Instance.graphicRaycaster; // 获取当前Canvas上的GraphicRaycaster
if (raycaster != null)
{
Debug.LogWarning("---射线检测没问题-");
raycaster.Raycast(eventData, results);
Debug.LogWarning(results.Count > 0);
if (results.Count > 0)
{
Debug.LogWarning(results[0].gameObject.name);
}
}
else
{
Debug.LogWarning("---射线检测有问题-");
}
// 返回列表的第一个元素如果没有元素则返回空的RaycastResult
return results.Count > 0 ? results[0] : new RaycastResult();
}
public void Refresh()
{
transform.GetComponent<Image>().sprite = BagControl.Instance.Blocksprite;
transform.Find("数量/Text").GetComponent<Text>().text = "";
ItemName = "";
}
public void GetUI()
{
transform.GetComponent<Image>().sprite = BagControl.Instance.bag.GetSprite(ItemName);
transform.Find("数量/Text").GetComponent<Text>().text = Count.ToString();
}
public void AwkaeItem(string name, int count)
{
ItemName = name;
Count = count;
GetUI();
}
/// <summary>
/// 交换
/// </summary>
private void ExChange(UIItem uIItem)
{
string Aitemname = ItemName;
ItemName = uIItem.ItemName;
uIItem.ItemName = Aitemname;
GetUI();
uIItem.GetUI();
}
public void OnPointerEnter(PointerEventData eventData)
{
BagControl.Instance.MiaosuRemains(ItemName);
}
public void OnPointerExit(PointerEventData eventData)
{
BagControl.Instance.MiaosuRemains("");
}
}