江上宿六です。
最近はインベントリ関連を続けてますけども、ほぼ自己流というか好き勝手に
作っているので挙動と精度が不安なんですよね。 今回もそんな流れですけど
もっとUnityに備わった機能で簡単にできないものですかね。
ともかく進めます。 今回はUIというかインベントリを表示させたらそこに
カーソルなんかを表示して動かしたり選択したアイテムを取り出したりとか
そういう事をやりたいと思います。
まぁ、早速やっていくわけですが、UIの構成というか階層が変わったので少し。
CanvasというUIの大本の下にInventoryBG(背景)があり、前回ではその下に
インベントリを元にInventoryItem(アイコン)を生成するようにしていましたが
今回はその下にInventoryItems(空)を作り、そこにGridLayoutGroupを追加して
その下にInventoryItemを生成するという風にしています。
InventoryCursorはカーソル用のImageで、階層はInventoryItemsと同じです。
以前の状態だとInventoryBGと並べるしかなかったので手を加えました。
こんな感じでまとめておいた方が管理は楽でしょう。
さて、まずはこのインベントリを表示させたりする方法です。 前回は途中で何か
gifを置いたせいで色々とやったつもりになってしまってましたが、仕切り直しで。
今回はインベントリを開くとゲームはポーズされ、キー操作がインベントリに移る
という感じの設計なので、まずはボタンを押すとポーズするようにします。
前回に少し書きましたが、Time.timeScaleを0にするとゲーム内時間が止まり
実質ポーズしているような状態になります。 1.0fにすると元に戻ります。
その値を見てポーズ中かどうかという状態を返す関数も作りました。
~
GetPause()でポーズ中かどうかを判別して処理を分けるようにしました。
ポーズ中でないならボタンを押した時にポーズするようにし、ポーズ中であれば
ポーズを解除するようにしています。この時、これまで作った作ってきた
キャラを動かす処理は当然ポーズをしていない状態の方に入ります。
インベントリ処理はポーズしている状態の方に追加していく事になりますが、
ポーズ中に加えインベントリ表示時というのを条件に入れた方が確実ですね。
ポーズ状態の切り替えが出来るようになったらそれぞれのタイミングで
インベントリ関連を表示したり消したりできるようにしましょう。
インベントリを表示させる関数です。 縦長ですが複雑なことはしていません。
48行目、inventoryCountを宣言してインベントリにあるアイテム数を入れています。
50行目でinventoryBG.SetActive(true)としてインベントリ(背景)を表示しました。
52,53行目、インベントリにアイテムが無い場合はカーソルは非表示に。
そうでない場合はカーソルを表示させ、インベントリにあるアイテムの数だけ
InstantiateでPrefabを作ったアイコンのベースを生成します。 この辺は前回
やった所をfor文対応させただけです。
インベントリを非表示にする関数、こちらは簡潔です。
前回も書いた子オブジェクトを全削除する処理を行いinventoryBG.SetActive(false)で
インベントリ(背景)を非表示にしています。 これらの関数をポーズやポーズ解除の
タイミングで呼んでやる事でインベントリの開け閉めが出来るわけですね。
最初はインベントリ空っぽの状態で開いてカーソルが出ないのを確認しています。
次に持っているものをインベントリにしまい、インベントリを開いた時にカーソルが
出ているのを確認しています。 前回のと似たgifですが、カーソル分の違いが。
長くなったので区切ります。 次回は複数のオブジェクトをインベントリに入れ
カーソルを移動させるという事をやります。 ちょっとここ数回はまとまりが悪い。