关于字典:Unity3D C# – 在struct / class中存储sprite?

Unity3D C# - Store sprites in struct/class?

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

1
2
-> I have little to no knowledge about structs
-> and got told this is probably a performance loss / bad approach

将值存储在结构中并创建字典(int,my struct),以获得以前运行良好的值。

我已经到了我想要为这个结构中的每个英雄存储特定精灵的地步。我考虑通过resources.load获取这些精灵(我猜这是最简单的方法)

1
2
3
4
5
6
7
8
9
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;

这就是我如何向结构馈送数据并向字典中添加条目的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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,不知道为什么。

你能给我指出正确的方向并给我一个例子吗?

事先谢谢,CSharpest


不能将sprite存储在结构或类中。精灵是统一的内在阶级。您可以存储的是对sprite的引用,当您声明

1
Sprite sprite = whatever()

了解精灵是如何储存的也很重要。精灵是一种资产。当你的游戏建立时,资产被统一序列化成包。当你导入一个精灵时,Unity会施展一些魔法,然后像导入精灵时一样将它还给你。这就是为什么你不能在你的代码/自定义文件/任何东西中存储sprite。即使您确实找到了一些方法来做这件事,也非常不适合这样做,因为Unity执行了许多您不知道的优化。

有了这些知识,您可以从Unity的资产数据库中检索精灵(或任何资产)的方法是:

  • 在一个MonoBehavior类中声明一个公共变量,并在编辑器中分配引用。
  • 将您的资产存储在资源文件夹中并使用资源。加载以查找并按名称加载。
  • 在您的例子中,您最好给每个英雄一些ID,并使用它作为名称从资源中加载它。

    我还应该提到另外两件事:一,总是使用类,除非你完全知道你在做什么。你回答问题的方式表明你没有,所以用一个类来代替。更多阅读:来自msdn的设计指南

    第二,你的代码看起来像是来自C++背景,你试图用你现有的知识和旧的方法在Unity内部做事情。不要这样做。你真正应该做的是为每个英雄创建一个序言,并从资源中加载它们。