【问题标题】:unity - How to load sprite from JSON?unity - 如何从 JSON 加载精灵?
【发布时间】:2018-02-24 17:31:50
【问题描述】:

我知道如何加载文本,但不知道如何从 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
            }
          ]
        }
      ]
    }
  ]

}

【问题讨论】:

  • 您的 json 加载代码无法在 Android 上运行。修复它。阅读您的其他问题
  • @Programmer 我很想了解为什么这段代码不能在 Android 上运行。你能提供一些细节吗?非常感谢。

标签: c# json unity3d


【解决方案1】:

以下代码将遍历 myRoundData 对象中的所有问题,并使用 SpriteRenderer 组件创建一个新的游戏对象,并将加载的精灵分配给渲染器。您可能需要更改 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);
    }
}

【讨论】:

  • CreateImages(myRoundData.questions);问题是一个错误我该怎么办?
  • private void CreateImages(List questions) CreateImages 也是错误
  • List&lt;Question&gt; 替换为myRoundData 对象中问题列表的任何数据类型。这应该可以解决这两个错误。将来,请提供您遇到的错误。当我们不得不做出假设时,很难提供有价值的反馈。
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多