Проблема с магазином скинов в юнити

делаю игрушку на юнити, начал разрабатывать магазин и столкнулся с проблемой - при попытке скроллинга как у меня после окончания списка все ломается. Как это можно исправить? Я пробовал делать ресет int переменной в разных случаях, это не помогало, само значение меняю в другом скрипте он и основной скрипт смены указаны ниже

using UnityEngine;
using UnityEngine.UI;
public class ShopController : MonoBehaviour
{
    public int CurrentStyle = 1;
    public Sprite[] StyleFront;//в этом списке лежат 3 спрайта для тех трех обьектов, в случае если в списке спрайтов не остается все ломается к чертям собачим
    public GameObject[] StyleObj;//в этом списке лежат 3 обьекта у которых я меняю спрайт
    private void Update()
    {
        StyleObj[0].GetComponent<Image>().sprite = StyleFront[CurrentStyle];
        StyleObj[1].GetComponent<Image>().sprite = StyleFront[CurrentStyle+1];
        StyleObj[2].GetComponent<Image>().sprite = StyleFront[CurrentStyle-1];
    }
}

И второй скрипт

using UnityEngine;
using UnityEngine.UI;
public class ClickChanger : MonoBehaviour
{
public ShopController shp;
public bool isLeft;

public void Click()
{
    if (isLeft)
    {
        shp.CurrentStyle = shp.CurrentStyle -= 1;
    }
    if (!isLeft)
    {
        shp.CurrentStyle = shp.CurrentStyle += 1;
        
    }
}

}

Я перепробовал просто все, ничего не выходит, по сути на третьем должно все при нажатии кнопки выглядеть как на центральном скриншоте, но выглядит это все как на первом32 скрин при запуске


Ответы (1 шт):

Автор решения: Yaroslav

@МаксимФисман пишет по делу, фраза я/мы/люди не экстросенс/ы или что-то типа экстросенс в отпуске рядовая. Введи экстросенс в поиск по SO. Это твой косяк.

Второй косяк в том, что ты посмотрел на ошибку, как баран на новые ворота. Текст ошибки Index out of range довольно однозначен, там даже указано на какой строчке и кликнув по ошибке, тебе это место покажут. На крайний случай ошибку можно была тупо загуглить.

ShopController должен выглядеть так:

using UnityEngine;
using UnityEngine.UI;

public class ShopController : MonoBehaviour {
    
    // все поля только для внутреннего пользования и должны быть private
    [SerializeField] private Sprite[] _sprites;
    [SerializeField] private Image[] _images;
    private int _currentIndex = 1;
    
    // это называется свойство, похоже на метод, но без аргументов и содержит только get и/или set
    public int CurrentIndex  {
        get => _currentIndex;
        set {
            if (_currentIndex != value) {
                _currentIndex = value;
                UpdateIndex ();
            }
        }
    }

    // это исключительно событийная, а не постоянная история и никакого Update тут быть не должно, тем более с GetComponent
    private void UpdateIndex () {
        if (_images != null && _sprites != null && _images.Length > 0 && _sprites.Length > 0)) {
            ImageSetSprite(0, _currentIndex-1);
            ImageSetSprite(1, _currentIndex);
            ImageSetSprite(2, _currentIndex+1);
        }
    }

    private void ImageSetSprite (int imageIndex, int spriteIndex) {
        if (imageIndex < _images.Length) {
            while (spriteIndex >= _sprites.Length)
                spriteIndex -= _sprites.Length;
            while (spriteIndex < 0)
                spriteIndex += _sprites.Length;
            _images[imageIndex].sprite = _sprites[spriteIndex];
        }
    }
}

using UnityEngine;
using UnityEngine.UI;

public class ClickChanger : MonoBehaviour {

    [SerializeField] private ShopController _controller;
    
    // у событий клика можно указывать одинарные аргументы
    //  +1/-1 соответственно
    public void Click (int change) {
        if (_controller != null)
            _controller.CurrentIndex += change;
    }
}
→ Ссылка