41
0
0

第7回 - HPとスコアを実装する!【Unity講座2022】

Published at November 1, 2022 12:39 a.m.
Edited at April 19, 2023 2:24 p.m.

HPとスコアを実装する!

今回の目標

  • 1 HPを実装する
  • 2 スコアを実装する
  • 1. HPの実装

    HPはバーや数字のみなど、様々な表現方法が有りますが、今回は画像1つを1ライフとして表現します。

    1-1. 画面左上にHPを表示する

    1. HPを表す画像を取り込む

    今までに使ってきたAssetにHPを表すのにちょうど良い画像が無かったので、新しく画像を取り込みます。(見落としているだけだったらすみません)

    1. 以下の画像をダウンロードする。(それっぽく描いてみました)
      画像を右クリック→「名前を付けて画像を保存」
    HP_Sprite
    1. Assetフォルダ内にSpritesというフォルダを作成する
    2. Asset/Spritesに先ほどの画像を移動する
      エクスプローラーから画像ファイルをドラッグアンドドロップすることでAsset/Spritesに移動できます

    2. ゲーム画面に画像を表示する

    1. Hierarchyウィンドウで右クリック→UI→Canvasを選択する

    スクリーンショット (103)

    1. 先ほど作成したCanvasを選択した状態で、右クリック→UI→Imageを選択する。(作成後にCanvasにドラッグアンドドロップしてもOKです)

    スクリーンショット (104)

    1. 2で作成した Image を以下のように 設定する

    スクリーンショット (121)

    1. Life1(3で作成したImage)を3つに複製する
      Life1を選択した状態で右クリック→Duplicateで複製できます

    スクリーンショット (106)

    1. それぞれを以下のように設定する

    スクリーンショット (122)

    2. 敵に当たったらHPが減るようにする

    1. C#ファイルを作成する
      Assets / Scriptに「HPManager」というC#ファイルを作成します。
      作成したら開いてください。

    2. EnemySkeletonにEnemyというタグをつける

    3. 以下のようなコードを記述する

    ヒント

    1. HPを管理する変数をつくる。例ではlifeCountとする。
    2. Enemyに当たったらlifeCountを1減らす
    3. gameObject.SetActive(false)でオブジェクトを非アクティブにする。非アクティブのものは見えなくなる
    HPManager
          using System.Collections;
          using System.Collections.Generic;
          using UnityEngine;
    
          public class HPManager : MonoBehaviour
          {
              public GameObject[] lifeArray = new GameObject[3];
              private int lifeCount;
         
              /*この辺りにコードを書く*/
    
              void Update()
              {
    
              if (lifeCount == 3)
              {
                  lifeArray[2].gameObject.SetActive(true);
                  lifeArray[1].gameObject.SetActive(true);
                  lifeArray[0].gameObject.SetActive(true);
              }
    
              if (lifeCount == 2)
              {
                  lifeArray[2].gameObject.SetActive(false);
                  lifeArray[1].gameObject.SetActive(true);
                  lifeArray[0].gameObject.SetActive(true);
              }
              if (lifeCount == 1)
              {
                  lifeArray[2].gameObject.SetActive(false);
                  lifeArray[1].gameObject.SetActive(false);
                  lifeArray[0].gameObject.SetActive(true);
              }
    
              if (lifeCount <= 0)
              {
                  lifeArray[2].gameObject.SetActive(false);
                  lifeArray[1].gameObject.SetActive(false);
                  lifeArray[0].gameObject.SetActive(false);
              }
          }
      }
    
    HPManagerスクリプト(クリックして見る)
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class HPManager : MonoBehaviour
    {
        public GameObject[] lifeArray = new GameObject[3];
        private int lifeCount;
    
        void Start()
        {
            lifeCount = 3;
        }
    
        private void OnCollisionEnter2D(Collision2D collision)
        {
            if (collision.gameObject.tag == "Enemy")
            {
                if (lifeCount > 0)
                {
                    lifeCount--;
                }
            }
        }
    
        void Update()
        {
            if (lifeCount == 3)
        {
                //SetActiveで画像の表示・非表示を切り替え
                lifeArray[2].gameObject.SetActive(true);
                lifeArray[1].gameObject.SetActive(true);
                lifeArray[0].gameObject.SetActive(true);
            }
    
            if (lifeCount == 2)
            {
                lifeArray[2].gameObject.SetActive(false);
                lifeArray[1].gameObject.SetActive(true);
                lifeArray[0].gameObject.SetActive(true);
            }
            if (lifeCount == 1)
            {
                lifeArray[2].gameObject.SetActive(false);
                lifeArray[1].gameObject.SetActive(false);
                lifeArray[0].gameObject.SetActive(true);
            }
    
            if (lifeCount <= 0)
            {
                lifeArray[2].gameObject.SetActive(false);
                lifeArray[1].gameObject.SetActive(false);
                lifeArray[0].gameObject.SetActive(false);
            }
        }
    }
    
    1. HPManagerをPlayerにアタッチする
    2. アタッチしたHPManagerにLife1、2、3をドラッグアンドドロップする

    スクリーンショット (110)

    1. 実行してHPが減るか確認

    ※注意:今回はPlayerにHPManagerをアタッチしましたが、別にHPを管理するオブジェクトをつくると、PlayerをDestroyした時などにも処理が出来るようになります。次に行うスコアの実装が参考になると思うので挑戦してみてください。(要望があれば追記します。)

    2. スコアの実装

    スコアを実装します!スコアを加算する条件はいくつか思いつくと思いますが、今回はアイテムを取得したときに加算されるようにしてみます。

    2-1. アイテムを実装しよう

    1. Asset/Spritesに以下の画像を追加する
      画像は以下を使用してください(さくらんぼ的なものを書きたかった…)↓
    cherry
    1. アイテムの画像をHierarchyにドラッグアンドドロップして画面に表示させる
    2. "Item"というタグをつける
    3. 当たり判定をつける
    4. IsTriggerにチェックする

    2-2. スコアを表示しよう

    1. 1-2で作成したCanvasを選択した状態で、Textを作成する。名前は"ScoreText"とします。

    スクリーンショット (113)

    1. ScoreManagerというC#スクリプトファイルを作成し、以下のようなスクリプトを書く

    ヒント

    1. とったアイテム数を管理する変数をつくる。例ではitemCount とする。
    2. Itemに当たったらitemCountを1増やす
    3. 当たったアイテムを非アクティブにする
    csharp
         using System.Collections;
         using System.Collections.Generic;
         using UnityEngine;
    
         public class ScoreManager : MonoBehaviour
         {
             public int itemCount = 0;
    
                 /*この辺りにコードを書く*/
    
         }
    
    ScoreManagerスクリプト(クリックして見る)
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ScoreManager : MonoBehaviour
    {
        public int itemCount = 0;
    
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Item"))
        {
            itemCount++;
            other.gameObject.SetActive(false);
        }
    }
    
    1. ScoreManagerをPlayerにアタッチする
    2. ScoreSumというC#スクリプトファイルを作成し、以下のようなスクリプトを書く
    ScoreSumスクリプト(クリックして見る)
    using UnityEngine;
    using Unity.UI;
    
    //TextMeshProを使っている場合
    using TMPro;
    
    public class ScoreSum : MonoBehaviour
    {
    //ScoreManagerの変数を使うために宣言
    public ScoreManager scoremana;
    
    public TextMeshProUGUI scoreText;
    int itemcount = 0;
    int sum = 0;
    
    void Update()
    {
        //ScoreManager内の変数である"itemCount"の値を取得
        itemcount = scoremana.itemCount;
    
        //スコアの計算
        sum = itemcount * 500;
    
        //テキストを表示
        scoreText.text = "Score:" + sum;
    
    }
    }
    
    1. 以下のように設定する

    スクリーンショット (117)

    スクリーンショット (116)

    3. まとめ

    今回はHPとスコアを実装しました。特に最後のScoreSumにはUnityでよく使う、変数の受け渡しの書き方があるのですが、とりあえずは他のスクリプトの変数も取得できるんだ~くらいに覚えておくと良いと思います。

    次→
    第8回 - アニメーションさせよう【Unity講座2022】
    https://inct-densan.kibe.la/shared/entries/37dd02d7-d91f-4f21-b697-9868342fb877

    参考文献

    【Unity C#】ライフ(ヒットポイント)の作りかた - プログラミング教室 フタバゼミ
    https://futabazemi.net/unity/lifepoint