Unity - 使用不同的值填充检查器

时间:2017-06-16 17:05:30

标签: c# unity3d firebase-remote-config

我在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检查器?

2 个答案:

答案 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编写一个脚本会起作用;我怀疑不是。