インベントリのアイテム画像をゴミ箱にドラッグアンドドロップして、アイテムを削除できるようにしてみました。
まず、インベントリのスクロールビューと同じCanvasにパネルとテキストを作って画面の下の方に配置しました。
パネルにはタグをつけて、Raycast Targetのチェックを入れています。テキストのチェックは切っています。
UIをドラッグアンドドロップして並べ替えると同じように、ゴミ箱の上にアイテム画像をドロップしたときの処理を書きます。
foreach (RaycastResult target in results)
{
// アイテム画像タグの時
if (target.gameObject.tag == "ItemImage")
{
// ...
}
// ゴミ箱タグの時
else if(target.gameObject.tag == "DustBox")
{
// ゴミ箱の上にドロップした時
if (Input.GetMouseButtonUp(0) && isDragging)
{
// 掴んでいるアイテムを捨てる
// ThrowAway(currentImage);
// アイテム画像を非アクティブにする
currentImage.gameObject.SetActive(false);
// ダイアログを出す
Notification.GetInstance().ShowDialog("アイテムを捨てますか?", "はい", "いいえ",
// 「はい」のとき
() => {
// 掴んでいるアイテムを捨てる
ThrowAway(currentImage);
// ダイアログを消す
Notification.GetInstance().DestroyDialog2();
},
// 「いいえ」のとき
() => {
// アイテム画像をもとに戻す
DropFail();
// ダイアログを消す
Notification.GetInstance().DestroyDialog2();
// アイテム画像をアクティブにする
currentImage.gameObject.SetActive(true);
});
}
}
else
{
// アイテム画像以外の上で放した時
if (Input.GetMouseButtonUp(0) && isDragging)
{
// もとに戻す
DropFail();
}
}
掴んだアイテムをゴミ箱タグの付いたUIの上で放したときに、アイテムを捨てるメソッドを呼んでいます。そのまま呼んでも良いですが、ダイアログボックスを表示して、「はい」をクリックしたときに捨てるようにしました。
第4、5引数には、左右のボタンをクリックした時に呼ぶメソッドを渡します。ラムダ式で複数行書けます。捨てるときはインベントリのメソッドを呼んでいます。
GameObject image;
GameObject item;
void ThrowAway(Goods goods)
{
image = goods.gameObject;
item = goods.GetItemGameObject();
Debug.Log("捨てる前");
Debug.Log(image);
Debug.Log(item);
Debug.Log(Inventory.GetInstance().GetInventory().Count);
// インベントリのアイテムを破壊
Inventory.GetInstance().DestroyGoods(goods);
Invoke("AfterThrowAway", 0f);
}
void AfterThrowAway()
{
Debug.Log("捨てた後");
Debug.Log(image);
Debug.Log(item);
Debug.Log(Inventory.GetInstance().GetInventory().Count);
}
// public class Inventory : MonoBehaviour
List<Goods> inventory = new List<Goods>();
public void DestroyGoods(Goods goods)
{
// アイテム画像のスクリプトをリストから削除
inventory.Remove(goods);
// アイテム画像を削除
Destroy(goods.gameObject);
// アイテムを削除
Destroy(goods.GetItemGameObject());
}
その時に捨てる前と捨てた後の、アイテム画像とアイテムをコンソールに表示してみると、捨てた後では両方nullになって、インベントリのアイテムの数が1つ減っています。
これで、ドラッグアンドドロップでアイテムを削除できました。