江上宿六です。
アイテム関連がそこそこ良い感じになったような気がするので更に踏み込みます。
という事でインベントリを作りたいと思います。 ゲームにおいてインベントリとは
だいたいプレイヤーの持ち物欄の事を指すことが多いと思いますが、NPCだったり
店の販売リストなんかもそういう言い方をしたり、あれ、しなかったかな。
という事でやっていきますが、まずインベントリに何を保持させるかです。
そりゃアイテムを保持させるですけどオブジェクトというわけではありませんから。
今回のアイテムの本体はSpriteにアタッチされているスクリプトで、この値を
保持させるという事です。
具体的にどの値を保持すべきかというと、画面に出てくるアイテムの定義を
明確にしておく必要があります。 現状で言うとアイテム名、アイテムレベル、
スタック数の値を持っているものがアイテムとして扱われ、流通します。
~
そしてこのようにそれらの値を保持出来るクラスを作ってListで宣言しています。
ここに値を追加していくことでインベントリ的な機能を実現させようという事です。
クラスを[System.Serializable]として、このクラスを[SerializeField]で宣言する事で
自作のクラスの値をインスペクターで確認出来るようになるようです。
値を追加する関数の一部分です。 少し雑な感じですけども今回のルールに則り
渡されたアイテムと同じ名前で同じレベルのアイテムのものがあれスタックさせ、
最後までそれが無ければListのAdd()を使って渡されたアイテムを追加するという風に
なっています。 また装備品は無条件で追加されるようにしてます、ルールです。
動作を確認するため、ボタンにパキラをインベントリに追加する処理と、
ランタンを追加する処理を設定して実行してみます。
パキラボタンを押すとパキラが追加されました
更に連打するとValueの値がどんどん上がっていきます。
ランタンボタンを押すと新たにランタンが追加されました。
ランタンは装備品と設定されているのでスタックはされませんでした。
だいたい想定通りに動いているのが確認出来ました。
あとはキャラの行動に合わせてこれらの処理を行えば良いわけです。
アイテムをしまう時にインベントリに追加して情報を持ったSpriteを破棄し、
アイテムを取り出す時にその情報を持ったSpriteを生成してインベントリから削除。
要素の削除はList.Remove()で行います。 要素番号を指定して削除出来るような
関数を使うと便利だと思います。
こんな感じです。
インベントリ関係で便利だったり簡単な方法が無いか探してみたんですけども
どれもあまりピンとこなかったので自分で適当に考えてやってみました。
それにしてもリストを扱うのが簡単で驚きです。
次回もまた未定ですけど、流れでインベントリの表示とかやってみるのも良いかもと
思ったりしてます。 出来るかは分からないですけど。