Unity2D изменяет изображение спрайта из массива c # - PullRequest
0 голосов
/ 01 декабря 2018

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

public Sprite[] spriteImages = new Sprite[5];

В этом массиве я намерен добавить 5 файлов PNG, которые будут использоваться для обновления спрайта spriteRenderer.У меня две проблемы, я изо всех сил пытаюсь получить доступ к массиву в скрипте спрайта (который я считаю лучшим способом изменить изображение).Я также изо всех сил пытаюсь понять, как изменить изображение спрайтов.В настоящее время я использую этот код:

this.gameObject.GetComponent<SpriteRenderer> ().sprite = GameObject.Find ("UIManager").GetComponent<UIManager> ().spriteImages [0];

В свой список спрайтов я поместил 5 файлов PNG (2D текстуры спрайтов), но когда я запускаю программу, она говорит: «ссылка на объект не установлена ​​на экземпляробъекта ».Не уверен, почему он выдает эту ошибку, когда в массиве есть спрайты?

Игровой объект, на который я ссылаюсь 'UIManager', находится в другой сцене, чем та, с которой я использую находку.Это недействительно?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Есть несколько способов решить вашу проблему.

1) Синглтон-классы .Объявите статический экземпляр вашего класса, в котором хранится массив спрайтов, т.е. класс uIManager.Вы можете сделать свой класс синглтоном, используя метод, показанный в ссылке, или вы можете просто объявить так:

public class UIManager : MonoBehaviour {
    UIManager static instance;

    void Start() {
        instance = this;
    }
}

Хорошая часть - вы можете напрямую ссылаться на свой класс как UIManager.instance и получить все открытые переменные внутри класса.Недостатком является то, что если у вас есть несколько сценариев в одной сцене, это будет относиться только к одному экземпляру, и вы не сможете получить доступ к другим экземплярам сценария, которые присутствуют в сцене.Таким образом, этот метод может использоваться только для одного экземпляра на сцену.

2) Сохранение ссылки на нужный вам скрипт в Unity Editor и назначение его общедоступной переменной в скрипте .Предположим, у вас есть класс A, который выполняет некоторые вычисления, и у вас есть класс B, в котором хранятся некоторые данные;давайте предположим, что его скрипт массива Sprite для вашего скриптаТеперь в классе A вам необходим этот спрайтовый массив для присваивания.Итак, вы можете объявить открытую переменную класса B, т.е. public ClassB classBInstance;.И вы сможете увидеть пустой экземпляр поля ClassB в редакторе единиц.Вы можете напрямую назначить требуемую ссылку и вуаля, вы сможете получить доступ к переменным вашего класса B.

3) Используйте API-интерфейс unity, чтобы найти игровой объект, к которому присоединен ваш класс.Вот некоторые из API, которые я регулярно использую, помимо двух методов:

  • Вы можете найти один игровой объект с именем или вернет первый объект с именем.GameObject.Find(string name)

  • Возвращает игровые объекты с определенным тегом.Возможно, вы захотите установить игровые объекты с тегом , если вы не знаете, как их установить.
    GameObject.FindGameObjectsWithTag(string tag)

  • Возвращает первый игровой объект с тегом.
    GameObject FindWithTag(string tag)

  • Этот API возвращает первый игровой объект нужного типа.
    GameObject.FindObjectOfType(Type type)

  • Этот API-интерфейс возвратит все игровые объекты с заданным типом. Здесь в обоих случаях тип может иметь тип Class.И это вернет все игровые объекты, к которым прикреплен тип вашего класса.
    GameObject.FindObjectsOfType(Type type)

4) Настройка массива как статического, но еслиесли вы сделаете это, то не сможете получить к нему доступ в редакторе единиц и, следовательно, не сможете назначить спрайты в редакторе.

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

0 голосов
/ 01 декабря 2018

Переменная spriteImages не объявлена ​​как static, и это означает, что вам нужен экземпляр UIManager для доступа к переменной spriteImages в ней.Вы можете пометить его как статический, и вам не нужно будет предоставлять его экземпляр для доступа к нему.

public static Sprite[] spriteImages = new Sprite[5];

Это один из способов исправить эту ошибку, но я не думаю, что вы должны использовать static для этого.UIManager, скорее всего, сценарий, прикрепленный к GameObject, поэтому все, что вам нужно сделать, - это найти GameObject, к которому подключен UIManager, и получить из него компонент UIManager.Этот компонент является экземпляром сценария, необходимого для доступа к переменной spriteImages, не делая ее static.

private UIManager uIManager;

void Start()
{
    //Find the GameObject then the script instance
    GameObject uManagerObj = GameObject.Find("UIManager GameObject");
    uIManager = uManagerObj.GetComponent<UIManager>();

    //Now you can do this with the script instance
    this.gameObject.GetComponent<SpriteRenderer>().sprite = uIManager.spriteImages[0];
}

Обязательно замените "UIManager GameObject" из функции GameObject.Findс именем GameObject к которому прикреплен скрипт UIManager.

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