Проблема с магазином скинов в юнити
делаю игрушку на юнити, начал разрабатывать магазин и столкнулся с проблемой - при попытке скроллинга как у меня после окончания списка все ломается. Как это можно исправить? Я пробовал делать ресет 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;
}
}
}
Я перепробовал просто все, ничего не выходит, по сути на третьем должно все при нажатии кнопки выглядеть как на центральном скриншоте, но выглядит это все как на первом

Ответы (1 шт):
@МаксимФисман пишет по делу, фраза я/мы/люди не экстросенс/ы или что-то типа экстросенс в отпуске рядовая. Введи экстросенс в поиск по 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;
}
}