Задать вопрос
MaximGS090909
@MaximGS090909

Почему анимация не проигрывается при включении объекта?

Суть проблемы: при использовании метода 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 кадре и не могут проиграться дальше
68acba878a14e663657806.png
  • Вопрос задан
  • 34 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы