Developer

【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
2022.10.31
Lv2

【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理


はじめに

本連載は以下の目次ページにまとまっています。

実践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の設定を行いますが、今回と同じような流れで設定することができます。

次回は敵キャラクターを作成していきます。


Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次