Понедельник, 21 Мая 2018, 06:10

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » программно изменить значение переменной (изменить значение переменной, получая её имя из инспектора)
программно изменить значение переменной
HallowedДата: Суббота, 16 Декабря 2017, 18:51 | Сообщение # 1
был не раз
Сейчас нет на сайте
здравствуйте
необходимо изменить значение переменной, получая её имя из инспектора

хочется вдохнуть жизнь в следующую конструкцию:

Код
public void ClickUp(string par_block)
    {
        GameManager.Instance.par_block = GameManager.Instance.par_block + 1;
        // вопрос в том - как поменять значение переменной, принимаемой в par_block
    }


par_block - название переменной в инспекторе в свойстве события On Click () в инспекторе, пишу в неё, например: Priznak_a или Priznak_b, то есть:
в par_block подставляю название переменной, к которой работающее обращение из скриптов выглядит следующим образом:
GameManager.Instance.Priznak_a=.... или GameManager.Instance.Priznak_b=...

сейчас решаю это отвратительным костылём :((

Код
  public void ClickUp(string par_block)
    {
        switch (par_block)
        {
            case "Priznak_a":
                {
                     GameManager.Instance.Priznak_a = GameManager.Instance.Priznak_a + 1;                    
                }
                break;
        }
    }


помогите пожалуйста написать правильно
pixeyeДата: Суббота, 16 Декабря 2017, 21:22 | Сообщение # 2
Red Winter Software
Сейчас нет на сайте
Можешь показать пример с картинками из инспектора где ты вообще такое используешь?
Просто тут вопрос скорее в том, а нужно ли вообще такое делать ;)


Делаю игру Battlecruiser
VostruginДата: Суббота, 16 Декабря 2017, 21:33 | Сообщение # 3
участник
Сейчас нет на сайте
Hallowed, Пиксай правильно сказал, скорее всего тебе это не нужно. А вообще, такую задачу можно решить рефлексией.



drcrackДата: Воскресенье, 17 Декабря 2017, 00:21 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Тебе нужен SerializableDictionary, который будет и в инспекторе более-менее нормально отображаться, и в коде можно будет работать без рефлексии и прочих костылей



Сообщение отредактировал drcrack - Воскресенье, 17 Декабря 2017, 00:26
HallowedДата: Воскресенье, 17 Декабря 2017, 11:50 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата Vostrugin ()
скорее всего тебе это не нужно

на сцене много пар кнопка-поле_для_ввода
при нажатии на кнопку надо чтобы изменялась соответствующая переменная, хранящаяся в объекте (это синглтон в данном случае, но мог быть и просто объект, хранящий все параметры) название этой переменной я пишу в инспекторе

то есть надо было обратится к свойству объекта, чье имя создается динамически

Цитата drcrack ()
Тебе нужен SerializableDictionary, который будет и в инспекторе более-менее нормально отображаться, и в коде можно будет работать без рефлексии и прочих костылей

можете немного пояснить - как этим пользоваться, а то там даже объявления MonoBehaviour нет и на объект в сцене ни добавить, а три строчки в Description разобраться не помогают

пока буду делать через рефлексию

Код
public void ClickUp(string par_block)
        {
        FieldInfo field = typeof(GameManager).GetField(par_block);
        field.SetValue(GameManager.Instance, ((int)field.GetValue(GameManager.Instance) + 1));
        }

Добавлено (17 декабря 2017, 11:50)
---------------------------------------------
картинка не добавилась
http://www.screencapture.ru/file/21f6dCF9

pixeyeДата: Воскресенье, 17 Декабря 2017, 12:00 | Сообщение # 6
Red Winter Software
Сейчас нет на сайте
Цитата Hallowed ()
пока буду делать через рефлексию


Никогда и ни при каких обстоятельствах. Не издевайся над собой и игровым кодом только потому что не можешь найти ответ.


Делаю игру Battlecruiser
pixeyeДата: Воскресенье, 17 Декабря 2017, 12:06 | Сообщение # 7
Red Winter Software
Сейчас нет на сайте
Если серилизуемые словари для тебя сложны то начни с этого.

https://unity3d.college/2016/10/05/unity-events-actions-delegates/
http://www.unitygeek.com/delegates-events-unity/
https://www.dotnetperls.com/action



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

Старайся то что ты хочешь через инспектор делать кодом. По опыту могу сказать что настройка через инспектор чего либо - маленькое удовольствие. Быстро превращается в невыобразимую кашу которую забудешь через пару дней


Делаю игру Battlecruiser

Сообщение отредактировал pixeye - Воскресенье, 17 Декабря 2017, 12:10
drcrackДата: Воскресенье, 17 Декабря 2017, 12:57 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Цитата
можете немного пояснить - как этим пользоваться, а то там даже объявления MonoBehaviour нет и на объект в сцене ни добавить, а три строчки в Description разобраться не помогают

Вместо того чтобы заводить отдельные переменные для каждого параметра, ты создаешь одно хранилище:
Код
public SerializableDictionary<string, int> params = new SerializableDictionary<string, int>();

Он появляется в инспекторе и ты можешь добавлять туда значения, а в коде работаешь так:
Код
GameManager.Instance.params["par_block"] = GameManager.Instance.params["par_block"] + 1;


Сообщение отредактировал drcrack - Воскресенье, 17 Декабря 2017, 12:57
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » программно изменить значение переменной (изменить значение переменной, получая её имя из инспектора)
  • Страница 1 из 1
  • 1
Поиск:

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