【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
はじめに
本連載は以下の目次ページにまとまっています。
前回の記事はこちら↓
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
前回はスイッチで開く扉のギミックを作成しました。
今回はキャラクターのHP管理の仕組みを作成していきます。
具体的には、HPバーの作成、ダメージを負うとHPが減少する設定、HPが0になるとダウンするアニメーションの再生を行います。
1.HPを表示するUIの作成
初めにプレイヤーのHPを表示するためのUIを作成します。
下図のように、画面中央上部に表示されるようにします。
① Canvas の配置と設定
Canvas コンポーネントは、UI を配置・描画するための領域です。すべての UI は Canvas コンポーネントの子要素にしなくてはなりません。
Hierarchy ビューで UI > Canvas を配置します。
配置した Canvas を選択し、Inspector ビューで Canvas Scaler を下図の通り設定します。
② Slider の配置と設定
UI > Slider を追加し、名前を「HPBar」とします。
Rect Transform を下記の通りに設定します。
Slider コンポーネントの Max Value と Value を「100」に設定します。
③ HPBar > Background の設定
HPBar の子要素のうち、Background を選択します。
Image > Color をグレーに変更します。
④ HPBar > Fill Area の設定
Fill Area の Rect Transform の Left, Right を「0」にします。
⑤ HPBar > Fill Area > Fill の設定
Fill Area の子要素の Fill を選択します。
Rect Transform の Width を「0」に変更します。
さらに、Image > Color の色を変更します。ここでは緑にしました。
⑥ HPBar > Handle Slide Area を削除
Handle はスライダーのつまみ部分ですので、今回作成しているHPBarには不要です。
Handle Slide Area を削除します
2.HPを管理するスクリプトを作成する
新規スクリプトを作成し、名前を「CharacterStatusScript」とします。
以下の内容を記述してください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; public class CharacterStatusScript : MonoBehaviour { Animator anim; public UnityEvent onDieCallback = new UnityEvent(); public int life = 100; public Slider hpBar; void Start() { anim = GetComponent<Animator>(); if(hpBar != null) { hpBar.value = life; } } public void Damage(int damage) { if(life <= 0) return; life -= damage; if(hpBar != null) { hpBar.value = life; } if(life <= 0) { OnDie(); } } void OnDie() { anim.SetBool("Die", true); onDieCallback.Invoke(); } }
変数やメソッドは以下の通りになっています。
・変数 “life”(12行目)
HPを数字で管理するための変数です。
・変数 “hpbar”(14行目)
この後作成するUIと連動させるための変数です。
・Damage メソッド(26~39行目)
外部(敵やトラップのスクリプト)から呼び出して、キャラクターのHPを減らすためのメソッドです。hpbar に変更後の数値を伝えます。
life が0以下になると、OnDie メソッドを呼び出します。
・OnDie メソッド(41~45行目)
キャラクターのHPが0以下になったときに呼び出されます。アニメーターのBool型パラメータ「Die」を true にします。
onDieCallback にはキャラクターごとに固有の処理を登録できます。
3.プレイヤーにアタッチする
CharacterStatusScript をプレイヤーにアタッチします。
合わせて、CharacterStatusScript > Hp Bar には Canvas > HPBar を設定します。
4.テスト用のギミックを作成する
ここまでの動作確認用のギミックとして“トラップ”を作成します。
プレイヤーが触れるとダメージを10受ける仕様とします。
適当に3Dオブジェクトを配置し、名前を「TestTrap」とします。ここでは、Cube を使用して紫色のマテリアルを設定しました。
コライダーの設定はトリガーに変更しておきましょう。
Is Trigger にチェックを入れてください。
新規スクリプトを作成し、名前を「TestTrapScript」とします。
以下を記述します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestTrapScript : MonoBehaviour { private void OnTriggerEnter(Collider other) { if(other.CompareTag("Player")) { var status = other.GetComponent<CharacterStatusScript>(); status.Damage(10); } } }
記述したら、TestTrap にアタッチし、テストプレイをしましょう。
プレイヤーが TestTrap に触れたときにHPが減ることを確認できれば成功です。
プレハブ化も忘れずに行いましょう。
5.プレイヤーが倒れるアニメを作成
プレイヤーの Animator Controller を、Bool 型のパラメータ「Die」が有効時に、倒れるアニメーションが再生されるように変更します。
① パラメータの追加
Hierarchy ビューから Player を選択し、Animator ウィンドウを開きます。
Parameters のタブで、新規で Bool型パラメータを追加し、名前を「Die」とします。
② ステートの追加
新規ステートを追加し、名前を「Die」とします。
Motion に「GoDown」を設定します。
※humanoid の方で設定してください。
③ 遷移の作成
Any State から Die へ矢印を引きます。
Inspector ビューから Can Transition To Self のチェックを外します。
さらに、Conditions に “Die” を設定します。
テストプレイをして、HPが0になったらプレイヤーが倒れることを確認しましょう。
6.プレイヤーを行動不能にする
テストプレイをすると、プレイヤーが倒れた後も移動操作ができてしまうことが確認できます。
そこで、HPが0になったら、プレイヤーを操作できないようにスクリプトを変更します。
変更を行うのは PlayerScript になります。
① 変数を追加
以下の変数を追加しましょう。
② Start でコンポーネントを取得
③ Updateを中断させる
再びテストプレイをして、HPが0以下の時、操作できないことを確認しましょう。
おわりに
今回はプレイヤーのHP管理の仕組みを作成しました。今回もスクリプトの記述を複数行ったので、内容を把握しておきましょう。また、次回以降作成する敵キャラクターにも、HPの設定を行いますが、今回と同じような流れで設定することができます。
次回は敵キャラクターを作成していきます。