我正在创建一个多人游戏,其中包括具有不同值(例如健康、伤害)的不同英雄。我最初从数据库中获取这些值并将它们存储到一个结构中。
-> I have little to no knowledge about structs
-> and got told this is probably a performance loss / bad approach
将值存储在结构中并创建字典(int,my-struct)以获取值之前工作得很好。
我已经到了要为每个英雄在此结构中存储特定 Sprite 的地步。 我考虑通过 Resources.Load 获取这些 Sprite (我想这是最简单的方法)
public struct data
{
public string Name;
public int ID, hp, dmg, range, magazin;
public float tbtwb, rltime;
public Sprite heroSprite; //Structs don't seem to like Unity's sprite type
}
public Dictionary<int, data>_HeroDict;
这就是我提供结构并将条目添加到字典中的方式。
while (rdr.Read())
{
//Store it into the Dictionary
data itm = new data();
itm.Name = rdr["Name"].ToString();
itm.ID = int.Parse (rdr["ID"].ToString());
itm.hp = int.Parse (rdr["Hp"].ToString());
itm.dmg = int.Parse (rdr["Dmg"].ToString());
itm.magazin = int.Parse (rdr["Magazin"].ToString());
itm.range = int.Parse (rdr["Range"].ToString());
itm.tbtwb = float.Parse(rdr["Tbtwb"].ToString());
itm.rltime = float.Parse(rdr["Rltime"].ToString());
//What I thought of:
itm.heroSprite = Resources.Load ("Sprites/Sprite1", typeof(Sprite)) as Sprite;
_HeroDict.Add(itm.ID, itm);
}
我的问题:我无法将 sprite 存储在结构中,也不知道解决方法。
有人告诉我可以/应该使用类而不是结构,但我也不知道为什么不能存储 Sprite。
你能给我指出正确的方向并给我一个示例方法吗?
提前致谢,Csharpest
最佳答案
您不能在结构或类中存储 Sprite 。 Sprite 是 Unity 内部的一个类。您可以存储的是对 Sprite 的引用,这正是您声明时发生的事情
Sprite sprite = whatever()
了解 Sprite 是如何存储的也很重要。 Sprite 是一种 Assets 。构建游戏时,Unity 将 Assets 序列化为包。当您导入一个 Sprite 时,Unity 会施展魔法,然后将其返回给您,就像您导入它时一样。这就是为什么你不能在你的代码/自定义文件/任何东西中存储 Sprite 。即使您确实找到了某种方法来做到这一点,这样做也是非常不合适的,因为 Unity 会执行许多您不知道的优化。
有了这些知识,您可以从 Unity 的 Assets 数据库中检索 Sprite (或任何 Assets ):
- 在您的一个单一行为类中声明一个公共(public)变量,并在编辑器中分配引用。
- 将您的 Assets 存储在 Resources 文件夹中,并使用 Resources.Load 按名称查找和加载它。
在您的情况下,最好的办法是为每个英雄提供某种 ID 并将其用作名称以从资源中加载它。
我还应该提到另外两件事:第一,除非您绝对知道自己在做什么,否则请始终使用类。您对问题的措辞表明您没有,因此请改用类(class)。更多阅读:Design guidelines from MSDN
第二,您的代码看起来像是来自 C++ 背景,并且您正在尝试以某种方式使用您现有的知识和在 Unity 中做事的旧方法。不。您真正应该做的是为每个英雄创建一个预制件并从资源中加载它们。
关于c# - Unity3D C# - 在结构/类中存储 Sprite ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851945/