Я делаю игру памяти на основе учебника - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь создать базу игр для памяти в учебнике, который вы можете найти здесь

Все шло хорошо, пока я не получил это исключение:

IndexOutOfRangeException: индекс массива находится вне диапазона. GameController.addgamepuzzles () (в Assets / memorygame / scripts / GameController.cs: 43)

Это строка

gamepuzzles.Add(puzzles[index]);

Это мой действительный код:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class GameController : MonoBehaviour {
[SerializeField]
private Sprite bgimage;

public Sprite[] puzzles;

public List<Sprite> gamepuzzles = new List<Sprite>();

public List<Button> btns = new List<Button>();



void Start () {
    GetButttons();
    AddListeners();
    addgamepuzzles();
    puzzles = Resources.LoadAll<Sprite> ("Sprites/Candy");
}
void GetButttons()
{
    GameObject[] objects = GameObject.FindGameObjectsWithTag("PuzzleButton");

    for(int i = 0; i < objects.Length; i++){
        btns.Add(objects[i].GetComponent<Button>());
        btns[i].image.sprite = bgimage;
    }
}

void addgamepuzzles(){
    int looper = btns.Count;
    int index = 0;
    for (int i = 0; i < looper; i++){

        if (index == looper / 2){
            index = 0;
        }

        gamepuzzles.Add(puzzles[index]);

        index++;
    }
}

void AddListeners(){
    foreach (Button btn in btns){
        btn.onClick.AddListener(() => PickPuzzle());
    }
}

public void PickPuzzle(){
    string name = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.name;
    Debug.Log("you clicked a button with name: " + name);
}
}

Это мой сценарий добавления кнопок

using UnityEngine;
using System.Collections;

public class AddButtons : MonoBehaviour {
[SerializeField]
public Transform PuzzleFiled;
[SerializeField]
private GameObject btn;



void Awake () {

    for(int i = 0; i < 8; i++){
        GameObject button = Instantiate(btn);
        button.name ="" +i;
        button.transform.SetParent(PuzzleFiled, false);
    }

}
}

Два сценария прикреплены к пустому gameObject диспетчеру игровых вызовов. Также у меня есть панель под названием Puzzle Field с прикрепленным к ней элементом сетки. У меня есть также сборный с кнопкой и сценарием изображения на нем.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

Вы index больше, чем размер вашего массива головоломок. Я предполагаю, что проблема возникает, когда вы заполняете свой массив:

puzzles = Resources.LoadAll<Sprite>("Sprites/Candy");

Вы уверены, что это правильный каталог, так как если он не существует, пуст или неправильно написан, то функция ничего не вернет и ваш массив останется пустым

0 голосов
/ 16 апреля 2020

Ну, на самом деле ошибку было легко найти после того, как я посмотрел на весь код, ошибка была в том, что я записал gamepuzzle перед заполнением списка, мне просто нужно было повернуть строку addgamepuzzles (); и поместите его после строки puzzles = Resources.LoadAll ("Sprites / Candy"); Как в примере

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class GameController : MonoBehaviour {
[SerializeField]
private Sprite bgimage;

public Sprite[] puzzles;

public List<Sprite> gamepuzzles = new List<Sprite>();

public List<Button> btns = new List<Button>();



void Start () {
    GetButttons();
    AddListeners();

    puzzles = Resources.LoadAll<Sprite> ("Sprites/Candy");
    addgamepuzzles();
}
void GetButttons()
{
    GameObject[] objects = GameObject.FindGameObjectsWithTag("PuzzleButton");

    for(int i = 0; i < objects.Length; i++){
        btns.Add(objects[i].GetComponent<Button>());
        btns[i].image.sprite = bgimage;
    }
}

void addgamepuzzles(){
    int looper = btns.Count;
    int index = 0;
    for (int i = 0; i < looper; i++){

        if (index == looper / 2){
            index = 0;
        }

        gamepuzzles.Add(puzzles[index]);

        index++;
    }
}

void AddListeners(){
    foreach (Button btn in btns){
        btn.onClick.AddListener(() => PickPuzzle());
    }
}

public void PickPuzzle(){
    string name = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.name;
    Debug.Log("you clicked a button with name: " + name);
}
}
0 голосов
/ 16 апреля 2020

головоломки должны иметь определенное количество элементов перед добавлением к ним. Я думаю, что вы должны сделать publi c Sprite [] puzzles = new Sprite [количество элементов здесь];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...