【unity】プレイヤーHP(体力) を作って表示させて敵に当たったら減らす

前回の記事
www.momino1234.com


HPを作る


HPを画面に表示します。
一番簡単な方法は UI Textを使う方法です。

HP表示用のUIを作る

Hierarchyで

右クリック

UI

Text - TextMeshPro

をクリック

もし

TMP Importer

が出たら

Import TMP Essentials

を押します。

名前を変える

Hierarchy欄で

Text (TMP)

をHPTextに変更

文字を変える

Inspectorで

Text Input

HP: 3

にします。

HP表示スクリプトを作る

Assetsで

右クリック

Create

Empty C# Script

名前を

HPUI

コードを書く


  1. using UnityEngine;
  2. using TMPro;
  3. public class HPUI : MonoBehaviour
  4. {
  5.     public PlayerMove player;
  6.     public TextMeshProUGUI hpText;
  7.     void Update()
  8.     {
  9.         hpText.text = "HP: " + player.hp;
  10.     }
  11. }

UIにスクリプトを付ける

Hierarchyで

HPText

をクリック

Add Component

HPUI


Inspectorの

HPUI(Scripts)の項目に

Player
HP Text

が出ます。

そこに

Hierarchyの欄の

Playerと

HPTextを

をドラッグします。

敵に当たったら減らす

PlayerMoveスクリプトを開きます

public GameObject bulletPrefab;の下に


  1. public int hp = 3;

を追加する

敵に当たったらHPを減らす


void OnCollisionEnter2D(Collision2D collision)
{ の下に


  1.     if (collision.gameObject.name == "enemy")
  2.     {
  3.         hp -= 1;
  4.         Debug.Log("HP: " + hp);
  5.         if (hp <= 0)
  6.         {
  7.             Debug.Log("ゲームオーバー");
  8.             Destroy(gameObject);
  9.         }
  10.     }

を追加

タグをつける

PlayerMove(Scripts)を開きます

if (collision.gameObject.name == "enemy")の部分を

if (collision.gameObject.CompareTag("Enemy"))に置き換えます


敵をクリック

Hierarchy欄で

Enemy

オブジェクトをクリックします。

Inspectorの項目に

👇

Tag
Untagged

があります

Tagを追加

Tag

Add Tag...

をクリック

新しいタグを作る
  1. を押して

Enemy

と入力

敵にタグをつける

もう一度

Enemyオブジェクト

Tag

Enemy

を選びます。

AssetsのEnemyのタグも変更

AssetsのEnemyのタグも同様に変更してください。


これでコードが動きます
if (collision.gameObject.CompareTag("Enemy"))
{
hp -= 1;
}

なぜTagを使うのか

「名前」だと問題が起きます👇

Enemy
Enemy(Clone)
Enemy1

全部違う名前になります。

でも「タグ」なら

Enemy

で 全部まとめて判定できます。


再生


敵に当たると

HP: 2
HP: 1
HP: 0
ゲームオーバー

そして プレイヤーが消えます。

もしエラー表示がでたら

もしこれで

MissingReferenceException: The object of type 'UnityEngine.Transform' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.Object+MarshalledUnityObject.TryThrowEditorNullExceptionObject (UnityEngine.Object unityObj, System.String parameterName) (at <6a469c5cf96a43eab23a293167261e20>:0)
UnityEngine.Bindings.ThrowHelper.ThrowNullReferenceException (System.Object obj) (at <6a469c5cf96a43eab23a293167261e20>:0)
UnityEngine.Transform.get_position () (at <6a469c5cf96a43eab23a293167261e20>:0)
CameraFollow.Update () (at Assets/CameraFollow.cs:9)

このエラーが出た場合、


エラーの意味はこれです👇

MissingReferenceException
Transform が Destroy されたのにまだ使おうとしている

ログを見ると

CameraFollow.Update ()
Assets/CameraFollow.cs:9

つまり CameraFollowスクリプトが原因です。

おそらくコードはこうなっています👇


  1. public Transform player;
  2. void Update()
  3. {
  4.     transform.position = new Vector3(player.position.x, player.position.y, -10);
  5. }

でも プレイヤーがゲームオーバーで Destroy されるので

Destroy(gameObject);

player が存在しない

CameraFollow が player.position を読もうとする

エラー

になります。

解決方法(簡単)

CameraFollow をこう直します👇

  1. using UnityEngine;
  2. public class CameraFollow : MonoBehaviour
  3. {
  4.     public Transform player;
  5.     void Update()
  6.     {
  7.         if (player != null)
  8.         {
  9.             transform.position = new Vector3(player.position.x, player.position.y, -10);
  10.         }
  11.     }
  12. }

これで

player が消えたら

カメラは何もしない

エラー出ない

になります。

次の記事
www.momino1234.com