Страница 1 из 1

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

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

Есть префабы фруктов с соответствующими именами - "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. Если вы знаете какой-то иной, более лучший метод инициализации экземпляра префаба, поделитесь, пожалуйста.
Заранее спасибо.
Скрытый текст:
(извиняюсь за свой одноклеточный код))

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

СообщениеДобавлено: 18 июл 2019, 00:31
waruiyume
Не проще настроить префабы, а не пытаться сделать это после инстаса?
Скорее всего имя объекта (Instance)Orange, а не Orange.

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

СообщениеДобавлено: 18 июл 2019, 00:42
Tolking
или Orange (Clone)

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

СообщениеДобавлено: 18 июл 2019, 00:57
Aberration
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 разных скриптов?

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

СообщениеДобавлено: 18 июл 2019, 01:11
AngryCat
Просто вначале метода добавь
Синтаксис:
Используется csharp
gameObject.name = gameObject.name.Replace("(Clone)","");
P.S перед клон, возможно, стоит пробел. Так что если не выйдет, то попробуй так " (Clone)"

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

СообщениеДобавлено: 18 июл 2019, 01:19
Tolking
color и text1 сделай паблик и в инспекторе напиши им значения

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

СообщениеДобавлено: 18 июл 2019, 01:55
Aberration
Спасибо за советы, но все они, как оказалось, были немного не туда.

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

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

Такой вот, как оказалось, хитрый нюанс.

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

СообщениеДобавлено: 18 июл 2019, 02:19
waruiyume
Т.е. - написать для каждого префаба фрукта свой собственный скрипт, где эти свойства будут четко установлены с самого начала?

Судя по ответу, вы не понимаете, что такое префаб.

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

СообщениеДобавлено: 18 июл 2019, 11:16
~AvA~
Идея префаба в том, что ты заранее подготовил всё, выставил там свои цвета, приаттачил нужные для этго префаба скирпты и вот это вот всё.
То есть, когда ты создаёшь инстанс конкретного префаба, ничего делать больше не нужно.

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

Очень странное использование, из-за этого и проблемы лезут необычные

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

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



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

Т.е. обычное решение: один префаб=один скрипт? :-?

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

СообщениеДобавлено: 18 июл 2019, 12:44
Woland
Ты либо делаешь 3 разных префаба и из инспектора заранее задаешь им свойства (имена, цвет и т.д.), либо делаешь 1 префаб, при инстансе передаешь в него значение (тип фрукта или что угодно) и в зависимости от значения назначешь параметры/доп компоненты.

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

У меня это сделано так, потому что параметры мобов я задаю в отдельном json файле, чтобы можно было быстро добавить/подкорректировать/убрать монстра, не нужно лезть в редактор. Если бы у меня было 3 фрукта, я бы сделал 3 отдельных префаба со своими преднастроенными свойствами и не парился.

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

СообщениеДобавлено: 18 июл 2019, 13:22
Aberration
Понятно, спасибо :)