2017-05-18 8 views
1

私はこの状況を解決するためにいくつかのアドバイスをしたいと思います。だから私は以前この質問:Unity save everything (snapshot)Unityでリフレクションを使用してリストをJSONに動的にシリアライズ

そして、私は現在、JSONにすべてをシリアル化しようとしています。私はいくつかの要件がありますすべてをシリアル化しながら。

  1. ゲームオブジェクトにどのコンポーネントが接続されているのか分かりません。
  2. 私は、これらのコンポーネント(クラス)がプロパティ/フィールドに何を持っているのか分かりません。

基本的なタイプの統一(transform/meshrendererなど)のシリアライズに成功しました。しかし、私は現在、カスタムコンポーネントをシリアル化するためのコードに取り組んでいます。このため私はリフレクションを使用します。このコードは、クラスにプライマリタイプ(文字列、int、floatなど)しかない場合に機能します。しかし私はまだ2つの課題に直面しています。それは入力(または少なくともタイプを知るが、動的に私の知識でそれをキャストすることができない)です知らずにリストをシリアル化

  1. (カスタムクラスが含まれており、リスト)カスタムクラスを含むフィールドをシリアル化。

今のところ、私はポイント1を中心にアドバイスを受けたいと思います。私はこのコードを開発: タイプは、私が以前

if (type.Contains("List")) 
{ 
    value = serializeListVariable(singular.GetValue(comp)); 
} 

そして、ここに着いたリストをシリアル化する必要がある方法であることを文字列としてです。デバッグでは、オブジェクトが値変数にあることがわかります。しかし、それらはJSONに変換されず、{}が返されます。この最初の繰り返しでは、プライマリタイプのリストを動的に保存したいと思います。しかし、後で私はカスタムクラスでもこれをやりたいと思っています。私はその後、正しいJSON文字列を取得することができるよ、しかし、その後、再び、私はこれらのカスタムクラスのtoStringメソッドに影響を与えないでgetValues ...

private string serializeListVariable(object listobject) 
{ 
    PropertyInfo listitems = listobject.GetType().GetProperty("Item"); 
    int listcount = (int)listobject.GetType().GetProperty("Count").GetValue(listobject, null); 
    var values = new object[listcount]; 
    for (int i =0; i < listcount; i++) { 

     values[i] = listitems.GetValue(listobject, new object[] { i }); 
    } 
    string serializedlist = JsonHelper.ToJson(values); 
    return serializedlist; 
} 

とそのJSONヘルパーメソッドをToStringメソッド行う場合呼ばれている:

public static string ToJson<T>(T[] array) 
{ 
    Wrapper<T> wrapper = new Wrapper<T>(); 
    wrapper.Items = array; 
    return JsonUtility.ToJson(wrapper); 
} 

と言及されているラッパークラス:

[Serializable] 
private class Wrapper<T> 
{ 
    public T[] Items; 
} 

うまくいけば、あなたのいくつかは、この問題を解決するために知っています。

ありがとうございます!

+1

json.netを試しましたか?それは、リフレクションによってクラスの現在の状態(パラメータとその値を持つ)をjsonに変換します。そして、オブジェクトにjsonを逆シリアル化することができます。 – Farhan

+0

これはまさに私が探しているものです!残念ながら統一はこれをサポートしていません:( –

+0

私は非常に多くのプロジェクトのためにそれを単一性で使用しました:)それはチーズのように機能します...アセットストア – Farhan

答えて

0

UnityでLitJSONプラグインを使用します。

return JsonMapper.ToJson(anyClassOrList); 
+0

LitJSONプラグインを試してみましたが、プリミティブ型で動作します。残念なことにカスタムクラスではありません。 –

関連する問題