2016-12-23 4 views
1

私はクラスItem,Weaponを持ち、ItemItemFactory、およびInventoryControllerを継承しています。 コード:ItemFactoryなぜSpriteはnullですか?

public class Item : MonoBehaviour { 
     protected float scale = 1; 
     public float Scale { get 
     { 
      return scale; 
     } 
     } 
     protected int id; 
     protected int rarity; 
     static protected Sprite sprite; 

     public Item() 
     { 
     id = -1; 
     } 

     public Item(int id) 
     { 
     this.id = id; 
     } 

     public bool IsEmpty() 
     { 
     if(this.id==-1) return true; 
     return false; 
     } 

     public Sprite getSprite() 
     { 
     return sprite; 
     } 

    } 

public class Weapon : Item{ 

    public Weapon() 
    { 
    scale = 0.25f; 
    id = 1; 
    }  
    void Awake() 
    { 
    sprite = GetComponent<Image>().sprite; 
    } 

} 

InventoryController呼び出しはそれのためにItemを作るために、その後、私はインベントリにItemを設定するには、このコードを使用します。

public void AddItem(Item item) 
    { 
    for(int i=0; i<slotAmount; i++) 
    { 
     if (items[i].IsEmpty()) 
     { 
     items[i] = item; 
     GameObject itemObj = Instantiate(inventoryItem); // Its empty item prefab 
     itemObj.transform.SetParent(slots[i].transform); 
     itemObj.transform.position = slots[i].transform.position; 
     itemObj.GetComponent<Image>().sprite = item.getSprite(); // Its null 
     itemObj.transform.localScale = new Vector3(item.Scale, item.Scale); 
     return; 
     } 
    } 
    } 

でも思っスケールは右の私が手スプライトがnullできます。デバッグしようとしました。item.getType()は、ItemFactoryが新しいWeaponを返した場合に"Weapon"を返します。だから質問は私がこの項目に設定したスプライトがヌルなのはなぜですか?

ItemFactory itemFactory = new ItemFactory(); 
AddItem(itemFactory.makeItem(1)); // makeItem(int type) returns the Item of type Weapon if type == 1 

あなたがそうここItemFactoryコードを求めていることがある:私はこのようなItemFactory()呼び出す

public class ItemFactory : Item { 

    public ItemFactory() { } 

    public Item makeItem(int type) 
    {  
    if(type == 1) 
    { 
     return new Weapon(); 
    } 
    else 
    { 
     return new Armor(); 
    } 
    } 
} 

また、ここでプレハブWeaponを説明するためには、それのスクリーンショットです: Weapon Prefab weapons_3ですimage私は使いたい。

+0

武器コンストラクタのデフォルトの縮尺です。スプライトは設定されません。あなたの工場でそれを設定しますか?あなたの工場コードはどうですか? –

+0

ItemFactoryのコンストラクタコードを参照する必要があります –

+0

WeaponはスプライトをUI-> Imageとして保持していますので、目に見えるようにプレハブです。私は武器の精霊の精霊が存在するかどうかを確認するために武装した。また、AddItemをハードコードして、すべてのアイテムではなくWeaponだけを取得した場合は、スプライト機能が表示されます。 – Dreik

答えて

0

エレガントではありませんが、機能しました。私はItemFactoryクラスを変更して、作成したアイテムを保持して、ItemFactoryからスプライトを取得できるようにしました。

public class ItemFactory : Item { 

    private Item item; 

    public ItemFactory() { } 

    public Item makeItem(int type) 
    { 

    if(type == 1) 
    { 
     item = new Weapon(); 
     sprite = Weapon.getSprite(); 
    } 
    else 
    { 
     item = new Armor(); 
     sprite = Armor.getSprite(); 
    } 
    return item; 
    } 

    public Sprite getItemSprite() 
    { 
    return sprite; 
    } 
} 
関連する問題