在unity中,我有一个字典,在那里我保存了很多数据。我需要访问数据,读取数据,有时还需要 覆写. 我把它放在了一个类里,它的写法大致是这样的
public class myClass
{
public int myNumber;
public string myString;
}
public class MyData : MonoBehaviour
{
public Dictionary<string, myClass> someData = new Dictionary<string, myClass>();
private void Awake()
{
someData.Add("one", new myClass() { myNumber = 1, myString = "first" });
someData.Add("two", new myClass() { myNumber = 2, myString = "second" });
someData.Add("three", new myClass() { myNumber = 3, myString = "third" });
}
}
为了避免调用 gameObject.GetComponent<MyData>().someData
每次我需要Dictionary的数据时(因为我需要在许多GameObjects和脚本中使用它),我都在考虑将Dictionary设为 static
这将允许用 MyData.someData
并希望有更好的性能)。
public static Dictionary<string, myClass> someData = new Dictionary<string, myClass>();
然而,当我试图访问Dictionary中的数据时 Start
方法后执行(因此应该在其他类的 Awake
方式 MyData
), MyData.someData
总是 null
. 不知道是跟调用顺序有关,还是把Dictionary设置成静态的问题。我经验不足,不明白。
是不是 static
这里的《辞海》的正确用法?还是有更好的解决办法?
另外,如果有一个Dictionary我只想读取但从不修改,有没有办法定义它,使它保持不变?
使 SomeData
静态字段,然后你可以将其调用为 MyData.SomeData
在您的应用程序中。 您需要明确地调用 Awake()
方法,以便添加三个 MyClass
实例到 SomeData
字典。你可以创建一个静态构造函数并调用 Awake()
里面。
public class MyData : MonoBehaviour
{
public static Dictionary<string, myClass> someData = new Dictionary<string, myClass>();
static MyData()
{
Awake();
}
private static void Awake()
{
someData.Add("one", new myClass() { myNumber = 1, myString = "first" });
someData.Add("two", new myClass() { myNumber = 2, myString = "second" });
someData.Add("three", new myClass() { myNumber = 3, myString = "third" });
}
}
在.NET 4.5中有一个readonly dictionary...https:/docs.microsoft.comen-usdotnetapisystem.collection.objectmodel.readonlydictionary-2?redirectedfrom=MSDN&view=netcore-3.1。
在Awake中实例化字典.在Start.Awake中向字典中添加项目,Awake总是在启动前被调用,所以这将保证你的字典在试图访问它之前被初始化。