Проблема с Instantiate

Программирование на Юнити.

Проблема с Instantiate

Сообщение siriusspark 14 сен 2016, 23:32

Привет, форум. Столкнулся с проблемой, никак не могу понять что не так.

Сабж: есть автомобиль, он формируется из частей (ну там кузов, капот,бампера и так далее) которые берутся instantiate-ом из папки resources. Название запчасти берется из массива с названиями, который в свою очередь заполняется из БД. Суть я думаю понятна - тюнинг авто. Для каждой модели машины отдельные запчасти разложены по вложенным папкам, то бишь все бамперы конкретного авто лежат в его папке "bumpers", спойлеры в "spoilers" и так далее. При запуске игры стартует цикл, который пробегает по всем папкам выбранной игроком модели авто (названия папок берутся из другого, статического массива) и инстансит оттуда префабы деталей с именами указанными в БД.

Собственно, с этим проблем нет, машина загружается и все на ней на месте. Проблема вот в чем: если в процессе игры стоковая деталь заменена на тюнинговую, то почему-то происходит не как должно быть (стоковая деталь исчезает а ее место занимает новая) а новая деталь занимает свое место но предыдущая не пропадает а остается на авто. Одним словом они торчат одна в другой. Названия деталей в папке различаются (скажем stock_bumper и tuning_bumper) а конструкция инстансирования такая:

Синтаксис:
Используется csharp
Instantiate(Resources.Load("Models/Cars/" + model + "/" + parts[i] + "/" + models[i])


где parts - массив с названиями папок запчастей, а models - массив с их моделями.

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

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

Наверно, немного путано разъяснил, но тем не менее, есть у кого идеи?
Star Wars: Path of lust. 3D-адвенчур 18+ по мотивам Звездных войн | _www.patreon.com/starlordgames
Аватара пользователя
siriusspark
UNIт
 
Сообщения: 106
Зарегистрирован: 10 сен 2015, 09:14

Re: Проблема с Instantiate

Сообщение jetyb 15 сен 2016, 08:39

Ну как может предыдущая деталь пропадать если вы сами пишете, что ее не уничтожаете
Вариант с необходимостью уничтожения предыдущего объекта отпадает

Очевидно предыдущую деталь надо все-таки уничтожать, или уж уничтожать и собирать машину заново.
Отвечаю так, как понял сообщение.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Проблема с Instantiate

Сообщение alt3d 15 сен 2016, 09:28

Чудес не бывает, наверняка где-то в коде закралась ошибка и инстанциируется предыдущая деталь.
Либо машина таки не уничтожается при смене сцены.
alt3d
Старожил
 
Сообщения: 687
Зарегистрирован: 04 сен 2011, 21:19
  • Сайт
  • ICQ

Re: Проблема с Instantiate

Сообщение siriusspark 15 сен 2016, 09:37

Так суть в том что машина собирается при загрузке сцены, то бишь уничтожать нечего.

Поясню. Игрок запускает игру, загружается сцена города, при этом стартует скрипт и машина собирается. Далее, игрок катается по городу, заезжает в гараж. Гараж - отдельная сцена, то бишь она загружается, и машина в гараже снова собирается тем же скриптом. Далее, игрок на машине что то поменял. скажем поставил другие фары. Жмет "применить изменения", данные о фарах в БД обновляются, туда вписывается модель новых вместо того что было раньше. Игрок выходит из гаража, снова загружается сцена города и машина снова собирается тем же скриптом, но поскольку данные в БД изменились, фары подгружаются уже новые, те что были в гараже установлены. То есть старых как таковых на машине уже не может быть по умолчанию, машина собирается заново и на место фар ставится совершенно другой префаб.

Отчасти это теория, поскольку гараж еще не реализован. Но реализована сборка машины по данным из БД. То есть при запуске сцены, если я вручную меняю в БД модель какой-либо детали, по логике вещей должна подгружаться именно она. Все соответствующие префабы в папках присутствуют.

Еще раз объясню - если я изначально запускаю сцену с прописанной в БД деталью "А" - все ок. Но если я запускаю игру с изначально опять таки прописанной в БД деталью "Б" - грузятся почему то обе сразу, одна в другой. Хотя деталь "А" при этом просто нигде не указана и откуда скрипт ее выкапывает понять в упор не могу. Вот в чем беда.
Star Wars: Path of lust. 3D-адвенчур 18+ по мотивам Звездных войн | _www.patreon.com/starlordgames
Аватара пользователя
siriusspark
UNIт
 
Сообщения: 106
Зарегистрирован: 10 сен 2015, 09:14

Re: Проблема с Instantiate

Сообщение redfenix 18 сен 2016, 17:50

Нужен скрипт чтобы понять где ошибка.
Сохраняется ли какая-либо информация об предыдущих деталях установленных на авто в базе данных?Или после изменения детали происходит удаление данных из базы?
redfenix
UNец
 
Сообщения: 12
Зарегистрирован: 18 сен 2016, 14:08

Re: Проблема с Instantiate

Сообщение immeasurability 26 сен 2016, 19:15

1 идентификация авто
2 каждый тип детали должен иметь свое поле в скрипте авто
3 скрипт_авто.бампер
4 скрипт_авто.капот
5 ...
6 if(скрипт_авто.бампер){
7 Destroy(скрипт_авто.бампер)
8 }
9 скрипт_авто.бампер=Instantiate(бампер);
Discord era#6140

youtube.com/user/immeasurability/videos
Аватара пользователя
immeasurability
Адепт
 
Сообщения: 1097
Зарегистрирован: 08 авг 2013, 18:09

Re: Проблема с Instantiate

Сообщение siriusspark 26 дек 2016, 21:10

redfenix, данные о предыдущей детали перезаписываются данными о новой детали. Данных о старой после замены более не существует.

immeasurability, спасибо за совет, попробую
Star Wars: Path of lust. 3D-адвенчур 18+ по мотивам Звездных войн | _www.patreon.com/starlordgames
Аватара пользователя
siriusspark
UNIт
 
Сообщения: 106
Зарегистрирован: 10 сен 2015, 09:14

Re: Проблема с Instantiate

Сообщение siriusspark 13 фев 2017, 21:57

Знаете, а тут чем дальше в лес, тем злее партизаны....

Попробовал на интерес добавить к машине еще одну тюнингованную деталь (раньше только фары были). Теперь есть еще люк. И вдруг(!) - оно взяло и нормально таки заменилось, безо всяких там посторонних наложений.

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

Синтаксис:
Используется csharp
public class CarStructure : MonoBehaviour {
private string model = GlobalData.PlayerCar;
private GameObject Car;
private string[] parts = {"Chassis", "FrontBumper", "Glass", "HeadLight", "Hatch", "Highlight", "Hood", "Mirrors", "Molding", "Pipe", "RearBumper", "RearLight", "Spoiler"};
private string[] types = {"Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock"};

void Awake () {
        Car = GameObject.Find("Player");
        Construct();
}

void Construct(){
        int i;
        for(i=0;i<13;i++){
        GameObject tmp = Instantiate(Resources.Load("Models/Cars/" + model + "/" + parts[i] + "/" + types[i]), new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z),  Quaternion.identity) as GameObject;
        tmp.transform.parent = Car.transform;
        tmp.name = parts[i] + "_" + types[i];
}
}
}


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

В итоге имеем все красиво (образно говоря, потому что детали пока что - набор кубиков :))

Изображение

Все запчасти на своих местах, все стоковое, что мы наглядно видим в иерархии объектов.

Далее я меняю модель крышного люка "Hatch" (со Stock на Classic):

Синтаксис:
Используется csharp
private string[] parts = {"Chassis", "FrontBumper", "Glass", "HeadLight", "Hatch", "Highlight", "Hood", "Mirrors", "Molding", "Pipe", "RearBumper", "RearLight", "Spoiler"};
private string[] types = {"Stock", "Stock", "Stock", "Stock", "Classic", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock"};
 


Думаю объяснять что индексы второго массива соответствуют индексам первого не надо)) Поэтому во втором меняем пятый по счету элемент, соответствующий значению "Hatch" в первом и в итоге наблюдаем красоту - люк изменился, а старого как не бывало, как собственно и задумано.

Изображение

В иерархии наблюдаем ту же картину - люк теперь не Stock а Classic.

А вот теперь самое интересное. Я меняю многострадальные (хотя еще кто с кем настрадался я вас спрашиваю))) ) фары (элемент №4, "Headlight"):

Синтаксис:
Используется csharp
private string[] parts = {"Chassis", "FrontBumper", "Glass", "HeadLight", "Hatch", "Highlight", "Hood", "Mirrors", "Molding", "Pipe", "RearBumper", "RearLight", "Spoiler"};
private string[] types = {"Stock", "Stock", "Stock", "Classic", "Classic", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock", "Stock"};
 


И здрасьте вам:

Изображение

В иерархии что интересно фары как и положено становится Classic. И нигде не наблюдается в упор фар с именем Stock. Но вот откуда ж они елки-палки берутся на модели???....

Люк тем временем продолжает быть каким положено, при смене в коде обратно на сток благополучно меняется снова на стоковый. А вот с фарами вот такая вот ерунда. Ну вот что это может быть? Понятно если бы со всеми деталями были проблемы, но вот ведь люк себе спокойно изменился.

У кого какие идеи?...
Аватара пользователя
siriusspark
UNIт
 
Сообщения: 106
Зарегистрирован: 10 сен 2015, 09:14

Re: Проблема с Instantiate

Сообщение samana 13 фев 2017, 22:14

siriusspark писал(а):У кого какие идеи?...

Может неправильные имена в ресурсах или объекты фар stock и classic одинаковые?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблема с Instantiate

Сообщение siriusspark 14 фев 2017, 09:51

Да в том-то и прикол, что все разное. И имена, и объекты. Последнее даже на скриншоте видно, они разного цвета и друг сквозь друга просвечивают.

Самое интересное, что префаб люка я сделал из той же сетки, просто слегка поиграл с масштабом. А префаб фар сделан из другой сетки нежели первый, как по идее и должно быть, ведь геометрия запчастей по умолчанию должна быть разной. И вот нате вам.
Star Wars: Path of lust. 3D-адвенчур 18+ по мотивам Звездных войн | _www.patreon.com/starlordgames
Аватара пользователя
siriusspark
UNIт
 
Сообщения: 106
Зарегистрирован: 10 сен 2015, 09:14


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 12