Prefab кнопки Unity придет как NULL - PullRequest
0 голосов
/ 10 октября 2018

У меня была проблема в течение всего дня, когда мой префаб с кнопкой появляется как ноль.Проблема возникла, когда я перешел от использования GameObject в своем коде к кнопке.Я должен был сделать это для моего слушателя, чтобы подать заявку правильно.Я пытаюсь создать список сохраненных игр из файла, и мне нужно различать кнопки, и я решил применить слушателя к каждой из них, чтобы получить целое число.Конкретная ошибка: «Объект, экземпляр которого вы хотите создать, равен нулю».Вот мой код

void Populate()
{
    Button newObj = Instantiate(NewSave, transform) as Button; // Create GameObject instance

    newObj.name = "NewSave";
    startList();
}
public void startList()
{
    Button newObj;
    int i = 0;

    clearList();
    foreach (PlayerType nextPlayer in GameManager.instance.saveStorage.returnSaves())
    {
        i++;
        // Create new instances of our prefab until we've created as many as is in list
        newObj = (Button)Instantiate(OldSaves, transform);

        //increment slot names
        Debug.Log(i);
        newObj.name = "Slot " + i.ToString();
        newObj.onClick.AddListener(() => ButtonClicked(i));
        saveList.Add(i);
    }


}

Если вы заметили структурные проблемы с созданием определенной кнопки, пожалуйста, не пишите, я несколько раз порвал этот раздел кода с различными предложениями онлайн.

По сути, у меня есть 2 готовых кнопки, одна для новой кнопки сохранения, а другая для отдельных слотов сохранения.Он передает слушателя в функцию сохранения / загрузки и определяет, в какой слот его сохранить, перед отправкой в ​​файл или из файла.Проблема заключается в первом создании кнопки, которая работала нормально, пока я не реализовал настройку прослушивателя и не переключился на использование кнопок.

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

Объекты инспектора

Кнопка Prefab

Спасибо за любую помощь, которая может помочь мне сузить проблему, большинство изПотоки, через которые я прошел, были простыми исправлениями, как будто они забыли подключить его в инспекторе, или у кого-то было несколько сценариев для одного и того же объекта.Я надеюсь, что это просто еще одна глупая ошибка, которую увидят новые глаза.Я опубликую дополнительную информацию или скриншоты по мере необходимости, когда зайду завтра после работы.

Обновление:

Я решил проблему.Я попробовал предложения и печатал, что пошло не так, когда я узнал, что одна из моих ссылок инспектора не была установлена.Я предположил, что при изменении исходных сохранений заполнителей он будет соответствующим образом устанавливать ссылки, однако я должен был изменить его в двух местах, поскольку у меня уже был установлен сценарий для объекта. populateave Раньше я не улавливал его, потому что моя иерархия сохранения состоит из 5 элементов, каждый из которых состоит из нескольких компонентов, поэтому, когда я прикрепил его через инспектор, я просто перешел к главной копии своего сценария.Он только прыгал между моими сценариями и находил, кто вызывает то, что конкретно произошло, и щелкает тот, который фактически содержит мой скрипт populateSave.Я собираюсь отметить второй ответ, потому что именно вы просили меня найти то, что вызывало его, что привело меня к выяснению этого.Большое спасибо, это даже объясняет, почему сейвы тоже не зацикливались, когда я их создавал, я по какой-то причине установил число сейвов в 23, смеется.

Не думаю, что смогу пометить комментарий как ответ, но все же хочу отдать вам должное, вы можете опубликовать свой комментарий как ответ или это противоречит правилам?

1 Ответ

0 голосов
/ 11 октября 2018

Ваша проблема в этой строке:

Button newObj = Instantiate(NewSave, transform) as Button;

Instantiate (обычно) возвращает GameObject.Это другой тип для кнопки.Когда вы используете «как», он пытается привести его к правильному типу.Если это не может, это возвращает нуль.

То, что вы хотите:

Button newObj = (Instantiate(NewSave, transform) as GameObject).GetComponent<Button>();

Я также рекомендовал бы изменить имя переменной этой кнопки.

Имейте в виду, что кнопка - это компонент, который отличается от игрового объекта.

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