江上宿六です。
インベントリ表示したり非表示にしたりするくらいで時間をかけすぎという感じで
個人的にもなんか微妙な感じだと思っていますが、まぁ、今回はここ数回よりは
意味のあることをやると思いますので、多分。
今回はインベントリにアイテムが複数ある場合にカーソルを動かして
選択アイテムを切り替えて取り出すという事をやります。
必要なのはもちろんこのカーソルの位置を保持する変数と、カーソルを動かす処理、
カーソルが移動した時にカーソルの表示位置を変える処理ですね。
カーソルを動かす関数です。 移動量を受け取っていますが実質-1か1のみです。
カーソルが動ける範囲内であれば動く様にしています。
カーソルの表示位置を変える関数です。 カーソルの位置をアイテムアイコンを
子に持つオブジェクトのカーソル番目の子の位置に移動させています。
最初はカーソル番毎にposition位置を動かしてやろうと思ったんですけど
なんか上手く行かなかったのでこうなりました。 やや裏技感があります。
あとはキー入力の所でMoveCursorPos()を呼んでやれば良いわけなのですが、
ここでちょっとした問題が発生しました。
カーソル移動が速すぎて大変です。 十字キーがボタン扱いならGetButtonDown()で
押した瞬間を検出すれば良いのですが、アナログスティックやハットスイッチの場合
GetAxisDownといったものが無く、押した瞬間を検出することが出来ません。
まぁ、それだったら自分で同じ様な挙動をするような処理を作れば良いだけです。
float型のleftTimeという変数を容易し、左スティックを左に入力時にleftTimeが
0ならばカーソル移動処理を行いleftTimeにTime.unscaledDeltaTImeを加えています。
この値はフレームを行うのにかかった時間Time.deltaTimeとほぼ同じなんですけど
こっちを使う理由はインベントリ表示時は時間が止まっている、Time.timeScaleが
0になっているのでTime.deltaTimeが動かないからです。 そういう時はこっちの
Time.unscaledDeltaTimeを使います。
で、左スティックの傾きが小さくなったらleftTimeを0に戻します。
本当なら離した瞬間も検出するようにelseの所をいじるべきですが今はいいです。
右に傾いた時の処理も同様に追加したら実行しましょう。
ちゃんと一つずつ動いてくれています。 これならちゃんと選択出来そうですね。
しかし端から端まで行くのも連打しなければいけないというのも不便です。
先ほどの所に押し続けたら素早く動くようになるよう変更を加えてみました。
押し続けてleftTimeが0.15fを超えたらカーソル移動です。 0.15秒です。
その後leftTimeを僅かに戻し、押し続けると再び0.15fに到達するようにしています。
これleftTimeを直接いじってるのは微妙だと思いますけど、今は別にいいでしょう。
これでだいぶインベントリ操作っぽい動きになったと思います。
こんな感じです。 インベントリからアイテムを取り出す処理に関しては
cursorPosの位置にあるものを取り出すようにすれば良いわけです。
以前書いたような気がしたのが気のせいだったので処理部分を出しておきますが。
これはインベントリの0番目のアイテムをMakePickedItemIcon()を使って生成し、
0番目のアイテムをインベントリから取り除くといった処理です。 これを
cursorPosにしてやれば良いだけです。
MakePickedItemIcon()内はInstantiate()以外には位置やスプライトの設定、
オブジェクト名の変更といった感じの事が行われてるだけです。
次回はまた未定ですけど、またインベントリ周りで面白い事が出来そうなので
このまま進めたいと思います。 最近はこっちをまとめるのが大変で時間を浪費する
本末転倒な感じになっているので、まぁ、ちょっと作る方を頑張りたいです。