【发布时间】:2020-09-03 01:03:55
【问题描述】:
我创建了几个自定义类来读取 Unity 中的 json 文件。
Fruits.cs
[System.Serializable]
public class Fruits
{
public Apple[] apples;
}
Apple.cs
[System.Serializable]
public class Apple
{
public string appleName;
}
MyClass.cs
public class MyClass : MonoBehaviour{
private Fruits fruits;
public void classSetup(){
StartCoroutine(JsonReader());
String appleName = fruits.apples[0].appleName; -------> this is the line trigger the exception.
Debug.Log(appleName);
}
Ienumerator JsonReader(){
.........unrelated codes hidden...............
if (Url.Contains(":/") || Url.Contains("://") || Url.Contains(":///"))
{
UnityWebRequest www = UnityWebRequest.Get(Url);
yield return www.SendWebRequest();
JsonText = www.downloadHandler.text;
}
fruits = JsonUtility.FromJson<Fruits>(JsonText);
}
}
JsonReader(我创建的 IEnumerator)工作正常,因为 Debug.Log 打印出我期望的 appleName,但“String appleName .....”行触发异常(NullReferenceException:对象引用未设置为对象。)
我阅读了有关如何修复空异常的帖子,但无法找到有关如何为自定义序列化类执行此操作的帮助。简单地做 fruits = new Fruits() 是行不通的。我怀疑那是因为我没有实例化这些字段。但是,如果我在 Fruits 类中有很多字段怎么办?如果我不能只做“fruits.apples = new Apple[5]”,因为长度取决于 json 输入并且可能不是 5?
任何帮助将不胜感激。
【问题讨论】:
-
除非
JsonReader()返回的枚举器被迭代(可能在StartCoroutine()内?),否则fruits = JsonUtility.FromJson<Fruits>(JsonText);行永远不会到达,因此fruits永远不会被初始化。 -
在
fruits = ...行放一个断点,看看调试器是否停在那里(可能不会)。否则,请尝试创建minimal reproducible example 并将其包含在问题中。