今まで使ってきたDELLのPCが10年を超えたので、思い切って買い換えました。CPUも新しくなって快適です。
さて、今回はスコアを表示したいと思います。
スコアを表示する
スコアの入れ物を用意する
スコアを表示するには、スコアをどこかで保持しないといけません。そこでスコアの変数を用意します。StageManagerでもいいですが、ステージが増えたりすると困るので、GameDataというクラスを用意します。
public static class GameData
{
public static int score = 0;
}
static(静的)にすることで、GameDataのインスタンスを作らなくてもこの変数を使うことができます。さらに、publicですから、どのスクリプトからもスコアを参照したり変更したり出来ます。使い方は、以下の通りです。
GameData.score += 50;
これで、スコアが50点加算されます。簡単ですね。
publicを多用するのは、安全面では推奨されませんが、趣味のプログラミングの場合は、そこまで厳密にする必要もないでしょう。チームで開発する場合は、別の手段を執ると思います。
スコアの初期化
スコアの初期化はStageManagerで行いましょう。
void Start()
{
・・・
GameData.score = 0;
}
当たり判定
スコアを加算するのは、自機の弾が当たったときですから、まずは当たり判定です。弾と敵のどちらかに当たり判定をつけましょうか。今回は点数処理を簡単にするため、敵につけたいと思います。
protected void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Bullet"))
{
// Bulletに衝突した場合の処理
GameData.score += score; //敵に設定された点数を、スコアに加算する
Destroy(collision.gameObject); //衝突してきたオブジェクトを破棄する
Destroy(gameObject); //敵自身を破棄する
}
}
敵同士はレイヤーの設定で衝突判定が行われませんので、今回敵に当たったのは弾か自機なのですが、弾に当たった場合と自機に当たった場合で処理を分けたいと思います。collision.gameObject.CompareTag(“Bullet”)で、衝突したゲームオブジェクトにBulletというタグが付いていた場合に処理を行います。
ただし、まだ弾にはタグをつけていませんので、次の操作をします。
ゲームオブジェクトにタグを付ける

Bulletのプレハブを選択して、インスペクターでTagのの欄をクリックします。


ポップアップメニューが出るので、
を選びます。
TagsのListの
を押します。Listに追加するという意味です。

New Tag Nameの欄にBulletと入力して を押します。これで、BulletのプレハブにBulletというタグを付けることが出来ました。ゲームオブジェクトのタグを調べることで、処理対象のゲームオブジェクトを見分けることが出来ます。
同じようにして、自機のプレハブにもPlayerというタグを付けておきます。
自機と接触したときの処理を入れる
タグを付けたので、敵に当たったのが弾なのか自機なのかを判別することができるようになりました。そこで、処理を以下のように変更します。
protected void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Player")) //接触したのがPlayerだった場合
{
// Playerに衝突した場合の処理
Destroy(gameObject);
}
else if (collision.gameObject.CompareTag("Bullet")) //接触したのがBulletだった場合
{
// Bulletに衝突した場合の処理
GameData.score += score;
Destroy(collision.gameObject);
Destroy(gameObject);
}
}
弾が当たった場合は、敵の点数を加算します。自機が当たった場合は、敵を消すだけにします。まだ、自機は無敵モードですね。
点数を表示できるようにする
TEXTを配置する

ヒエラルキーを右クリックするとポップアップメニューが出ます。そこからCanvasをダブルクリックすると、UI画面が出てきて、Textが真ん中に表示されていると思います。これを左上に移動させておきます。さらにUIのTextを追加して、名前をSCOREに変えます。
→ → の順に選びます。
一つ目のTextには、SCOREと入力します。
二つ目(SCORE)のTextは空欄にしておきます。どちらのテキストも位置を調整して、フォントサイズを36にして色を白に変えました。

テキストボックスをスクリプトから操作する準備
SCOREと名付けたテキストボックスをスクリプトから操作するために、仕組みを作ります。
public class StageManager : MonoBehaviour
{
public GameObject Player;
public GameObject Enemy01;
public GameObject Enemy02;
public GameObject Enemy03;
public GameObject Enemy04;
public GameObject[] Enemy;
public Text ScoreText; // <ーー追加
StageManager.csに上の一行を追加すると、ヒエラルキーで を選んだときに、 という欄が現れます。

そこに、ヒエラルキーのStageManager.csの中の と画面上の が結びつき、StageManager.csの中で の表示内容を変更できるようになります。
をドラッグします。そうすることで、ScoreText.text = GameData.score.ToString();
StageManager.csの中にこのように記述すると、GameDataの中のscoreという変数が表示されるようになります。これをどこに記述するかという話ですが、Update関数の中に記述することにします。そうすることで、scoreに変更があると即座に表示も変更されるからです。また、GameDataの中のscoreという変数はint型なので、ScoreText.textに代入するためにToString()で文字列型に変換します。
これで、画面上部にスコアが表示されるようになりました。

今回はここまでです。ちょっと長かったですね。お疲れ様でした。
コメント