繁体   English   中英

将Sprite作为Unity中Constructor的参数传递

[英]Passing Sprite as arguments to Constructor in Unity

我有一个课程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;
    }
}

然后,在Start开始时在不同的类上填充List of Item,这是代码。

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();
}

这是Assets/Resources/Maps/ items.txt文件

{"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'

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

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

可以修复什么?

这是问题所在:

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

Item类中的图标变量是Sprite类型, Resources.Load是一个在其参数中采用string类型的路径的函数。 要缩短这个简短,你要将Sprite传递给一个需要string的参数。

简单的解决方案是添加另一个名为public string iconPath;变量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文件以适应新的变量名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM