私はクラスItem
,Weapon
を持ち、Item
、ItemFactory
、および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私は使いたい。
武器コンストラクタのデフォルトの縮尺です。スプライトは設定されません。あなたの工場でそれを設定しますか?あなたの工場コードはどうですか? –
ItemFactoryのコンストラクタコードを参照する必要があります –
WeaponはスプライトをUI-> Imageとして保持していますので、目に見えるようにプレハブです。私は武器の精霊の精霊が存在するかどうかを確認するために武装した。また、AddItemをハードコードして、すべてのアイテムではなくWeaponだけを取得した場合は、スプライト機能が表示されます。 – Dreik