2017-02-18 2 views
1

У меня есть класс Item нижеПередача Sprite в качестве аргументов конструктора в Unity

[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' в 'строка'

по адресу itemList.Add(new Item(items[i].itemName, Resources.Load<Sprite>(items[i].icon), items[i].price));

Я попытался отправить имя пути (items[i].icon) спрайта конструктору, но все же получил ошибку.

Что может быть исправить?

+0

Единственное, что я вижу нечетным, это то, что вы используете тот же (?) Класс для списка Json и itemList. Это не должно быть возможным. –

+0

@JohanLindkvist Я следил за этим из Unity Live Training. Можете ли вы объяснить мне, почему? –

ответ

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 для размещения нового имени переменной.

Смежные вопросы