将Sprite作为参数传递给Unity

时间:2017-02-18 10:30:24

标签: c# unity3d

我有一个课程Item,如下所示

[System.Serializable]
public class Item
{
    public string itemName;
    public Sprite icon;
    public float price = 1f;

    public Item(string newItemName, Sprite newIcon, float newPrice)
    {
        this.itemName = newItemName;
        this.icon = newIcon;
        this.price = newPrice;
    }
}

然后,在开始时在不同的类上填充项目列表,这是代码。

void Start () {
    itemList = new List<Item>();
    TextAsset asset = Resources.Load(Path.Combine("Maps", "items")) as TextAsset;
    var items = JsonHelper.FromJson<Item>(asset.text);
    Debug.Log("" + items.Length);
    for(int i= 0; i < items.Length; i++)
    {
        itemList.Add(new Item(items[i].itemName, Resources.Load<Sprite>(items[i].icon), items[i].price));
    }
    RefreshDisplay();
}

这是items.txt

中的Assets/Resources/Maps/文件
{"Items":[{
    "id": "1",
    "itemName": "Candy",
    "price": "2",
    "icon" : "ic_candy"
  },
  {
    "id": "2",
    "itemName": "Coin",
    "price": "10",
    "icon" : "ic_coin"
  },
  {
    "id": "3",
    "itemName": "Bomb",
    "price": "8",
    "icon" : "ic_bomb"
  }]
}

我收到错误说

  

参数1:无法从'UnityEngine.Sprite'转换为'string'

itemList.Add(new Item(items[i].itemName, Resources.Load<Sprite>(items[i].icon), items[i].price));

我尝试将sprite的路径名(items[i].icon)发送给构造函数但仍然出错。

可以解决什么问题?

1 个答案:

答案 0 :(得分:3)

问题在于:

Resources.Load<Sprite>(items[i].icon)

Item类中的图标变量为Sprite类型,但 Resources.Load是一个采用string类型的路径的函数它的参数。要缩短此短消息,您将Sprite传递给期望为string的参数。

简单的解决方案是添加另一个名为public string iconPath;的变量。然后,您可以使用它将Sprite加载到public Sprite icon;变量。

下面的内容应该这样做:

[System.Serializable]
public class Item
{
    public string itemName;
    public string iconPath;
    public float price = 1f;

    [System.NonSerialized]
    public Sprite icon;

    public Item(string newItemName, Sprite newIcon, float newPrice)
    {
        this.itemName = newItemName;
        this.icon = newIcon;
        this.price = newPrice;
    }
}

// Use this for initialization
void Start()
{
    itemList = new List<Item>();
    TextAsset asset = Resources.Load(Path.Combine("Maps", "items")) as TextAsset;
    var items = JsonHelper.FromJson<Item>(asset.text);
    Debug.Log("" + items.Length);
    for (int i = 0; i < items.Length; i++)
    {
        itemList.Add(new Item(items[i].itemName, Resources.Load<Sprite>(items[i].iconPath), items[i].price));
    }
}

确保更新您的Json文件以容纳新的变量名称。