Unityで作る「シューティングゲーム」。前回で複数体の敵が出現したので、今回は敵を倒すたびにスコアを加算し、画面上にスコアを表示する仕組みを作っていきます。
では早速作っていきましょう。
1,UIテキストの準備
スコアを表示させる仕組み「UI」(User Interface)によって実現します。まずはその素材を準備します。
①Hierarchy に新たなオブジェクトを追加します。
「UI」から一番上の「Text」を選択しましょう。
②1つオブジェクトを追加しただけなのに、いくつかの付属品がついてきます。
「UI」の素材は「Canvas」というオブジェクトの配下の子要素として配置されます。
取得した「Text」は名前を「Score_Text」にリネームしておきます。
また、「EventSystem」というオブジェクトも追加されたようです。これは「UI」の動きを管理するシステムなので、消さないでくださいね。
「Score_Text」の情報を修正していきます。Inspectorで以下のように変更します。
③「Rect Transform」コンポーネントではテキストの場所と大きさを指定します。
まず左上のアンカーアイコンを選択し、アンカーの場所を縦位置[top]、横位置[center] に指定します。
アンカーというのは、基準位置のことです。今回は上部の中央を基準に場所を指定します。
④[ PosX ] に300 ⇒ 上で指定した横位置[center] からx座標方向に 300 だけ(右に)移動した場所
[ PosY ] に-50 ⇒ 縦位置[ top ]からy座標方向に-50(下方向に)移動した場所
さらに[ Width ] (横幅)を 200 、[ Height ] (高さ)を30を指定します。
⑤「Text」コンポーネントでは以下のパラメーターを指定します。
[ Text ]:実際に表示させるテキストです。ゲーム中に値を更新しますが、大きさ当を確認するために「 Score:0」などと入れておきます。
[ FontSize ]:名前の通りフォントサイズです。20にしておきます。
なお、この大きさで表示されるテキストが、④で指定した幅、高さを超えると、テキストが全く表示されなくなります。
[ Alignment ]:テキストの配置位置です。縦、横ともに中央寄せにしておきます。
[ Color ]:名前の通りカラーですね。好きな色を指定してください。手本では薄いグレーを指定しておきました。
それではこの状態で起動させてみてください。
それぞれの位置、大きさ、色などは各自好みによって調整してみましょう。
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 の中身を取得する
gameManager = GameObject.Find("GameManager").GetComponent<GameManager>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Projectile" && IsMove)
{
Destroy(collision.gameObject); //記述済み
hp--; //記述済み
if (hp == 0) //⑦2発当たる場合があるので、ここは==にしておきます
{
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点が加算されるという内容になります。
これで今回のプログラミングは完成です。
実際に動かしてみて、スコアが変化していくのを確認してみましょう!
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.01~Vol.10 は下のVol.11 文末のリンクからどうぞ
Comments