unity - 如何从JSON加载精灵?

时间:2018-02-24 17:31:51

标签: c# json unity3d

我知道如何加载文字,但是如何从json加载精灵/图片。

 private string mygameDataFileName = "TSdatabase.json";
  

这是我将JSON连接到我的游戏的代码

private void myLoadGameData() //LOAD THE DATA
{
    string myfilePath = Path.Combine(Application.streamingAssetsPath, mygameDataFileName); //I THINK THIS IS THE PATH OF THE FILE

假设如果文件存在,那么它将找到它的路径。

    if (File.Exists(myfilePath))
    {

        string mydataAsJson = File.ReadAllText(myfilePath); // READ THE FILE
        TSGameData myloadedData = JsonUtility.FromJson<TSGameData>(mydataAsJson);  // TSGAME DATA IS A ANOTHER SCRIPT THAT HAVE AN ARRAY FOR THE DATA
        myRoundData = myloadedData.myRoundData;

    } //myRoundData IS A VARIABLE THAT HOLDS THE ARRAY OF TSROUNDDATA TO GET THE DATA
    else
    {
        Debug.LogError("Cannot load game data!");
    } 
}
  

这是我的JSON文件脚本

    {
  "myRoundData": [
    {
      "name": "Signs",
      "timeLimitInSeconds": 59,
      "pointsAddedForCorrectAnswer": 5,
      "questions": [
        {
          "questionImage": "NoentryPlate",
          "questionText": "What is this?",
          "answers": [
            {
              "answerText": "Traffic Lights",
              "isCorrect": true
            },
            {
              "answerText": "Traffic Signs",
              "isCorrect": false
            },
            {
              "answerText": "None of the above",
              "isCorrect": false
            }
          ]
        }
      ]
    }
  ]

}

1 个答案:

答案 0 :(得分:0)

以下代码将循环遍历myRoundData对象中的所有问题,并使用SpriteRenderer组件创建一个新的gameObject,并将加载的精灵分配给渲染器。您可能需要更改CreateImages参数的数据类型以匹配myRoundData对象中questions属性的数据类型。

private List<GameObject> QuestionImageObjects = new List<GameObject>();

private void myLoadGameData() //LOAD THE DATA
{
    string myfilePath = Path.Combine(Application.streamingAssetsPath, mygameDataFileName); //I THINK THIS IS THE PATH OF THE FILE
    if (File.Exists(myfilePath))
    {
        string mydataAsJson = File.ReadAllText(myfilePath); // READ THE FILE
        TSGameData myloadedData = JsonUtility.FromJson<TSGameData>(mydataAsJson);  // TSGAME DATA IS A ANOTHER SCRIPT THAT HAVE AN ARRAY FOR THE DATA
        myRoundData = myloadedData.myRoundData;

        CreateImages(myRoundData.questions);
    } //myRoundData IS A VARIABLE THAT HOLDS THE ARRAY OF TSROUNDDATA TO GET THE DATA
    else
    {
        Debug.LogError("Cannot load game data!");
    }
}

private void CreateImages(List<Question> questions)
{
    //The two while loops below allow existing image gameobjects to be reused

    // Destroy excess images
    while(QuestionImageObjects.Count > questions.Count)
    {
        Destroy(QuestionImageObjects[QuestionImageObjects.Count - 1]);
        QuestionImageObjects.RemoveAt(QuestionImageObjects.Count - 1);
    }
    // Create missing images
    while(QuestionImageObjects.Count < questions.Count)
    {
        GameObject image = new GameObject("Question Image " + QuestionImageObjects.Count);
        image.AddComponent<SpriteRenderer>();
        QuestionImageObjects.Add(image);
    }

    for (int i = 0; i < questions.Count; i++)
    {
        QuestionImageObjects[i].GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(questions[i].questionImage);
    }
}