Суть проблемы: при использовании метода HideItemsInHand внутри ShowItemInHand() ломается аниматор и анимация застывает на 1 кадре
Скрипт:
using UnityEngine;
using UnityEngine.UI;
public class QuickslotInventory : MonoBehaviour
{
// Объект у которого дети являются слотами
[SerializeField] private Transform quickslotParent;
[SerializeField] private Transform _itemHolder;
[SerializeField] private InventoryManager inventoryManager;
public int currentQuickslotID = 0;
[SerializeField] private Sprite selectedSprite;
[SerializeField] private Sprite notSelectedSprite;
[SerializeField] private MenuPaused _menuManager;
[SerializeField] private InventorySlot _activeSlot;
// Update is called once per frame
void Update()
{
float mw = Input.GetAxis("Mouse ScrollWheel");
// Используем колесико мышки
if (mw < 0.1 && _menuManager.isMenuPaused == false && quickslotParent.childCount < 5)
{
// Берем предыдущий слот и меняем его картинку на обычную
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = notSelectedSprite;
// Если крутим колесиком мышки вперед и наше число currentQuickslotID равно последнему слоту, то выбираем наш первый слот (первый слот считается нулевым)
if (currentQuickslotID >= quickslotParent.childCount-1)
{
currentQuickslotID = 0;
}
else
{
// Прибавляем к числу currentQuickslotID единичку
currentQuickslotID++;
}
// Берем предыдущий слот и меняем его картинку на "выбранную"
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = selectedSprite;
_activeSlot = quickslotParent.GetChild(currentQuickslotID).GetComponent<InventorySlot>();
ShowItemInHand();
// Что то делаем с предметом:
}
if (mw > -0.1 && _menuManager.isMenuPaused == false && quickslotParent.childCount < 5)
{
// Берем предыдущий слот и меняем его картинку на обычную
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = notSelectedSprite;
// Если крутим колесиком мышки назад и наше число currentQuickslotID равно 0, то выбираем наш последний слот
if (currentQuickslotID <= 0)
{
currentQuickslotID = quickslotParent.childCount-1;
}
else
{
// Уменьшаем число currentQuickslotID на 1
currentQuickslotID--;
}
// Берем предыдущий слот и меняем его картинку на "выбранную"
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = selectedSprite;
_activeSlot = quickslotParent.GetChild(currentQuickslotID).GetComponent<InventorySlot>();
ShowItemInHand();
// Что то делаем с предметом:
}
// Используем цифры
for(int i = 0; i < quickslotParent.childCount; i++)
{
// если мы нажимаем на клавиши 1 по 5 то...
if (Input.GetKeyDown((i + 1).ToString()) && _menuManager.isMenuPaused == false && quickslotParent.childCount < 5)
{
// проверяем если наш выбранный слот равен слоту который у нас уже выбран, то
if (currentQuickslotID == i)
{
// Ставим картинку "selected" на слот если он "not selected" или наоборот
if (quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite == notSelectedSprite)
{
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = selectedSprite;
_activeSlot = quickslotParent.GetChild(currentQuickslotID).GetComponent<InventorySlot>();
ShowItemInHand();
}
else
{
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = notSelectedSprite;
_activeSlot = null;
HideItemsInHand();
}
}
// Иначе мы убираем свечение с предыдущего слота и светим слот который мы выбираем
else
{
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = notSelectedSprite;
currentQuickslotID = i;
quickslotParent.GetChild(currentQuickslotID).GetComponent<Image>().sprite = selectedSprite;
_activeSlot = quickslotParent.GetChild(currentQuickslotID).GetComponent<InventorySlot>();
ShowItemInHand();
}
}
}
}
private void ShowItemInHand()
{
if (_activeSlot.item == null)
{
return;
}
for (int i = 0; i < _itemHolder.childCount; i++)
{
if (_activeSlot.item.itemName == _itemHolder.GetChild(i).name)
{
_itemHolder.GetChild(i).gameObject.SetActive(true);
}
}
}
private void HideItemsInHand()
{
for (int i = 0; i < _itemHolder.childCount; i++)
{
_itemHolder.GetChild(i).gameObject.SetActive(false);
}
}
}
Частично помогло
_animator.keepAnimatorStateOnDisable = true;
, но при дефолтно значении, то есть false в аниматоре следующая картина: анимации застывают на 1 кадре и не могут проиграться дальше