Unity:在JSON上加载图像/ Sprite

我想在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(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" 

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

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

请在此处查看JSON格式文档。

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

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

假设questionImagemyRoundData变量中的一个属性,你需要获取字符串并将其用作资产路径,Unity有一个简单的函数来按路径加载资源

 Resources.Load(string path) 

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

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

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

 Resources.Load("Test1"); Resources.Load("UI/Textures/Test2"); Resources.Load("Test3"); 

有几点需要注意

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

使用这种方法,首先需要更改将questionImage属性值存储为这样的方式

 { "questionImage":"NoentryPlate" } 

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

 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(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(path); MySprite.sprite = LoadedSprite; }