создается с использованием ScriptableObject.CreateInstance - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать кнопку и несколько ползунков, которые обновляют значения друг друга.Поскольку каждая кнопка и набор ползунков тесно связаны, я попытался вызвать один метод, который обновил бы набор, поэтому я вызываю один метод Update для GenerateItem, вместо того, чтобы вызывать Update для каждого объекта и заставлять их ссылаться друг на друга.

Почему я получаю сообщение об ошибке выше, и как "Unity" способ решить эту проблему?В моей программе, скорее всего, будет много этих ползунков и кнопок, поэтому я бы не стал кодировать их все вручную.

Для экземпляра GenerateItem нужно использовать метод ScriptableObject.CreateInstance вместо нового GenerateItem

void Start () {

    Button a = ((GameObject)Instantiate(prefabButton)).GetComponent<Button>();
    Slider b = ((GameObject)Instantiate(prefabCreationSlider)).GetComponent<Slider>();
    Slider c = ((GameObject)Instantiate(prefabCapacitySlider)).GetComponent<Slider>();
    Text d = ((GameObject)Instantiate(prefabText)).GetComponent<Text>();
    items.Add(new GenerateItem("OxyGen", 0.5f, 50f,a,c,b,d));
}

// Update is called once per frame
void Update () {
    items.ForEach(a => a.BtnUpdate());
}

Я пытался:

GenerateItem o= ScriptableObject.CreateInstance(GenerateItem);

, но не мог понять, как установить свойства объекта.

1 Ответ

0 голосов
/ 18 сентября 2018

Я не вижу код ScriptableObjects.

Но вы должны либо использовать CreateInstance(Type), который возвращает ScriptableObject, и привести созданный экземпляр к вашему типу:

GenerateItem o = (GenerateItem) ScriptableObject.CreateInstance(typeof(GenerateItem));

Или просто используйте типизированную версию ScriptableObject.CreateInstance<Type>(), которая возвращает Type и, следовательно, не требует типовой трансляции (я предпочитаю эту)

GenerateItem o = ScriptableObject.CreateInstace<GenerateItem>();

Чем вы можете установить свойства как обычно

 o.<some property> = <some value>;

Обратите внимание, что свойства / поля конечно должны быть общедоступными для этого решения.


В качестве альтернативы есть какой-то

public void SetValues(string name, float value1, float value2, Button button, Slider slider1, Slider slider2, Text text)
{
    // Apply values

    <some property> = <some value>
    /* ... */
}

метод внутри ScriptableObjects, так что вы можете просто вызвать

o.SetValues("OxyGen", 0.5f, 50f, a, c, b, d);

Еще одна альтернатива (и мне лично она нравится больше всего)

Разрешить установку значений только при создании экземпляра и защитить их от последующих прямых изменений. В GenerationItem есть метод, который полностью заботится о создании и установке значений

public static GenerateItem CreateInstance(string name, float value1, float value2, Button button, Slider slider1, Slider slider2, Text text)
{
    // Let the method itself take care of the Instantiated
    // You don't need "ScriptableObject." since this class inherits from it
    GenerateItem o = CreateInstance<GenerateItem>();

    // Then directly set the values
    o.<some property> = <some value>;

    /* .... */

    return o;
}

Так что позже в вашем классе вы просто должны позвонить

var o = GenerateItem.CreateInstance("OxyGen", 0.5f, 50f, a, c, b, d);

Это гарантирует, что значения не могут быть изменены после этого так просто. Зависит от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...