Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13

Как изменить спрайты дочерних объектов у префаба через код?

03.03.2021, 09:12. Показов 6418. Ответов 24

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу игру на Юнити, возникла проблема с префабом.
Изложу вкратце: у меня есть префаб Player. У него есть три дочерних объекта с компонентом SpriteRenderer. Мне нужно через код заменить спрайты у этих объектов. Прилагаю код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
public void Equip1()
    {
       
        
        maingunimage.sprite = ShopItemList[1].icon;
        maincammenu.GetComponent<Camera>().backgroundColor = new Color(0f, 0f, 128f);
        pl = Resources.Load<GameObject>("Player");
        pl.transform.GetChild(0).GetComponent<Image>().sprite = diverbody;
        pl.transform.GetChild(1).GetComponent<Image>().sprite = diverhead;
        pl.transform.GetChild(2).GetComponent<Image>().sprite = diverarms;
        pl.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<Image>().sprite = divergun;
    }
Этот метод я прикрепил к кнопке. На выходе выдаёт ошибку NullReferenceException: Object reference not set to an instance of an object
Shop.Equip1 () (at Assets/Scripts/Shop.cs:8)
Что я сделал неправильно? Как исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2021, 09:12
Ответы с готовыми решениями:

Не могу изменить scale и position префаба через код
История такая. Я создаю объект из префаба. После чего делаю его дочерним по отношению к другому объекту. Затем я меняю его значения scale и...

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в теме теории ООП, так как он кажется мне...

Как изменить цвет у префаба?
Делаю так, пребаф к примеру состроит из таких компонентов Tree - пустой объект, так же добавил MeshRenderer ---BaseTree - куб ...

24
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 11:18
Цитата Сообщение от Ropav90 Посмотреть сообщение
У него есть три дочерних объекта с компонентом SpriteRenderer.
Вы ищите не тот компонент у вас
C#
1
pl.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<Image>()
надо наверное
C#
1
pl.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<SpriteRenderer>()
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 11:22  [ТС]
Я пробовал, ту же ошибку выдаёт
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 16:53
Ropav90,
Ну значит где то в другом месте ошибка. Он а вам говорит что объект к которому вы обращаетесь не наиден, а какой из них вам по 3 строчкам никто не скажет. Только если сами наткнетесь. Ищите Debug-ом
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 18:02  [ТС]
Скорее всего проблема к объекту pl.Это к нему обращение. Как это можно исправить?
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 19:17
Ropav90,
C#
1
2
pl = Resources.Load<GameObject>("Player");
Instantiate(pl);
Если pl появляется то возможно у вас эти прерменные diverbody, diverhead, diverarms выдают Null. Проверить после
C#
1
2
 maincammenu.GetComponent<Camera>().backgroundColor = new Color(0f, 0f, 128f);
Debug.Log(diverbody);
И если в консоле напишет Null, установить спраиты
Если pl не появляется, значит что то не дает ему. Может папки Rsources нет или вы в нее не положили префаб Player
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 19:35  [ТС]
zhunshun,
Pl не появляется. Я создавал папку, назвал Resources и добавил туда этот объект. В чем еще может быть причина? В инспекторе я добавил этот объект, спрайты тоже добавил, у дочерних объектов моего префаба есть компонент SpriteRenderer у каждого...
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 20:04
Ropav90, А что у вас за объект та такой что не появляется. Нажмите "Открыть префаб", сделайте скрин его дочерних объектов

Добавлено через 9 минут
Цитата Сообщение от Ropav90 Посмотреть сообщение
В инспекторе я добавил этот объект
Если он есть в инспекторе, тогда зачем делать Resources.Load? Просто инстантиируите его переменную Instantiate метод. Я что то не понимаю. Код где вы его переменную назначаете покажете как она у вас называетса?
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 20:16  [ТС]
zhunshun,

Я исправил проблему, убрал Resources.Load и в инспекторе добавил префаб, сглупил. Однако вылезла другая проблема - спрайты не заменились, хотя в коде ошибки не показывает.
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 20:28
Делаете
C#
1
pl.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<SpriteRenderer>()
?

Добавлено через 5 минут
Делаете
C#
1
pl.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<SpriteRenderer>()
?
Тут еще такои способ
C#
1
2
3
4
5
GameObject obj = Instantiate(pl);
obj.transform.GetChild(0).GetComponent<SpriteRenderer>().sprite = diverbody;
        obj.transform.GetChild(1).GetComponent<SpriteRenderer>().sprite = diverhead;
        obj.transform.GetChild(2).GetComponent<SpriteRenderer>().sprite = diverarms;
        obj.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<SpriteRenderer>().sprite = divergun;
надо новому объекту менть спраиты
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 20:28  [ТС]
zhunshun,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public GameObject pl;
    public Sprite diverbody;
    public Sprite diverhead;
    public Sprite diverarms;
    public Sprite divergun;
 
    public void Equip1()
    {
 
 
        maingunimage.sprite = ShopItemList[1].icon;
        maincammenu.GetComponent<Camera>().backgroundColor = new Color(0f, 0f, 128f);                
        pl.transform.GetChild(0).GetComponent<SpriteRenderer>().sprite = diverbody;
        pl.transform.GetChild(1).GetComponent<SpriteRenderer>().sprite = diverhead;
        pl.transform.GetChild(2).GetComponent<SpriteRenderer>().sprite = diverarms;
        pl.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<SpriteRenderer>().sprite = divergun; 
    }
Вот итоговый код. В инспекторе префаб добавлен, но спрайты не меняются у дочерних объектов на те, который написаны в коде. Как можно исправить?
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 20:29
Выше код
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 20:30  [ТС]
zhunshun,
Хотел ещё сделать важное примчание: объект уже инициализирован в другой сцене. Мой объект со скриптом, который я привёл выше находится в главном меню, а префаб инициализирован в другой основной сцене.
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 20:38
Цитата Сообщение от Ropav90 Посмотреть сообщение
Хотел ещё сделать важное примчание: объект уже инициализирован в другой сцене.
Вы их можете хоть сколько делать

Добавлено через 5 минут
Instantiate нужно что бы создать объектhttps://docs.unity3d.com/Scrip... tiate.html
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 20:42  [ТС]
zhunshun,
Да, про Instanitiate я знаю, у меня объект уже создан в другой сцене, но почему то ни у префаба, ни у него не заменяются спрайты.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
03.03.2021, 20:44
Цитата Сообщение от Ropav90 Посмотреть сообщение
Хотел ещё сделать важное примчание: объект уже инициализирован в другой сцене. Мой объект со скриптом, который я привёл выше находится в главном меню, а префаб инициализирован в другой основной сцене.
Как же ты умудрился перетащить его в инспектор со второй сцены в первую?
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 20:50  [ТС]
1max1,
Ну смотри, на первой сцене у меня есть объект Shop, из которого я сделал префаб, на этом объекте как раз висит скрипт, о котором я говорил выше. Также у меня есть объект Player, из которого я тоже сделал префаб. В скрипте Shop я объявил публичную переменную типа gameObject и добавил в инспекторе к префабу Shop префаб Player.
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 20:50
Ну так в другой сцене тогда и ставьте этот скрипт. Понял я проблему. Вы хотите выйти с той сцены в меню и оттуда поменять префаб? А потом загрузится обратно, и что бы поменялся скин?
0
0 / 0 / 0
Регистрация: 03.03.2021
Сообщений: 13
03.03.2021, 20:53  [ТС]
zhunshun,
Да, именно так, в главном меню у меня находится магазин. То есть в основной сцене мне нужно ставить этот скрипт на новом пустом объекте? Или же я могу префаб Shop переместить на главную сцену и просто отключить его в инспекторе?
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
03.03.2021, 21:04
Ropav90, Нет так не сделаешь, Тут во первых префаб из скрипта не поменять, и потом еще из сцены в сцену, делаите 2 разных префаба и строку с одной сцены в другую передаваите - название префаба. А игровая сцена будет получать строку и уже тогда Resources.Load и загрузит по названию префаб другой и создадите его после того ничего не меняя
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2021, 21:04
Помогаю со студенческими работами здесь

Как изменить тег в юнити через код, не сразу а через время
Имеется код: if (other.gameObject.tag == &quot;ZeroPlatform&quot;) { other.transform.tag =...

Как PopupMenu формы убрать у дочерних объектов?
Вопрос следующий: у формы есть PopupMenu1, которое появляется на всех дочерних объектах данной формы (едиты, кнопки и т.д.). Как его...

Unity как редактировать отдельный компонент префаба через скрипт
имеется префаб Player,мне нужно изменять компоненты Gun1 и Gun2 во время игры, тоесть заменять на другие оружия фото префаба...

Чтение модели данных как списка из дочерних объектов
Здравствуйте уважаемые специалисты, Я реализовал два приложения (консольных): 1) реализует Web Api сервис Get, 2) клиент который...

Как изменить спрайт объекта через код?
Добрый день. Пытаюсь изменить спрайт объекта через dll. Создаю объект &quot;goPos&quot; в dll, нахожу его и записываю: GameObjects goPos =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru