2016-05-27 12 views
2

私は2つの部分の質問があります。 まず、このようなjsonファイルを書くことができるコードを記述しようとしています。Unity5.3 Json unities new Jsonユーティリティを使用して複雑なJsonオブジェクトを作成する方法

{ 
"Restaurants":[ 
    { 
     "Name" : "Asami", 
     "ID" : 0, 
     "Plates" : 
     [ 
     { 
      "title" : "Plate1 ", 
      "color" : "Red ", 
      "price" : 5 
     }, 
     { 
      "title" : "Plate1 ", 
      "color" : "Green ", 
      "price" : 6 
     }, 
     { 
      "title" : "Plate1 ", 
      "color" : "Blue ", 
      "price" : 7 
     }, 
     { 
      "title" : "Plate1 ", 
      "color" : "Yellow ", 
      "price" : 8 
     } 
     ] 
    } 
    ] 
} 

コードは私がsofarです。

using System; 
using System.Collections; 
using System.IO; 
using UnityEngine; 
using System.Collections.Generic; 

public class UnityJsonTest : MonoBehaviour { 

public string aName; 
public int aId = 0; 
public string aPlate1, aPlate2; 
public Color aColor1, aColor2; 
public int aPrice1, aPrice2; 

// Use this for initialization 
void Start() 
{ 
    Restaurant1 rester = new Restaurant1(); 

    rester.MainName = aName; 
    rester.Character1[0].Name = aName; 

    string rjson = JsonUtility.ToJson(rester); 

    File.WriteAllText(Application.dataPath + "/player.json", rjson.ToString()); 

    MyClass myObject = new MyClass(); 
    myObject.level = 1; 
    myObject.playerName = "Dr Charles Francis"; 

    string json = JsonUtility.ToJson(myObject); 

    File.WriteAllText(Application.dataPath + "/test.json", json.ToString()); 
} 

// Update is called once per frame 
void Update() { 

} 
} 

[Serializable] 
public class MyClass 
{ 
public int level; 
public string playerName; 
} 

[Serializable] 
public class Restaurant1 
{ 
public string MainName; 
public Character1[] Character1; 
} 

[Serializable] 
public class Character1 
{ 
public string Name; 
public int Id; 
public Plate1[] Plate1; 
} 

[Serializable] 
public class Plate1 
{ 
public string Title; 
public Color Color; 
public int Price; 
} 

MyClass myObject = new MyClass();それ以降は2行になります。それは完全に動作します。これは、Unity Docsの例です。

しかし、私はそれを使用してabitをもっと複雑にしようとしたとき、私は何かを逃したようです。ライン

Restaurant1 rester = new Restaurant1(); 

rester.MainName = aName; //This works. 

rester.Character1[0].Name = aName; 

は//これは動作しません。私は "NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません"という結果を得ます。 と私は全く理由が分かりません。私はここで間違って何をしていますか?

私の質問の2番目の部分は、ユーザーが定義した金額に "プレート"オブジェクトの数を設定できるように、このことを書き込む最善の方法は何ですか?そして、私はそれぞれのプレートオブジェクトを埋めるためにforループが必要だと思いますか?

私はこれに関するサンプルを広範囲に検索しましたが、すべての例はmyClassのように行われています。どのようにもっと複雑なものを構築するかについては説明がなく、非常に簡単です。

君たちはそれは素晴らしいだろう:)事前に

おかげで役立つことができれば。

答えて

2

あなたはとても近いです。あなたは2つのステップだけを欠いています。 rester.Character1はクラスであり、同時に配列です。

これを動作させるには、アレイののサイズを宣言する必要があります。のは、この例ではを使用してみましょう:

rester.Character1 = new Character1[4]; 

が次にあなたがそれらのそれぞれの新しいインスタンスを作成することにより、要素内の各Character1クラスを初期化する必要があります。

for (int i = 0; i < rester.Character1.Length; i++) 
{ 
    rester.Character1[i] = new Character1(); 
} 

が完了!今、rester.Character1[0].Name = aName;に問題なく電話することができます。配列はおもしろいですが、あなたはこれらのステップを踏まなければなりません。

私の質問の2番目の部分は、私は、ユーザー 規定量に「プレート」のオブジェクトの数を設定できるように、この 事を書くための最良の方法は何かありますか?そして、私は の各プレートオブジェクトを埋めるためにforループが必要だと思いますか?

プレートへのアクセスは、別の配列内の配列であるため、扱いにくいです。あなたは簡単にそれを行うために複数のforループが必要です。ユーザーはUI/InputFieldでInputを取得し、それを使ってPlateの数を作成することができます。

public InputField plateAmount; 

//各プレート配列のサイズを宣言する。 InputField/Playerからプレートの枚数を取得し、Convert.ToInt32でintに変換します。我々はCHARACTER1クラスのために行ったよう

for (int i = 0; i < rester.Character1.Length; i++) 
{ 
    rester.Character1[i].Plate1 = new Plate1[Convert.ToInt32(plateAmount.text)]; 
} 

は今、各プレートのインスタンスを作成しますが、この1はまた、別の配列内にある配列にNested Loopと呼ばれるループの複数が必要です。

//Create new Instance of Plate1 classes 
for (int i = 0; i < rester.Character1.Length; i++) 
{ 
    for (int j = 0; j < rester.Character1[i].Plate1.Length; j++) 
    { 
     rester.Character1[i].Plate1[j] = new Plate1(); 
    } 
} 
+1

これは美しいです。私は瞬間があるようにすぐに練習に入れます。ありがとう:) – Oscar