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