【问题标题】:Unity: Load Image/Sprite on JSONUnity:在 JSON 上加载图像/精灵
【发布时间】:2018-02-24 01:40:40
【问题描述】:

我想在 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 脚本。我不确定这是否是加载图像的有效脚本。

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

【问题讨论】:

    标签: c# json unity3d


    【解决方案1】:

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

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

    请查看 JSON 格式文档here

    【讨论】:

    • 当然这只是其他解决方案的语法吗?
    • 我只知道语法,我只是涉及语法......那些括号很好......
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      Resources.Load<T>(string path)
      

      此函数将返回加载的资产引用作为提供的泛型类型。但是,Resources.Load 方法期望所有资产都将存储在Assets 文件夹中的Resources 文件夹中。您可以将多个 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 组件的游戏对象的引用(您可以创建一个空的游戏对象并自己添加该组件)。加载精灵后,您可以将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<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;
      }
      

      【讨论】:

      • questionImage 是我的脚本 QuestionData.cs 的一个属性,它是您提供的任何解决方案的代码中的错误吗?谢谢
      • 无论您在哪里可以访问该 QuestionData 对象,您都需要在哪里调用上述LoadSprite 方法。例如,假设您有一个名为 myQuestionData 的 QuestionData 变量。然后您将使用以下LoadSprite(myQuestionData.questionImage); 调用 LoadSprite
      • 嘿,伙计,我试过了,但出现错误提示“无法从“UnityEngine.Sprite 转换为字符串””
      • QuestionData 是包含精灵本身还是只包含精灵的路径?如果它包含精灵本身,那么您应该能够将 LoadSprite 替换为以下内容:private void LoadSprite (Sprite sprite) { MySprite.sprite = sprite; }
      • 我应该把这些代码放在哪里? Resources.Load("Test1"); Resources.Load("UI/Textures/Test2"); Resources.Load("Test3");很抱歉我是 json 和 unity 的新手 :(
      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2013-06-12
      • 2022-12-05
      • 1970-01-01
      • 2016-04-07
      相关资源
      最近更新 更多