2017-06-16 15 views
0

私はGoogleのサーバー(Firebaseリモートコンフィグ)に送信されるC#で、次のコレクションを持っています。ユニティ - 異なる値でインスペクタを移入

私はユニティインスペクタ自体ではなく、コードの値を追加します。ご覧のように、値は任意の型(bool、string、intなど)です。

[Serializable] 
    public struct RemoteValueConfig { 
     public string key; 
     public object defaultValue; 
    } 



    public RemoteValueConfig[] valuesToFetch; 

をしかし、「オブジェクト」タイプは、ユニティインスペクタに表示されませんので、それは、動作しません:

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

基本的に私はこれをやりました。私は、文字列オブジェクトを必要に応じて、私は単純に文字列型で、型オブジェクトであるdefaultValueに取って代わるだろうし、これは私の問題を解決するだろう。しかし、私は整数、浮動小数点数、文字列、ブールなどを持つことができます。

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(実際には何でもよい)よりも具体的なものとして宣言することにより、データが扱えるものであることを保証することが非常に簡単になります。

それは実際に 仕事、私は1つまたは2つだけインスペクタースクリプトを構築してきたと私は常に考えて、そこから離れて来たかどうかはわからない

「うわ、私は二度とそれをしたくありません。」カスタムインスペクタスクリプトそれ自体でもでも十分でしょうが、私はobjectのために1つ書き込もうとするとわかりません。私はそうは思わない。

1

Unityのインスペクタはジェネリックをサポートしていないので、C#で普通にやっていたよりも少し複雑です。しかし、ユニティの答えコミュニティに応じて、あなたはこの制限を回避するために、共有ベースクラスの具象実装を提供することができます。

EDIT:構造体からクラスにこれらを変更し、それコンパイル

作るためにサブクラスで、デフォルトのコンストラクタを追加しました
[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 

次に、デフォルトのあなたのコレクションは、このことができるようになる:

EDIT:あなたが提供するあなたのオブジェクトがすでにキー/値の形式だったので、私はリストに辞書からそれを変更します - しかし、この答えあなたが正しい方向を指し示すことを意図していますそれを使用する。基本的な分類はまだ同じです。詳細については

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

hm、面白いです。私は見てみましょう。ありがとう。 – rootpanthera

+0

@ Draco18s haha​​私は実際にユニティに精通していないので、私の最初の本能は「あなたのタイプをジェネリックにしています」 - 一度グーグルでグーグルで行った場合、ユニティでジェネリックスをシリアル化できないことに気が付いたのでこれが私の中間ルートでした。 –

関連する問題