Unity:在JSON上加载Image / Sprite

时间:2018-02-24 01:40:40

标签: c# json unity3d

我想在json上加载sprite但是如何?正在显示文字但不显示图像。

这是加载我的文本数据的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脚本。我不确定这是否是一个加载图像的有效脚本。

"questionImage":"Assets/ImagesQuiz/NoentryPlate.png"

3 个答案:

答案 0 :(得分:0)

要成为有效的JSON,您的文本文件内容应位于括号内,如下所示:

{ "questionImage":"Assets/ImagesQuiz/NoentryPlate.png" }

请查看JSON格式文档here

答案 1 :(得分:0)

您应该检查有关加载图像的文档,同时尝试使用断点查看输入到函数中的内容以及该路径是否实际存在(它看起来像绝对路径,如果是这样,很可能无法工作)

我想如果JSON有问题你会得到相关的错误,但似乎更像是错过使用函数和/或不正确的文件路径

答案 2 :(得分:0)

假设questionImagemyRoundData变量中的属性,您需要获取字符串并将其用作资产路径,Unity具有通过路径加载资产的简单功能

Resources.Load<T>(string path)

此函数将返回已加载的资产引用作为提供的泛型类型。但是,Resources.Load方法希望所有资产都存储在Resources文件夹中的Assets文件夹中。您可以将多个Resources个文件夹嵌套在其他各种文件夹中。例如,您可以拥有以下文件

  • 资产/资源/ Test1.png
  • 资产/资源/ UI /纹理/ Test2.png
  • 资产/图像/资源/ Test3.png

假设它们的纹理类型设置为Sprite,则可以使用

访问每个纹理类型
Resources.Load<Sprite>("Test1");
Resources.Load<Sprite>("UI/Textures/Test2");
Resources.Load<Sprite>("Test3");

需要注意的一些事项

  • 如果您有相同名称但资源不同的文件
    文件夹,它将返回找到的第一个资源。
  • 您无需提供文件扩展名。
  • 您可以在文件夹中嵌套文件,只要其中一个文件 父文件夹是Resources文件夹。 (参见中的Test2.png 上面的例子)

使用这种方法,您首先需要更改将questionImage属性值存储为此类

的方式
{ "questionImage":"NoentryPlate" }

然后,使用您提供的代码,我们可以添加一个额外的方法来处理此资源加载和精灵设置部分。我们需要一个带有SpriteRenderer组件的GameObject的引用(你可以创建一个空的gameObject并自己添加组件)。加载精灵后,您可以将sprite组件的SpriteRenderer属性设置为刚刚加载的精灵。

public SpriteRenderer MySprite;

private Sprite LoadedSprite = null;

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;

        // vvv   CALL OUR NEW METHOD HERE   vvv
        LoadSprite(myRoundData.questionImage);
    } //myRoundData IS A VARIABLE THAT HOLDS THE ARRAY OF TSROUNDDATA TO GET THE DATA
    else
    {
        Debug.LogError("Cannot load game data!");
    }
}

private void LoadSprite (string path)
{
    if (LoadedSprite != null)
        Resources.UnloadAsset(LoadedSprite);

    LoadedSprite = Resources.Load<Sprite>(path);

    MySprite.sprite = LoadedSprite;
}