unity3d - 使用 ScriptableObject.CreateInstance 实例化

标签 unity3d

我正在尝试创建一个按钮和多个基于彼此值更新的 slider 。由于每个按钮和一组 slider 都高度相关,我尝试调用一个方法来更新该组,因此我为 GenerateItem 调用一个 Update 方法,而不是在每个对象上调用 Update 并使它们分别引用其他。

为什么我会收到上面的错误,解决这个问题的“Unity”方法是什么?我的程序可能会有很多这样的 slider 和按钮,所以我不想全部手动编写代码。

GenerateItem must be instantiated using the ScriptableObject.CreateInstance method instead of new 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);

但不知道如何设置对象的属性。

最佳答案

我没有看到 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>;

请注意,对于此解决方案,类(class)的属性/字段必须是公开的。


或者有某种

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);

这可以确保以后不会轻易更改值。取决于您的需求。

关于unity3d - 使用 ScriptableObject.CreateInstance 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377827/

相关文章:

c# - 在 Unity 中使用 OpenCVSharp 进行眼睛检测(fps 问题)

c# - 在Unity3d中获取所有 child , child 的 child

c# - 如何在C#Unity中解决此问题

Unity3D:将文本添加到 PreFab

c# - 无法播放禁用的音频源(Unity 2d)

c# - 输入管理器 2 个播放器和 2 个 Controller

c# - 寻找模拟摇杆中心和当前位置之间的距离

c# - Unity3D C# 计时器以毫秒为单位显示

c# - 如何将 UI RawImage 转换为字节数组

unity3d - unity photosphere - 出现了一条1px的线