gpt4 book ai didi

c# - 加载在 Unity 中创建的下载的 iOS 应用程序文件

转载 作者:行者123 更新时间:2023-11-29 00:37:59 27 4
gpt4 key购买 nike

我正在尝试加载已下载并保存在 iOS 设备的持久数据路径中的 json 文件。下载和保存效果很好。但是我认为我在加载文件时遇到了大问题。事实上,当我尝试在 Xcode 中编译项目时,出现了一些错误消息。

首先是我的 C# 代码:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Net;
using UnityEngine.UI;

public class ReadJson : MonoBehaviour
{
public Text City;
public Text Temperature;
public Image Weather;
public Text WeatherUrl;

[System.Serializable]
public class CityInfo
{
public string name;
}

[System.Serializable]
public class CurrentCondition
{
public string date;
public string hour;
public int tmp;
public int wnd_spd;
public int wnd_gust;
public string wnd_dir;
public double pressure;
public int humidity;
public string condition;
public string icon;
public string icon_big;
}

[System.Serializable]
public class RootObject
{
public CityInfo city_info;
public CurrentCondition current_condition;
}

void Start () {

WebClient client = new WebClient();
File.Delete(Path.Combine (Application.persistentDataPath, "myjson.json"));
client.DownloadFile ("http://www.myjsonurl", Path.Combine (Application.persistentDataPath, "myjson.json"));

TextAsset asset = Resources.Load (Path.Combine (Application.dataPath + "/Documents", "myjson")) as TextAsset;

RootObject m = JsonUtility.FromJson<RootObject> (asset.text);

City.text = m.city_info.name;
Temperature.text = (m.current_condition.tmp).ToString();

}
}

现在是 xcode 控制台:

2016-10-21 17:01:20.766001 json[1404:516674] [DYMTLInitPlatform] platform initialization successful

2016-10-21 17:01:20.929950 json[1404:516508] -> registered mono modules 0xb95f70
2016-10-21 17:01:21.356590 json[1404:516508] You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
-> applicationDidFinishLaunching()
2016-10-21 17:01:21.452967 json[1404:516508] Metal GPU Frame Capture Enabled
2016-10-21 17:01:21.453369 json[1404:516508] Metal API Validation Enabled
-> applicationDidBecomeActive()
Init: screen size 750x1334
Initializing Metal device caps
Initialize engine version: 5.3.4f1 (fdbb5133b820)
UnloadTime: 1.705875 ms
Salut/var/mobile/Containers/Data/Application/51A2490E-94EB-4904-9F2E-112AD5632A98/Documents

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 37)

NullReferenceException: A null value was found where an object instance was required.


(Filename: currently not available on il2cpp Line: -1)

Setting up 1 worker threads for Enlighten.
Thread -> id: 19f17000 -> priority: 1

如果有人有想法。非常感谢。

最佳答案

您的代码的问题出在这一行:

TextAsset asset = Resources.Load(Path.Combine(Application.dataPath + "/Documents", "myjson")) as TextAsset;

我认为您不了解如何以及何时使用 Resources.Load .如果你想使用 Resources.Load函数,您必须从编辑器中创建一个特殊文件夹。此文件夹应位于 <ProjectDirectory>/Assets/Resources .您可以从编辑器中将内容放入/写入该文件夹。在 iOS 上构建后,您将无法执行此操作。它在您构建后变为只读。然后可以使用 Resources.Load 读取这个特殊文件夹。功能。

替换:

TextAsset asset = Resources.Load(Path.Combine(Application.dataPath + "/Documents", "myjson")) as TextAsset;

string text = File.ReadAllText(Path.Combine(Application.persistentDataPath, "myjson.json"));
RootObject m = JsonUtility.FromJson<RootObject>(text);
City.text = m.city_info.name;
Temperature.text = (m.current_condition.tmp).ToString();

应该可以解决您的问题。

另一个不应使用的 API 是 WebClient .除非你有充分的理由使用它,否则你不应该这样做。您应该使用 WWW UnityWebRequest (较新和推荐的)API。

如果没有 WebClient,您的代码应该是这样的:

void Start()
{
StartCoroutine(DownloadAndloadJson());
}

IEnumerator DownloadAndloadJson()
{
string url = "http://www.myjsonurl";

UnityWebRequest www = UnityWebRequest.Get(url);
yield return www.Send();

if (www.isError)
{
Debug.Log(www.error);
}
else
{
//Sucessfully downloaded the Json File
Debug.Log("Json: " + www.downloadHandler.text);

string jsonFile = www.downloadHandler.text;

//Delete old json file. Don't know why but this was in your original code
File.Delete(Path.Combine(Application.persistentDataPath, "myjson.json"));

//Save the downloaded data as File
File.WriteAllText(Path.Combine(Application.persistentDataPath, "myjson.json"), jsonFile);

//Load the downloaded data
string text = File.ReadAllText(Path.Combine(Application.persistentDataPath, "myjson.json"));

Debug.Log(text);
RootObject m = JsonUtility.FromJson<RootObject>(text);
City.text = m.city_info.name;
Temperature.text = (m.current_condition.tmp).ToString();
}
}

如果遇到问题,请更新到 Unity 5.4。 UnityWebRequest API 应该用于此,它在 5.3 中引入,但错误在 5.4 中得到修复。你需要using UnityEngine.Networking;使用 UnityWebRequest .

关于c# - 加载在 Unity 中创建的下载的 iOS 应用程序文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40180208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com