【问题标题】:Unity - populate inspector with different valuesUnity - 使用不同的值填充检查器
【发布时间】:2017-11-19 13:03:28
【问题描述】:

我在 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;

但它不起作用,因为“对象”类型不会出现在 Unity 检查器中。如果我只需要字符串对象,我只需将对象类型的defaultValue 替换为字符串类型,这将解决我的问题。但我可以有 int's、float's、strings、bool 等。

如何在这种情况下(以及使用什么)填充值以使用 Unity 检查器?

【问题讨论】:

    标签: c# unity3d firebase-remote-config


    【解决方案1】:

    我认为您将需要创建一个确实显示在检查器中的“包装器对象”(您还需要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;
        }
    }
    

    然后,您的字典将是 &lt;string,AbstractWrapper&gt;,并带有一个处理显示翻译的自定义检查器脚本。通过将类型声明为比 object (字面上可以是任何东西)更具体的类型,它具有已知数量的包含您想要的值的子类型,确保数据是可以更容易的处理。

    我不知道它是否真的会工作,我只构建了一两个检查器脚本,我总是想着“呃,我不想这样做又是那个。”一个自定义检查器脚本本身可能也足够了,但我不知道尝试为object 编写一个是否可行;我怀疑不是。

    【讨论】:

      【解决方案2】:

      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链接

      【讨论】:

      • 哦,看在鸭子的份上,为什么我在做我所做的事情时没有想到泛型(请参阅我的答案)。好吧,至少它是可重构的。
      • 嗯,很有趣。我会看看。谢谢。
      • @Draco18s 哈哈我实际上对 Unity 并不熟悉,所以我的第一直觉是“让你的类型通用” - 但是一旦我用谷歌搜索了一下,我意识到你不能在 Unity 中序列化泛型所以这个是我的中间路线
      • @RobertPetz 我的意思更多的是“我为什么没想到”?我知道什么是泛型,并且我之前已经创建了泛型类,但是对于那个项目,我只是……没有……出于某种原因。
      • 也将更新我的答案,因为现在无法编译 - @Draco18s gotcha haha​​
      猜你喜欢
      • 2021-08-24
      • 2020-09-03
      • 1970-01-01
      • 2018-07-28
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多