Суббота, 20 Апреля 2024, 15:27

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Заменить один объект другим в рантайме
Заменить один объект другим в рантайме
alexsilentДата: Среда, 02 Сентября 2015, 06:05 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Собственно вопрос, как заменить скриптами в игре один объект другим, чтобы не потерялись все Child/parent связи, как минимум.
Это нужно, чтобы менять одежду/шляпу/ботинки/лицо у персонажа для кастомизации.

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

это скрин из того неправильного примера кастомизации smile



Добавлено (02 сентября 2015, 06:05)
---------------------------------------------
Этот вариант тоже не подходит, ибо у меня на некоторых шмотках будут специальные скрипты или другие любые посторонние элементы.
Код
GetComponent(MeshFilter).mesh = anotherMesh;


Сообщение отредактировал alexsilent - Среда, 02 Сентября 2015, 06:15
KunkaДата: Среда, 02 Сентября 2015, 06:06 | Сообщение # 2
частый гость
Сейчас нет на сайте
а удалять старый перфаб и ставить на его место новый?

хочешь сделать убийцу WOW, GTA, CRysis, AC - используй FishFace
alexsilentДата: Среда, 02 Сентября 2015, 06:12 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
Цитата Kunka ()
а удалять старый перфаб и ставить на его место новый?

ну да я и имею ввиду так, но как сделать скриптом, чтоб сохранить все связи родителей и детей, и чтобы дети не удалились вместе с удалённым старым объектом!?

другими словами Switch Game Object


Сообщение отредактировал alexsilent - Среда, 02 Сентября 2015, 06:14
KamiRoninДата: Среда, 02 Сентября 2015, 08:49 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Код

1:        GameObject newElement = (GameObject)Instantiate(newElPrfb);
2:        newElement.transform.parent = oldEl.transform.parent;
3:        newElement.transform.position = oldEl.transform.position;
4:        newElement.transform.localScale = oldEl.transform.localScale;
5:        foreach(Transform tr in oldEl.transform)
6:            tr.parent = newElement.transform; // тут может выбить - т.к. список дочерних трансформов олдЕл изменится
7:                    // тогда нужен другой способ их всех перебрать - см под спойлером
8:        Destroy(oldEl);


оно?


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Среда, 02 Сентября 2015, 09:21
alexsilentДата: Среда, 02 Сентября 2015, 11:04 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата KamiRonin ()
оно?


KamiRonin, спасибо! Вполне хороший выход. Я пока временно придумал другой выход.

Сделать невидимый скелет и на этот скелет навешивать уже префабы графики/одежды и аксессуаров.
То есть не нужно будет мучиться с родителями и детьми. Хотя количество GameObject значительно повысится на сцене, надеюсь это не сильно скажется на производительности, из-за того что ещё будут много дополнительных костей.
berilДата: Среда, 02 Сентября 2015, 18:07 | Сообщение # 6
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Такой вариант не подойдет?
- Отвязываем всех детей и привязываем их к пустому обьекту
- Удаляем нужный обьект и создаем, обьект который нам нужен
- Отвязываем детей от пустого обьекта и привязываем к вновь созданному




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Заменить один объект другим в рантайме
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг