У меня есть ошибка в моем проекте Unity, и для меня нет никакого смысла, почему, попросту говоря, у меня есть скрипт со стеком, который представляет слот инвентаря, когда вы добавляете в него элемент, он толкает его в правильный слот инвентаря, как показано в этом GIF: https://imgur.com/a/wxDpvsG
Слева - инвентарь, справа - коробка со случайными предметами. Моя проблема началась с попытки создать всплывающую подсказку для удаления предметов из инвентаря. Вот скрипт слотов.
public class InvSlots : MonoBehaviour , IPointerEnterHandler, IPointerExitHandler
{
public Stack<Item> items = new Stack<Item>();
public Text stackTxt;
public Image imgItem;
public GameObject ToolTip, Exclude;
public bool IsEmpty
{
get { if (items == null) { return true; } return items.Count == 0; }
}
public int CountItem()
{
return this.items.Count;
}
public Item CurrentItem
{
get { return items.Peek(); }
}
public bool isAvailable
{
get { return CurrentItem.maxnumber > items.Count; }
}
public void addItem(Item item)
{
items.Push(item);
changeSprite(Resources.Load<Sprite>("imgs/ItemIcons/" + item.iconPath));
if (items.Count >= 1)
{
stackTxt.text = items.Count.ToString();
}
}
private void changeSprite(Sprite sprite)
{
imgItem.sprite = sprite;
imgItem.color = new Vector4(1, 1, 1, 1);
}
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("pointer enter " + items.Peek().nome);
if (items.Count > 0)
{
Instantiate(ToolTip, gameObject.transform.position, new Quaternion(), GameObject.Find("BGInv").transform);
GameObject.Find("ToolTipNome").GetComponent<TMPro.TextMeshProUGUI>().text = CurrentItem.nome;
GameObject.Find("ToolTipDesc").GetComponent<TMPro.TextMeshProUGUI>().text = CurrentItem.desc;
}
}
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("pointer exit" + items.Peek().nome);
if (items.Count > 0)
{
Destroy(GameObject.Find("HoverOver Tooltip 1(Clone)"));
}
}
public void OpenExclude()
{
Debug.Log("Open Exclude " + items.Peek().nome);
if (items.Count > 0)
{
Destroy(GameObject.Find("HoverOver Tooltip 1(Clone)"));
Instantiate(Exclude, gameObject.transform.position, new Quaternion(), GameObject.Find("BGInv").transform);
}
}
public void CloseExclude()
{
Debug.Log("Close exclude " + items.Peek().nome);
if (items.Count > 0)
{
Destroy(GameObject.FindGameObjectWithTag("ExcludeItems"));
}
}
public void ExcludeOneItem()
{
Debug.Log("Exclude 1 " + items.Peek().nome);
if (items.Count > 0)
{
items.Pop();
stackTxt.text = items.Count.ToString();
Destroy(GameObject.FindGameObjectWithTag("ExcludeItems"));
}
}
public void ExcludeAllItem()
{
Debug.Log("Exclude all " + items.Peek().nome);
if (items.Count > 0)
{
imgItem.color = new Vector4(1, 1, 1, 1);
items.Clear();
stackTxt.text = "";
Destroy(GameObject.FindGameObjectWithTag("ExcludeItems"));
}
}
}
Таким образом, в основном, у меня есть этот стек элементов, НО всякий раз, когда я пытаюсь получить доступ к стеку с помощью методов CloseExclude (), ExcludeOneItem () и ExcludeAllItem (), стек пуст, но в любом другом методе сценария стек есть предметы, как это должно быть. Я понятия не имею, почему происходит что-то подобное, я никогда не видел ничего подобного. Просто чтобы было ясно, эти методы вызываются из OnClick кнопок, но так же и OpenExclude (), поэтому я не думаю, что это так.
Как вы можете видеть в скрипте, у меня есть куча журналов, вот изображение консоли:
Консоль
И GIF, чтобы помочь вам, ребята, увидеть это более четко:
https://imgur.com/a/KxEsOUl
TLDR У меня есть стек, который не работает с некоторыми методами моего сценария, но отлично работает с другими.