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().ChangeRemainskind(ItemName); // obj.GetComponent().sprite = transform.GetComponent().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 results = new List(); // 创建射线检测器,找到与鼠标位置相交的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().sprite = BagControl.Instance.Blocksprite; transform.Find("数量/Text").GetComponent().text = ""; ItemName = ""; } public void GetUI() { transform.GetComponent().sprite = BagControl.Instance.bag.GetSprite(ItemName); transform.Find("数量/Text").GetComponent().text = Count.ToString(); } public void AwkaeItem(string name, int count) { ItemName = name; Count = count; GetUI(); } /// /// 交换 /// 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(""); } }