41
0
0
第7回 - HPとスコアを実装する!【Unity講座2022】
HPとスコアを実装する!
1. HPの実装
HPはバーや数字のみなど、様々な表現方法が有りますが、今回は画像1つを1ライフとして表現します。
1-1. 画面左上にHPを表示する
1. HPを表す画像を取り込む
今までに使ってきたAssetにHPを表すのにちょうど良い画像が無かったので、新しく画像を取り込みます。(見落としているだけだったらすみません)
- 以下の画像をダウンロードする。(それっぽく描いてみました)
画像を右クリック→「名前を付けて画像を保存」
- Assetフォルダ内に
Spritesというフォルダを作成する -
Asset/Spritesに先ほどの画像を移動する
エクスプローラーから画像ファイルをドラッグアンドドロップすることでAsset/Spritesに移動できます
2. ゲーム画面に画像を表示する
- Hierarchyウィンドウで右クリック→UI→Canvasを選択する

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

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

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

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

2. 敵に当たったらHPが減るようにする
-
C#ファイルを作成する
Assets / Scriptに「HPManager」というC#ファイルを作成します。
作成したら開いてください。 -
EnemySkeletonにEnemyというタグをつける -
以下のようなコードを記述する
ヒント
- HPを管理する変数をつくる。例ではlifeCountとする。
- Enemyに当たったらlifeCountを1減らす
- 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);
}
}
}
-
HPManagerをPlayerにアタッチする - アタッチした
HPManagerにLife1、2、3をドラッグアンドドロップする

- 実行してHPが減るか確認
※注意:今回はPlayerにHPManagerをアタッチしましたが、別にHPを管理するオブジェクトをつくると、PlayerをDestroyした時などにも処理が出来るようになります。次に行うスコアの実装が参考になると思うので挑戦してみてください。(要望があれば追記します。)
2. スコアの実装
スコアを実装します!スコアを加算する条件はいくつか思いつくと思いますが、今回はアイテムを取得したときに加算されるようにしてみます。
2-1. アイテムを実装しよう
-
Asset/Spritesに以下の画像を追加する
画像は以下を使用してください(さくらんぼ的なものを書きたかった…)↓
- アイテムの画像をHierarchyにドラッグアンドドロップして画面に表示させる
- "Item"というタグをつける
- 当たり判定をつける
- IsTriggerにチェックする
2-2. スコアを表示しよう
- 1-2で作成した
Canvasを選択した状態で、Textを作成する。名前は"ScoreText"とします。

-
ScoreManagerというC#スクリプトファイルを作成し、以下のようなスクリプトを書く
ヒント
- とったアイテム数を管理する変数をつくる。例ではitemCount とする。
- Itemに当たったらitemCountを1増やす
- 当たったアイテムを非アクティブにする
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);
}
}
-
ScoreManagerをPlayerにアタッチする -
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;
}
}
- 以下のように設定する


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