c# - Unity3D C# - 在结构/类中存储 Sprite ?

标签 c# dictionary unity3d struct sprite

我正在创建一个多人游戏,其中包括具有不同值(例如健康、伤害)的不同英雄。我最初从数据库中获取这些值并将它们存储到一个结构中。

-> 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 ):

  1. 在您的一个单一行为类中声明一个公共(public)变量,并在编辑器中分配引用。
  2. 将您的 Assets 存储在 Resources 文件夹中,并使用 Resources.Load 按名称查找和加载它。

在您的情况下,最好的办法是为每个英雄提供某种 ID 并将其用作名称以从资源中加载它。

我还应该提到另外两件事:第一,除非您绝对知道自己在做什么,否则请始终使用类。您对问题的措辞表明您没有,因此请改用类(class)。更多阅读:Design guidelines from MSDN

第二,您的代码看起来像是来自 C++ 背景,并且您正在尝试以某种方式使用您现有的知识和在 Unity 中做事的旧方法。不。您真正应该做的是为每个英雄创建一个预制件并从资源中加载它们。

关于c# - Unity3D C# - 在结构/类中存储 Sprite ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851945/

相关文章:

ios - Unity3d for iOS 下的 Json.NET

Unity : 4-point calibration/reprojection 的 OpenCV

c# - 将 XElement 的子元素转换为字符串

c# - 将 GPL 许可证添加到 C# 项目

python - 将元组数组字典转换为 CSV

c# - 内存索引

c# - 如何检查文件的IndexOutOfRangeException并将其记录?

c# - 如何解析 C# 泛型类型名称?

c# - 无法在 Azure Function v2 中加载文件或程序集 'System.Private.ServiceModel'

c# - 将 JSON 数组反序列化为字典,其中的键与 JSON 分开提供