Unityで作る「シューティングゲーム」Vol.12

Unityで作る「シューティングゲーム」。
前回で複数体の敵が出現したので、今回は敵を倒すたびにスコアを加算し、画面上にスコアを表示する仕組みを作っていきます。

では早速作っていきましょう。

1,UIテキストの準備

スコアを表示させる仕組み「UI」(User Interface)によって実現します。
まずはその素材を準備します。

①Hierarchy に新たなオブジェクトを追加します。「UI」から一番上の「Text」を選択しましょう。

Unityで作る「シューティングゲーム」Vol.12

②1つオブジェクトを追加しただけなのに、いくつかの付属品がついてきます。「UI」の素材は「Canvas」というオブジェクトの配下の子要素として配置されます。取得した「Text」は名前を「Score_Text」にリネームしておきます。
また、「EventSystem」というオブジェクトも追加されたようです。これは「UI」の動きを管理するシステムなので、消さないでくださいね。

Unityで作る「シューティングゲーム」Vol.12

「Score_Text」の情報を修正していきます。Inspectorで以下のように変更します。
③「Rect Transform」コンポーネントではテキストの場所と大きさを指定します。まず左上のアンカーアイコンを選択し、アンカーの場所を縦位置[top]、横位置[center] に指定します。アンカーというのは、基準位置のことです。今回は上部の中央を基準に場所を指定します。
④[ PosX ] に300 ⇒ 上で指定した横位置[center] からx座標方向に 300 だけ(右に)移動した場所[ PosY ] に-50 ⇒ 縦位置[ top ]からy座標方向に-50(下方向に)移動した場所さらに[ Width ] (横幅)を 200 、[ Height ] (高さ)を30を指定します。

Unityで作る「シューティングゲーム」Vol.12

⑤「Text」コンポーネントでは以下のパラメーターを指定します。
[ Text ]:実際に表示させるテキストです。ゲーム中に値を更新しますが、大きさ当を確認するために「 Score:0」などと入れておきます。
[ FontSize ]:名前の通りフォントサイズです。20にしておきます。なお、この大きさで表示されるテキストが、④で指定した幅、高さを超えると、テキストが全く表示されなくなります。
[ Alignment ]:テキストの配置位置です。縦、横ともに中央寄せにしておきます。
[ Color ]:名前の通りカラーですね。好きな色を指定してください。手本では薄いグレーを指定しておきました。

Unityで作る「シューティングゲーム」Vol.12

それではこの状態で起動させてみてください。それぞれの位置、大きさ、色などは各自好みによって調整してみましょう。

Unityで作る「シューティングゲーム」Vol.12

2,UIをコントロールするプログラムの作成

作成したUIですが、スコアが加算されるたびに更新しなければなりません。
ここではそのプログラムを作っていきます。
[ GameManager.cs ] にその役割を任せたいと思います。
[ GameManager.cs ] を起動し、以下のコードを追加してください。

[SerializeField] Text scoreText;   //❶Score_Text オブジェクトを入れる変数
static int score = 0;              //❷スコアを入れる変数

void Start()
{
    scoreText.text = "Score:"+score.ToString();     //❸スコアテキストを更新
}

//スコア加算関数
public void AddScore(int s)
{
    score += s;                                     //❹スコアを加算
    scoreText.text = "Score:" + score.ToString();   //❺ ❸と同じ
}

とても簡単なプログラミングですよね?

❶ まずは今回準備したテキストを使うために、[SerializeField]を指定して Text型の 変数:[ scoreText ] を用意します。
後でエディタのInspectorから「Score_Text」をセットします。

❷ 実際にスコアとなるint型(整数型)の 変数:[ score ]を宣言します。
ポイントは修飾子に[ Static ] を指定していること。
ここでは詳しい説明は省略しますが、この[ Static ] を指定することで、シーン間を超えても同じ変数を使うことができ、さらに変数は値を持ち続けることができます。
つまり、ステージ2,ステージ3・・・と進んでいってもスコアは更新され続ける、というもの。
ゲームでは当たり前のように見えますが、普通の変数を使ってしまうと、これが実現できないんです。
ただし使用するときにちょっとしたポイントがあります。これは随時解説していきます。

❸ まずStart関数で「Score_Text」のデータを更新します。
変数:score は「int型」の変数、Textに入れられる文字は「string型」ということで、score をstring型に変換する必要があります。
これを「キャスト」といいます。
C#では「 ToStoring() 関数」を使って、int型をstring型にキャストします。
さらに文字列の結合を使って、Textに値を代入しています。
AddScore(int s)関数 は引数を与えて スコアを加算する関数です。
他のクラスから参照させますので、アクセス修飾子に「Public」を指定します。

❹ score += s; これは引数で受け取った値分だけ、変数:score に加算するというコードですね。

❺ ここでは❸と同じプログラムを追加して、スコアテキストを更新します。

これでGameManager.cs の改造はOKです。
続いてここで作成した関数:AddScore(int s) を使う側の改造を行います。
使う側はどのクラスかというと、Enemy1Controller ですね。
敵が倒される際に加算していく、というのが基本の動きになりそうです。

では「 Enemy1Controller.cs 」を立ち上げて、以下のように改造していきましょう。

GameManager gameManager;     //❻GameManager

void Start()
{
    hp = 3;                                  //記述済み
    shot_speed = 800;                        //記述済み 
    enemyRd2d = GetComponent<Rigidbody2D>(); //記述済み 
    StartCoroutine(Move0(appPos));           //記述済み 
    StartCoroutine(Shot());                  //記述済み
    gameManager = GameObject.Find("GameManager").GetComponent<GameManager>(); //❼gameManagerを取得
}

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.tag == "Projectile" && IsMove)
    {
        Destroy(collision.gameObject); //記述済み
        hp--;                          //記述済み 
        if (hp == 0)                   //❽ ==にしておきます
        { 
            GameObject effect=Instantiate(explosion, transform.position, transform.rotation); //記済 
            Destroy(effect, 1.5f); //記述済み 
            Destroy(gameObject); //記述済み 
            gameManager.enemyCount--;  //❾EnemyCountを減算 
            gameManager.AddScore(100); //➓スコア加算 
        }
    }
}

長いように見えますが、もう記述済みの部分が多くあります。
重複しないように気を付けながら記述していきましょう。

❻ このクラスから、GameManagerクラスにアクセスして、関数や変数を使います。
GameManagerクラスの内容を保存するための 「変数:gameManager」を宣言。

❼ ❻で宣言した変数にデータを入れるためのコードです。
ます Find()関数 で「GameManager」という名前のオブジェクトを探してきます。
そこから GetConponent()関数 で「GameManager」クラスを取得し、変数:gameManager に代入。
「GameManager」という名前がいっぱい出てきますが、それぞれ役割が違うので、間違わないようにしましょう。

❽ ここは修正です。変更前は「hp <= 0」でした。
この場合、左右のバレットから弾が発射され、同時に2発当たった時、HPは1発目「1⇒0」2発目「0⇒-1」 と変化してしまう可能性があります。
つまり、内部の処理を2回繰り返してしまうことになりますので、「hp==0」つまりHPが0になった時だけ、というプログラムに変更します。

❾ gameManager.enemyCount–;
前回作成した「変数:EnemyCount」を1ずつ減算します。

➓ gameManager.AddScore(100);
今回作成したAddScort()関数を発動します。
引数に100を与えることで、敵を倒したらスコアに100点が加算されるという内容になります。

これで今回のプログラミングは完成です。実際に動かしてみて、スコアが変化していくのを確認してみましょう!

教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。

無料体験授業 いつでも受け付けています!

体験授業を受ける子供

スクラッチ、Unityでちょっとしたゲームを作ってみる

HTMLやCSSでWebサイト作成体験

初めてパソコンやタブレットに触れてみる

エクセルやワード、パワーポイントの学習をちょっと体験

まずは1時間程度の無料体験授業を受けて、教室の雰囲気や講師の人柄に触れて頂き、ご自身、お子様に合うのかどうかご確認ください!