Инициализация экземпляров префаба

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

Инициализация экземпляров префаба

Сообщение Aberration 17 июл 2019, 23:38

Добрый день! Обращаюсь за помощью к опытным головам по поводу небольшой проблемы, решить которую у меня, как у салаги, до сих пор не получилось.

Есть префабы фруктов с соответствующими именами - "Orange", "Banana", "Peech". На этих префабах висит один и тот же скрипт, в котором прописаны свойства всех этих вполне конкретных фруктов. Когда префаб инстанциируется, он должен инициализировать свои параметры посредством считывания имени, вот так:
Синтаксис:
Используется csharp
void Start()
    {
        switch (gameObject.name)  
        {
            case ("Orange"):
            color = colorRGB.orange;
            text1 = "Это апельсин";
            break;

            case ("Banana"):
            color = colorRGB.yellow;
            text1 = "Это банан";
            break;

            case ("Watermelon"):
            color = colorRGB.green;
            text1 = "Это арбуз";
            break;
       }
    }
public enum colorRGB {orange, yellow, green}



Так вот этого не происходит. Объекты инстанциируются, но вот параметры пустые, и не хотят заполняться и инициализироваться. Что я делаю не так?

P.S. Если вы знаете какой-то иной, более лучший метод инициализации экземпляра префаба, поделитесь, пожалуйста.
Заранее спасибо.
Скрытый текст:
(извиняюсь за свой одноклеточный код))
Аватара пользователя
Aberration
UNец
 
Сообщения: 5
Зарегистрирован: 17 июл 2019, 23:12

Re: Инициализация экземпляров префаба

Сообщение waruiyume 18 июл 2019, 00:31

Не проще настроить префабы, а не пытаться сделать это после инстаса?
Скорее всего имя объекта (Instance)Orange, а не Orange.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Инициализация экземпляров префаба

Сообщение Tolking 18 июл 2019, 00:42

или Orange (Clone)
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Инициализация экземпляров префаба

Сообщение Aberration 18 июл 2019, 00:57

Tolking писал(а):или Orange (Clone)


Так и есть, при создании экземпляру присваивается имя Orange(Clone). Однако, если даже написать:
Синтаксис:
Используется csharp
 switch (gameObject.name)  
        {
            case ("Orange(Clone)"):
            color = colorRGB.orange;
            text1 = "Это апельсин";
            break;
 
       }


- все равно результат тот же.
Пробовалось и с (Clone), и без. С условием gameObject.name; this.name; this. gameObject.name - ноль реакции. Не инициализируется. Возник даже безумный вопрос - а может, .name - это и вовсе не string, а какой-то другой хитрый тип?
Тут какой-то момент, который я никак не могу раскусить.

Tolking писал(а):Не проще настроить префабы, а не пытаться сделать это после инстаса?


Т.е. - написать для каждого префаба фрукта свой собственный скрипт, где эти свойства будут четко установлены с самого начала?
А если у меня этих фруктов будет 100? 100 разных скриптов?
Аватара пользователя
Aberration
UNец
 
Сообщения: 5
Зарегистрирован: 17 июл 2019, 23:12

Re: Инициализация экземпляров префаба

Сообщение AngryCat 18 июл 2019, 01:11

Просто вначале метода добавь
Синтаксис:
Используется csharp
gameObject.name = gameObject.name.Replace("(Clone)","");
P.S перед клон, возможно, стоит пробел. Так что если не выйдет, то попробуй так " (Clone)"
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Инициализация экземпляров префаба

Сообщение Tolking 18 июл 2019, 01:19

color и text1 сделай паблик и в инспекторе напиши им значения
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Инициализация экземпляров префаба

Сообщение Aberration 18 июл 2019, 01:55

Спасибо за советы, но все они, как оказалось, были немного не туда.

Проблема решена. Как? Не поверите - принудительным вызовом функции start() в основном скрипе при инстанциировании. :)
Как оказалось, если написать:
Синтаксис:
Используется csharp
Banana = Instantiate (....,...,...) as GameObject;
Debug.Log(Fruit1.GetComponent<Fruits>().text1);
 

то банан, находящийся в сцене, будет инициализирован как надо, т.е. - в инспекторе text1 правильный. А вот Fruit1.GetComponent<Fruits>().text1 будет ссылаться на пустоту - на базовый, абстрактный объект. Но если принудительно вызвать метод start(), то все становится как надо.

Такой вот, как оказалось, хитрый нюанс.
Аватара пользователя
Aberration
UNец
 
Сообщения: 5
Зарегистрирован: 17 июл 2019, 23:12

Re: Инициализация экземпляров префаба

Сообщение waruiyume 18 июл 2019, 02:19

Т.е. - написать для каждого префаба фрукта свой собственный скрипт, где эти свойства будут четко установлены с самого начала?

Судя по ответу, вы не понимаете, что такое префаб.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Инициализация экземпляров префаба

Сообщение ~AvA~ 18 июл 2019, 11:16

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

У меня вопрос, зачем тебе три разных префаба? Если тебе только по имени их различать, то проще хранить только эти имена и один префаб.

Очень странное использование, из-за этого и проблемы лезут необычные
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: Инициализация экземпляров префаба

Сообщение Aberration 18 июл 2019, 12:09

~AvA~ писал(а):У меня вопрос, зачем тебе три разных префаба? Если тебе только по имени их различать, то проще хранить только эти имена и один префаб.



Ну смотри - у меня все три префаба разные.Это GO, содержащие в себе набор спрайтов, уникальный для каждого из фруктов. Я могу приаттачить у ним три разных скрипта (для каждого свой), в которых прописать как константы нужные мне свойства. Но чтобы не плодить скрипты, был сделан один скрипт, в котором содержится вся возможная информация.

Т.е. обычное решение: один префаб=один скрипт? :-?
Аватара пользователя
Aberration
UNец
 
Сообщения: 5
Зарегистрирован: 17 июл 2019, 23:12

Re: Инициализация экземпляров префаба

Сообщение Woland 18 июл 2019, 12:44

Ты либо делаешь 3 разных префаба и из инспектора заранее задаешь им свойства (имена, цвет и т.д.), либо делаешь 1 префаб, при инстансе передаешь в него значение (тип фрукта или что угодно) и в зависимости от значения назначешь параметры/доп компоненты.

У меня сделано как во 2 варианте - есть 1 префаб монстра, на котором висят необходимые скрипты. При инстансе я передаю в скрипт-контроллер моба его ID. В зависимости от ID я вешаю на моба нужный спрайт, задаю различные характеристики (здоровье, скорость, урон и т.д.), а также добавляю необходимые компоненты (скрипты атаки -ближний/дальний бой, скилы и т.д.).

У меня это сделано так, потому что параметры мобов я задаю в отдельном json файле, чтобы можно было быстро добавить/подкорректировать/убрать монстра, не нужно лезть в редактор. Если бы у меня было 3 фрукта, я бы сделал 3 отдельных префаба со своими преднастроенными свойствами и не парился.
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Инициализация экземпляров префаба

Сообщение Aberration 18 июл 2019, 13:22

Понятно, спасибо :)
Аватара пользователя
Aberration
UNец
 
Сообщения: 5
Зарегистрирован: 17 июл 2019, 23:12


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

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

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