gpt4 book ai didi

unity3d - 使用 ScriptableObject.CreateInstance 实例化

转载 作者:行者123 更新时间:2023-12-02 00:29:40 26 4
gpt4 key购买 nike

我正在尝试创建一个按钮和多个基于彼此值更新的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com