Всем доброго времени суток! Столкнулся с проблемой: делал магазин скинов в юнити по гайду на юутбе:
https://www.youtube.com/watch?v=JbAsnrBRFBg&list=R.... По началу было всё нормально(проверял с тремя скинами), но позже когда добавил ещё один скин появилась ошибка: index выходит за пределы массива. Кто может подскажите что делать, спасибо!
Ошибка строчке: info[index].isChosen = true;
Вот код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class SkinChanger : MonoBehaviour
{
public Skin[] info;
private bool[] StockCheck;
public Button buyBttn;
public TextMeshProUGUI priceText;
public TextMeshProUGUI coinsText;
public Transform player;
public int index;
public int coins;
private void Awake()
{
coins = PlayerPrefs.GetInt("coins");
index = PlayerPrefs.GetInt("chosenSkin");
coinsText.text = coins.ToString();
StockCheck = new bool[3];
if (PlayerPrefs.HasKey("StockArray"))
StockCheck = PlayerPrefsX.GetBoolArray("StockArray");
else
StockCheck[0] = true;
info[index].isChosen = true;
for (int i = 0; i < info.Length; i++)
{
info[i].inStock = StockCheck[i];
if (i == index)
player.GetChild(i).gameObject.SetActive(true);
else
player.GetChild(i).gameObject.SetActive(false);
}
priceText.text = "CHOSEN";
buyBttn.interactable = false;
}
public void Save()
{
PlayerPrefsX.SetBoolArray("StockArray",StockCheck);
}
public void ScrollRight()
{
if (index < player.childCount)
{
index++;
if (info[index].inStock && info[index].isChosen)
{
priceText.text = "CHOSEN";
buyBttn.interactable = false;
}
else if (!info[index].inStock)
{
priceText.text = info[index].cost.ToString();
buyBttn.interactable = true;
}
else if (info[index].inStock && !info[index].isChosen)
{
priceText.text = "CHOOSE";
buyBttn.interactable = true;
}
for (int i = 0; i < player.childCount; i++)
player.GetChild(i).gameObject.SetActive(false);
// Можно записать так: player.GetChild(index-1).gameObject.SetActive(false);
player.GetChild(index).gameObject.SetActive(true);
}
}
public void ScrollLeft()
{
if (index > 0)
{
index--;
if (info[index].inStock && info[index].isChosen)
{
priceText.text = "CHOSEN";
buyBttn.interactable = false;
}
else if (!info[index].inStock)
{
priceText.text = info[index].cost.ToString();
buyBttn.interactable = true;
}
else if (info[index].inStock && !info[index].isChosen)
{
priceText.text = "CHOOSE";
buyBttn.interactable = true;
}
for (int i = 0; i < player.childCount; i++)
player.GetChild(i).gameObject.SetActive(false);
player.GetChild(index).gameObject.SetActive(true);
}
}
public void BuyButtonAction()
{
if (buyBttn.interactable && !info[index].inStock)
{
if (coins > int.Parse(priceText.text))
{
coins -= int.Parse(priceText.text);
coinsText.text = coins.ToString();
PlayerPrefs.SetInt("coins", coins);
StockCheck[index] = true;
info[index].inStock = true;
priceText.text = "CHOOSE";
Save();
}
}
if (buyBttn.interactable && !info[index].isChosen && info[index].inStock)
{
PlayerPrefs.SetInt("chosenSkin", index);
buyBttn.interactable = false;
priceText.text = "CHOSEN";
}
}
}
[System.Serializable]
public class Skin
{
public int cost;
public bool inStock;
public bool isChosen;
}
Когда добавил скин, изменил StockCheck = new bool[3] на StockCheck = new bool[4]