C# Unity-使用不同的值填充inspector

C# Unity-使用不同的值填充inspector,c#,unity3d,firebase-remote-config,C#,Unity3d,Firebase Remote Config,我有以下C语言的集合,它被发送到Google服务器Firebase远程配置 我想在Unity inspector本身而不是代码中添加值。如您所见,这些值可以是bool、string、int等任何类型 System.Collections.Generic.Dictionary<string, object> defaults = new System.Collections.Generic.Dictionary<string, object>();

我有以下C语言的集合,它被发送到Google服务器Firebase远程配置

我想在Unity inspector本身而不是代码中添加值。如您所见,这些值可以是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);
但它不起作用,因为对象类型不会显示在Unity inspector中。如果我只需要字符串对象,我只需要用字符串类型替换object类型的defaultValue,这就解决了我的问题。但是我可以有int,float,string,bool等等


在这个场景中,我如何填充值以及使用什么来使用Unity inspector?

我认为您需要创建一个包装器对象,它确实会显示在inspector中,您也需要它

例如,在我正在进行的一个空闲点击游戏中,我已经设置好处理升级可以有浮点或整数的不同值类型:

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;
    }
}
然后,您的词典将带有一个自定义检查器脚本,用于处理翻译以供显示。通过将类型声明为比对象更具体的东西(对象可以是包含已知数量的子类型的任何东西,这些子类型围绕着您想要的值),可以更容易地确保数据是可以处理的


我不知道它是否真的有效,我只构建了一两个inspector脚本,我总是在离开它时想,呃,我再也不想这样做了。一个自定义检查器脚本本身可能也足够了,但我不知道为对象编写一个脚本是否可行;我想不支持。

Unity的inspector不支持泛型,因此答案比您通常在C中所做的要复杂一些。但是,根据Unity的answer社区,您可以提供共享基类的具体实现来绕过此限制:

编辑:将这些从结构更改为类,并在子类中添加默认构造函数以使其可编译

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

有关更多详细信息,请查看链接

哦,看在鸭子的份上,为什么我在做我看到答案的事情时没有想到泛型呢。嗯,至少它是可重构的。嗯,很有趣。我来看看。谢谢。@Draco18s哈哈,实际上我对Unity并不熟悉,所以我的第一反应是“让你的类型成为泛型”——但当我在谷歌上搜索了一下后,我意识到你不能在Unity中序列化泛型,所以这是我的中间选择route@RobertPetz我的意思是,为什么我没有想到这一点?我知道泛型是什么,我以前也创建过泛型类,但对于那个项目,我只是…没有…出于某种原因。我也要更新一下我的答案,就像现在一样,不编译-@Draco18s,明白了,哈哈
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));