ユニティちゃんのRPGを作ってみよう14ー動いていない時にHPやMPを表示するー

今回はユニティちゃんが動いていない状態の時に画面の右下にパーティーのHPやMPを表示したパネルを開き、移動キーやボタンを押した時にそのパネルを閉じるようにします。

前回はコマンド画面等でのボタン選択の速度を上げる設定をしました。

ユニティちゃんのRPGを作ってみよう13ー次のボタンの選択速度を上げるー
ユニティちゃんのRPGでコマンド等の選択で次のボタン選択速度を上げる設定をしたいと思います。

ユニティちゃんのRPGを作ってみようの他の記事は

ユニティちゃんのRPGを作ってみよう
ユニティちゃんのRPGを徐々に作っていくカテゴリです。

から見ることが出来ます。

スポンサーリンク
スポンサーリンク

パーティーのHPやMPを表示するUIの作成

まずはパーティーのHPやMPを表示するUIを作成していきます。

Villageシーンのヒエラルキーで右クリックからUI→Canvasを選択し、名前をCharacterStatusとします。

CharacterStatusのインスペクタのCanvas Scalerの設定を変更します。

UI Scale ModeをScale With Screen Sizeにして画面サイズに応じてUIのScaleを変更します。

Referrece Resolutionには基本となるスクリーンサイズを指定します。

Screen Match ModeはExpandにし、画面サイズに応じて広がるようにします。

ユニティちゃんRPGのCharacterStatusのCanvas Scaleの設定を変更する

CharacterStatusを選択した状態で右クリックからUI→Panelを選択し、名前をCharacterStatusPanelとします。

シーンビューでCharacterStatusPanelのサイズを調整し、右下に表示されるようにします。

ユニティちゃんRPGのCharacterStatusPanelのサイズ

CharacterStatusPanelを選択し、インスペクタのAdd ComponentからLayout→Vertical Layout Groupを選択し取り付け、以下のように設定します。

CharacterStatusPanelにVeritical Layout Groupを取り付ける

Imageのチェックを外しておきます。

Control Child SizeのWidthにチェックを入れ、横幅のサイズをこのパネルの幅に応じてコントロールします。

Child Force ExpandのWidthにチェックを入れ、パネルのサイズに応じて横幅が広がるようにします。

CharacterStatusPanelを選択した状態で右クリックからUI→Panelを選択し、名前をCharacterPanelとします。

CharacterPanelのAnchor Presetsをleft topにし、Heightを50にします。

またインスペクタのAdd ComponentからLayout→Horizontal Layout Groupを選択し取り付けます。

Child AlignmentをUpper Centerにします。

Child Force ExpandのWidthとHeightにチェックを入れます。

ユニティちゃんRPGのCharacterPanelの設定

これでCharacterPanelの子要素が横一列に整列します。

CharacterPanelを選択した状態で右クリックからUI→Textを3回選択し、名前をCharacterName、HPTitle、MPTitleとします。

それぞれのインスペクタのAlignmentで中央にし、それぞれのRect Transformで

CharacterNameのWidthは250、Heightは50
HPTitle、MPTitleのWidthとHeightは50

とします。

Anchor Presetsはleft topにします。

HPTitleのTextにはHP、MPTitleのTextにはMPという文字列を入力しておきます。

CharacterPanelを選択した状態で右クリックからUI→Sliderを2回選択し、名前をHPSlider、MPSliderとします。

それぞれRect TransformのWidthは100、Heightは50とします。

HPSliderとMPSliderの子要素にTextを作成し、それぞれの名前をHPText、MPTextとします。

HPText、MPTextのAlignmentは左寄せの真ん中表示にします。

CharacterPanelの階層は以下のようになります。

ユニティちゃんRPGのCharacterPanelの階層

キャラクターのHPを数値とスライダーで表示し一目見てどの程度HPやMPが残っているかがわかるようにします。

ユニティちゃんRPGのCharacterPanelの表示サンプル

CharacterPanelの子要素の幅や高さなどはCharacterStatusPanelのサイズによって変わってきますので調整してください。

ここまで出来たらCharacterPanelをAssets/RPG/Prefabs/UI/Commmandフォルダにドラッグ&ドロップしてプレハブにし、ヒエラルキー上のCharacterPanelは削除します。

CharacterPanelが一人のキャラクターの名前、HP、MPを表示しますので、スクリプトからCharacterPanelプレハブをインスタンス化しパーティー全員のステータスを表示します。

これでUIが出来ました。

パーティーステータスを表示するスクリプトの作成

次にパーティーステータスを表示する為のスクリプトを作成していきます。

Assets/RPG/Scriptsフォルダ内に新しくIdleCommandScriptという名前のスクリプトを作成し、CharacterStatusゲームオブジェクトに取り付けます。

スクリプトが少し長いので、分けて説明します。

フィールド宣言部とAwakeメソッド、Startメソッド

まずはフィールド宣言部とAwakeメソッド、Startメソッドを作成します。

partyStatusにはAssets/RPG/Data/StatusのPartyStatusアセットファイルをインスペクタで設定します。

idleTimeはどれだけユニティちゃんを動かしたりボタンを押したりしていなければCharacterStatusPanelを表示するかの秒数を設定します。

elapsedTimeはキーやボタンを押さなくなってからどれだけ時間が経ったかを入れます。

isOpenCharacterStatusPanelは現在CharacterStatusPanelを開いているかどうかのフラグです。

characterPanelPrefabには先ほどプレハブにしたCharacterPanelをインスペクタで設定します。

characterStatusPanelはCharacterStatusPanelを取得し設定します。

sceneManagerにはシーン切り替えを行っているLoadSceneManagerを取得し設定します。

unityChanScriptはインスペクタでそれぞれのシーンのUnityChanをドラッグ&ドロップしUnityChanScriptを設定します。

Awakeメソッドでは子要素のCharacterStatusPanelゲームオブジェクトを取得しています。

Startメソッドではヒエラルキー全体からSceneManagerゲームオブジェクトを探し、設定されているLoadSceneManagerスクリプトを取得しています。

Updateメソッド

Updateメソッドで実際のパーティーのステータスを表示する処理をしています。

シーン遷移途中、ユニティちゃんの状態が会話中やコマンド実行中の場合はelapsedTime(何も押さなくなってからの時間)を0にし、CharacterStatusPanelを非表示にし、returnでその後の処理は行いません。

それ以外の時でInput.anyKeyDownで何らかのキーやボタンが押されたかどうか、Mathf.ApproximatelyでInput.GetAxis(“Horizontal”)と0のfloatの比較、Input.GetAxis(“Vertical”)と0のfloatの比較をして移動の入力がほぼ0であるかを比較し、!を付けてその反転、つまり何らかの移動がされている場合はelapsedTimeを0にし、CharacterStatusPanelの子要素のCharacterPanel群を全部削除します。

これは何らかの行動を起こしたのでCharacterStatusPanelを非表示にしたということになります。

else ifで何らかのキーを押していない時でCharacterStatusPanelを開いていない時はelapsedTimeにTime.deltaTimeを足して何もしていない時間の計測を行います。

経過時間がidleTime以上になったらパーティーメンバー分のCharacterPanelプレハブをインスタンス化し、階層を辿ってTextコンポーネントやSliderを取得し、そこにパーティーのステータスデータを設定します。

これらの処理は以前作成したアイテムコマンドの処理と同じ感じなので問題はないと思います。

Sliderの値はデフォルトでは0~1の間で指定することになっているので(SliderのMin ValueとMax Valueで変更することも可能)、HPではmember.GetHp()で得られた値を(float)でfloat型にキャストした後member.GetMaxHP()で割って0~1の間の値にしています。

MPも同じようにして求めています。

CharacterPanelをインスタンス化したらCharacterStatusPanelを表示しています。

CharacterStatusの子要素のCharacterStatusPanelのインスペクタで名前の横のチェックを外し最初はパネルが表示されないようにしておきます。

これで機能が完成しました。

VillageシーンのCharacterStatusを選択した状態でCtrl+Dキーを押して複製し、WorldMapシーンにドラッグ&ドロップして移動し、名前をCharacterStatusに変更します。

WorldMapシーンのCharacterStatusのIdleCommandScriptのunityChanScriptにはWorldMapシーンのUnityChanゲームオブジェクトをドラッグ&ドロップしUnityChanScriptを設定します。

パーティーステータスが表示されるか確認する

機能が完成したのでUnityを実行し、何もキーやボタンを押さない時にパーティーステータスが表示されるかを確認してみましょう。

上のようになりました。

終わりに

簡易的なパーティー全体のステータスを確認出来る機能ですがあると便利ですよね。

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています

コメント

タイトルとURLをコピーしました