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

209 lines
7.3 KiB
C#
Raw Normal View History

2024-12-18 09:55:34 +00:00
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("");
}
}