我在C#中有以下集合,该集合已发送到Google服务器(Firebase远程配置)。
我想在Unity检查器本身而不是代码中添加值。如您所见,值可以是任何类型(bool,string,int等)。
System.Collections.Generic.Dictionary<string, object> defaults =
new System.Collections.Generic.Dictionary<string, object>();
defaults.Add("config_test_string", "default local string");
defaults.Add("config_test_int", 1);
defaults.Add("config_test_float", 1.0);
defaults.Add("config_test_bool", false);
基本上我已经这样做了:
[Serializable]
public struct RemoteValueConfig {
public string key;
public object defaultValue;
}
public RemoteValueConfig[] valuesToFetch;
但它不起作用,因为&#34;对象&#34;类型不会出现在Unity检查器中。如果我只需要字符串对象,我只需用字符串类型替换类型为对象的defaultValue
,这样就可以解决我的问题。但我可以使用int,float,string,bool等
如何在此场景中填充值(以及使用什么),以使用Unity检查器?
答案 0 :(得分:1)
Unity的检查员不支持泛型,所以答案比你在C#中通常做的要复杂一些。但是,根据Unity的答案社区,您可以提供共享基类的具体实现来解决此限制:
编辑:将这些从结构更改为类,并在子类中添加默认构造函数以使其可编译
[Serializable]
public class RemoteValueConfigBase<T>
{
public string Key;
public T DefaultValue;
public RemoteValueConfigBase(string key, T defaultValue)
{
Key = key;
DefaultValue = defaultValue;
}
}
[Serializable]
public class RemoteValueConfigStr : RemoteValueConfigBase<string>
{
public RemoteValueConfigStr(string key, string defaultValue) : base(key, defaultValue)
{ }
}
[Serializable]
public class RemoteValueConfigBool : RemoteValueConfigBase<bool>
{
public RemoteValueConfigBool(string key, bool defaultValue) : base(key, defaultValue)
{ }
}
[Serializable]
public class RemoteValueConfigInt : RemoteValueConfigBase<int>
{
public RemoteValueConfigInt(string key, int defaultValue) : base(key, defaultValue)
{ }
}
[Serializable]
public class RemoteValueConfigDouble : RemoteValueConfigBase<double>
{
public RemoteValueConfigDouble(string key, double defaultValue) : base(key, defaultValue)
{ }
}
...etc
然后你的默认收藏就可以是:
编辑:注意我将它从字典更改为列表,因为您提供的对象已经是键/值格式 - 但这个答案意味着指向正确的方向,因为我不确定您打算如何打算使用它。基类仍然是相同的。
var defaults = new List<RemoteValueConfigBase<object>();
defaults.Add(new RemoteValueConfigStr("config_test_string", "default local string"));
defaults.Add(new RemoteValueConfigInt("config_test_int", 1));
defaults.Add(new RemoteValueConfigDouble("config_test_float", 1.0));
defaults.Add(new RemoteValueConfigBool("config_test_bool", false));
有关详细信息,请查看this链接
答案 1 :(得分:0)
我认为你需要制作一个“包装对象”,它会在检查器中显示(你还需要a custom inspector script)。
例如,在我正在进行的闲置点击游戏中,我设置this来处理升级可以具有的不同值类型(浮点数或整数):
public abstract class UpgradeValueWrapper { }
public class UpgradeIntValue : UpgradeValueWrapper {
public int value;
public UpgradeIntValue(int v) {
value = v;
}
}
public class UpgradeFloatValue : UpgradeValueWrapper {
public float value;
public UpgradeFloatValue(float v) {
value = v;
}
}
您的词典将为<string,AbstractWrapper>
,其中包含一个自定义检查器脚本,用于处理要显示的翻译。通过将类型声明为比object
更具体的东西(可能确实是任何东西)具有已知数量的子类型来包围您想要的值,确保数据更容易变得更容易可以处理。
我不知道它是否真的工作,我只构建了一个或两个检查员脚本,我总是离开它思考“呃,我不想做那又一次。“自定义检查器脚本本身也可能就足够了,但我不知道是否尝试为object
编写一个脚本会起作用;我怀疑不是。