Unityで簡単なシューティングゲームを作る[7]
Step7:スコアを更新する
シャボン弾で敵を倒すことができるようになったので、今度は敵を倒した時にスコアが更新されるようにしていく。
※このサイトのチュートリアルはとりあえず自力でゲームを作ってみることを目的としているため、プログラム言語に関する解説部分はかなり大雑把で意訳気味です。プログラム言語(C#)について正しく、詳しく学びたい方は、入門書やUnityの解説サイトなどをご参考にしていただけたらと思います。また、このサイトはコピープロテクトをかけているため、画面上からスクリプトのコピペができません。「スクリプトはこちら」というリンクからテキストファイルを表示して使ってください。面倒くさくてすみません。
スコアのテキストを配置する
まずステージ上に、スコアのテキストを表示するための場所を作る。ヒエラルキーリストの「+」から「UI」を選択し「Text」を作成。
すると、ヒエラルキーリストに「Canvas」が作成され、その下の階層に「Text」が生成される。ヒエラルキーリスト内に「Event System」という項目も生成される。これは必要なものなのでそのままおいておく。
「Text」の名前をわかりやすいように「Score」と変更し、インスペクタを下記のように設定する。
Anchor Presets:right top(右上)
Position(位置)X:-100,Y:-30,Z:0
Font Size(文字の大きさ)25
Color(文字の色):白
ゲームビューに切り替えて表示を確認する。「Score」のインスペクタの値を変えることでフォントサイズや色、配置場所などを変更することができるので、お好みの設定で。
スコアをつけるスクリプトを作成する
スコアを表示するための場所はできたので、今度はそこに、敵を倒すとスコアを更新するスクリプトを作成する。プロジェクトビューの「Assets」メニューの「Create」から「C# Script」でファイルを作成し、ファイル名を「GameSystem」とつける。今後ゲームのシステムに関するスクリプトはここに追記していく。
ダブルクリックでファイルを開き、以下のスクリプトを記載する。スクリプトはこちらから。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameSystem : MonoBehaviour { int score = 0; GameObject scoreText; public void AddScore(){ this.score += 1; } void Start () { this.scoreText = GameObject.Find ("Score"); } void Update () { scoreText.GetComponent().text = "Score:" + score.ToString("D4"); } }
簡単にスクリプトを説明。まず最初の
using UnityEngine.UI;
の部分では、Unityに標準装備されているC#のキットのうち、文字やボタンを配置するのに使うキットを使いますよと宣言している。今回は画面上にテキストでスコアを表示するため、この宣言が必要。
public void AddScore(){ this.score += 1; }
このAddScoreという関数でスコアの更新を行なっている。
void Start () { this.scoreText = GameObject.Find ("Score"); }
続くStart関数では、ステージに配置したオブジェクト「Score」をみつけるよう命令を出している。
void Update () { scoreText.GetComponent().text = "Score:" + score.ToString("D4"); }
そして、Update関数の中で、オブジェクト「Score」の中に何を代入するかを命令している。ここでは”Score:”というテキストの後にスコアを代入するよう指示している。
スクリプトをアタッチする
スクリプトができたら保存し、ステージ上の「Canvas」にアタッチする。
ゲーム ビューで動作確認をすると、右上に「Score:0000」と表示されるようになった。しかし、敵を倒してもスコアは更新されない。スコアを更新する「Add関数」が衝突のタイミングで呼び出されていないためである。
そこで、敵を倒した時=オブジェクト同士がぶつかった時に「Add関数」を呼び出すという命令を記述する。オブジェクト同士がぶつかった時の処理を記述しているのは「BulletController」なので、そこに以下の赤字の部分を追記する。スクリプトはこちらから。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletController : MonoBehaviour {
void Update () {
transform.Translate (0, 0.2f, 0);
// ステージの外に出たら弾を消す
if (transform.position.y > 5) {
Destroy (gameObject);
}
}
void OnTriggerEnter2D(Collider2D coll) {
// 衝突した時にオブジェクトを消す
Destroy (coll.gameObject);
Destroy (gameObject);
// 衝突した時にスコアを更新する
GameObject.Find ("Canvas").GetComponent ().AddScore ();
}
}
オブジェクト同士が衝突した時の処理を命令しているOnTriggerEnter2D(Collider2D coll)に、AddScore関数を呼び出す命令を追記する。
GameObject.Find ("Canvas").GetComponent().AddScore ();
日本語でいうと、ステージの「Canvas」にアタッチされているC#スクリプト「GameSystem」の中に記述してある「AddScore関数」を呼び出して、という感じ。
動作確認をする
スクリプトを保存したらゲームビューに切り替え動作確認を行う。
敵を倒すとスコアが更新されるようになった。さらにゲームっぽくなってきたが、このままでは際限なくいつまでもプレイできてしまう。ゲームには終わりが必要だ。そこで次はStep8:ゲームオーバーの設定を行う。
★チュートリアル一覧
2020.6.3投稿