Unity: не может редактировать публичный Sprite [] [] в инспекторе - PullRequest
0 голосов
/ 11 июня 2018

Каждый раз, когда я хочу играть в мою Игру со следующим приложенным сценарием:

//...

    public Sprite[][] ObjectTypestobuy;
    public Sprite[] Characters;     
    public Sprite[] Helmets;
    public Sprite[] Weapons;
    public Sprite[] Mantles;
    public Sprite[] Shields;

void Start()
{
        ObjectTypestobuy[0] = Characters; //this is the error line
        ObjectTypestobuy[1] = Helmets;
        ObjectTypestobuy[2] = Weapons;
        ObjectTypestobuy[3] = Mantles;
        ObjectTypestobuy[4] = Shields;
}

... мне выдается ошибка: NullReferenceException:

> Object reference not set to an instance of an object (wrapper
> stelemref) object:stelemref (object,intptr,object) Shop_Handler.Start
> () (at Assets/Shop_Handler.cs:88)

Строка, которая отмеченакак ошибка это:

ObjectTypestobuy[0] = Characters;

Я думаю, что проблема в том, что он говорит, что я должен отредактировать public Sprite[][] ObjectTypestobuy; в Инспекторе.Но я не могу найти это у инспектора.

Что мне теперь делать?Большое спасибо!

Jul

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

К сожалению, вы еще не инициализировали массив.Этот тип массива называется «зубчатым» массивом.

Итак, ответ здесь на этой странице здесь от Microsoft.

int[][] jaggedArray = new int[3][];

А затем с помощью инициализаторов, массив может быть заполнен:

jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

К сожалению, Unity не сериализует коллекции Dictionary.Учитывая это ограничение, общая работа для достижения того, чего, я думаю, вы пытаетесь достичь, заключается в следующем:

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

[Serializable]
public struct InventoryCollection
{
    public string Name;
    public List<Sprite> Sprites;
}

public class Inventory: MonoBehaviour
{
    public List<InventoryCollection> ObjectTypesToBuy = new List<InventoryCollection>();
}

Вы заметите, что теперь вы можете вводить элементы непосредственно в Инспектора.окно в Unity, и поле «имя» также будет называть элементы в Инспекторе, для удобства.

0 голосов
/ 11 июня 2018

Прежде чем вы сможете установить значение в массиве, массив должен быть создан.

void Start()
{
        ObjectTypestobuy = new Sprite[5][10]; // for example
        ObjectTypestobuy[0] = Characters; //this is the error line
        ObjectTypestobuy[1] = Helmets;
        ObjectTypestobuy[2] = Weapons;
        ObjectTypestobuy[3] = Mantles;
        ObjectTypestobuy[4] = Shields;
}

Без создания массива вы ничего не можете поместить в него.Вы получаете нулевое исключение, потому что пытаетесь поместить что-то в несуществующий объект.

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