2017-06-16 42 views
0

我在C#中收集了以下收集到的服務器(Firebase Remote Config)。Unity - 使用不同的值填充檢查器

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

但它不工作,因爲在統一檢查「對象」類型將不會出現。如果我只需要字符串對象,我只需用一個字符串類型來代替defaultValue這是對象類型,這將解決我的問題。但我可以有int,float,strings,bool等。

如何在此場景(以及使用什麼)中填充值,以使用Unity檢查器?

回答

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將工作;我懷疑不是。

1

Unity的檢查員不支持泛型,所以答案比您通常在C#中做的要複雜一些。但是,根據統一的答案社區,你可以提供一個共享的基類的具體實現,以繞過這個限制:

編輯:改變了這些從結構類和在子類中添加默認的構造函數,使其編譯

[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 

那麼你默認的收集將能夠是這樣的:

編輯:注意:我改變了它從字典到列表,因爲你提供你的對象已經是一個鍵/值格式 - 但這個答案是爲了指出你正確的方向,因爲我不確定你打算如何o使用它。基類仍然是一樣的。

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

哦鴨的緣故,做我做的東西(見我的回答)時,爲什麼我沒有想到泛型。那麼,至少它是可重構的。 – Draco18s

+1

嗯,有趣。我會看一看。謝謝。 – rootpanthera

+0

@ Draco18s哈哈我其實不熟悉Unity,所以我的第一個直覺是'只是讓你的類型變得通用' - 但是一旦我搜索了一下,我意識到你不能在Unity中序列化泛型,所以這是我的中間路線 –