簡単な2Dシューティングゲーム作成の第5回目を進めていきます。今回は「スコア表示」と「ゲームの終了」を追加していきます。ゲームのベースが完成します。
はじめに
今回はPart5です、Part1は下記から
簡単なおさらいと今回やること
前回まで、「機体から弾が出る」ようにして、マトを作りました。今回は「スコア表示」と「ゲームオーバー」を作っていきます。
ゲーム作成開始
まずは「スコア(点数)表示」を作成していきます。
スコア表示の作成
スコア表示する場所を作成するので、「UI」→「Legacy」→「Text」を追加して名前をScoreにしておきます。
ゲーム画面の左上に表示するので位置、サイズなどを調整します。テキストの中身はスクリプトで変更するので仮設定です。
次にScriptフォルダ内で右クリック。ScoreManagerと言う名前で新規のC#ファイルを作成します。このスクリプトで「スコアを管理」していきます。
ScoreManagerの中身は下記のように変更します。SetScoreを読んだときに点数を加算してテキストの内容を書き換えています。
public class ScoreManager : MonoBehaviour
[ SerializeField ] private Text txtScore;
txtScore. text = "Score:" + Score. ToString () ;
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
[SerializeField] private Text txtScore;
private int Score = 0;
public void SetScore()
{
Score += 10;
txtScore.text = "Score:" + Score.ToString();
}
}
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
[SerializeField] private Text txtScore;
private int Score = 0;
public void SetScore()
{
Score += 10;
txtScore.text = "Score:" + Score.ToString();
}
}
このスクリプトをScoreManagerオブジェクトに追加して。TxtScore変数にScoreをセットします。
別クラスのメソッドを呼び出す
次に、弾がマトに当たった時に「ScoreManager」の「SetScore」が呼ばれるようにしていきます。
Targetスクリプトを下記のように変更します。他のクラス(別クラス)のメソッドを呼び出す方法はいくつかあるので、一例です。
public class Target : MonoBehaviour
private ScoreManager scoremanager;
private float speed = 1.5 f;
scoremanager = GameObject. Find ( "ScoreManager" ) . GetComponent < ScoreManager >() ;
private void FixedUpdate ()
transform. position -= new Vector3 ( 0 , speed, 0 ) * Time. fixedDeltaTime ;
private void OnTriggerEnter2D ( Collider2D collision )
if ( collision. CompareTag ( "Bullet" ))
else if ( collision. CompareTag ( "Player" ))
Destroy ( collision. gameObject ) ;
using UnityEngine;
public class Target : MonoBehaviour
{
private ScoreManager scoremanager;
private float speed = 1.5f;
private void Start()
{
scoremanager = GameObject.Find("ScoreManager").GetComponent<ScoreManager>();
}
private void FixedUpdate()
{
transform.position -= new Vector3(0, speed, 0) * Time.fixedDeltaTime;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Bullet"))
{
Destroy(gameObject);
scoremanager.SetScore();
}
else if (collision.CompareTag("Player"))
{
Destroy(collision.gameObject);
}
}
}
using UnityEngine;
public class Target : MonoBehaviour
{
private ScoreManager scoremanager;
private float speed = 1.5f;
private void Start()
{
scoremanager = GameObject.Find("ScoreManager").GetComponent<ScoreManager>();
}
private void FixedUpdate()
{
transform.position -= new Vector3(0, speed, 0) * Time.fixedDeltaTime;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Bullet"))
{
Destroy(gameObject);
scoremanager.SetScore();
}
else if (collision.CompareTag("Player"))
{
Destroy(collision.gameObject);
}
}
}
これで実際に動かしてみます。弾がマトに当たった時に10点づつスコアが加算されていればOKです。
ゲーム終了画面の作成
次にゲーム終了画面の作成をしていきます。
終了テキストの作成
「UI」→「Legacy」「Text」を追加して、名前をFinishにしておきます。位置やサイズ、テキストを変更して下記のような感じにします。
ScoreManagerのスクリプトを下記のように変更。Startで終了画面(終了テキスト)を無効に、スコアをリセット。GameOverが呼び出されたら終了画面を表示するようにしています。
public class ScoreManager : MonoBehaviour
[ SerializeField ] private GameObject gameover;
[ SerializeField ] private Text txtScore;
gameover. SetActive ( false ) ;
txtScore. text = "Score: " ;
txtScore. text = "Score: " + Score. ToString () ;
gameover. SetActive ( true ) ;
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
[SerializeField] private GameObject gameover;
[SerializeField] private Text txtScore;
private int Score = 0;
private void Start()
{
gameover.SetActive(false);
txtScore.text = "Score: ";
}
public void SetScore()
{
Score += 10;
txtScore.text = "Score: " + Score.ToString();
}
public void GameOver()
{
gameover.SetActive(true);
}
}
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
[SerializeField] private GameObject gameover;
[SerializeField] private Text txtScore;
private int Score = 0;
private void Start()
{
gameover.SetActive(false);
txtScore.text = "Score: ";
}
public void SetScore()
{
Score += 10;
txtScore.text = "Score: " + Score.ToString();
}
public void GameOver()
{
gameover.SetActive(true);
}
}
ScoreManagerオブジェクトの変数にFinishオブジェクトをセット。
Targetスクリプトを下記のように変更。タグを利用して場合分けしています。マトが弾にぶつかった場合はスコア更新、マトがプレイヤーに当たった場合はゲームオーバーです。
public class Target : MonoBehaviour
private ScoreManager scoremanager;
private float speed = 1.5 f;
scoremanager = GameObject. Find ( "ScoreManager" ) . GetComponent < ScoreManager >() ;
private void FixedUpdate ()
transform. position -= new Vector3 ( 0 , speed, 0 ) * Time. fixedDeltaTime ;
private void OnTriggerEnter2D ( Collider2D collision )
if ( collision. CompareTag ( "Bullet" ))
else if ( collision. CompareTag ( "Player" ))
Destroy ( collision. gameObject ) ;
using UnityEngine;
public class Target : MonoBehaviour
{
private ScoreManager scoremanager;
private float speed = 1.5f;
private void Start()
{
scoremanager = GameObject.Find("ScoreManager").GetComponent<ScoreManager>();
}
private void FixedUpdate()
{
transform.position -= new Vector3(0, speed, 0) * Time.fixedDeltaTime;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Bullet"))
{
Destroy(gameObject);
scoremanager.SetScore();
}
else if (collision.CompareTag("Player"))
{
Destroy(collision.gameObject);
scoremanager.GameOver();
}
}
}
using UnityEngine;
public class Target : MonoBehaviour
{
private ScoreManager scoremanager;
private float speed = 1.5f;
private void Start()
{
scoremanager = GameObject.Find("ScoreManager").GetComponent<ScoreManager>();
}
private void FixedUpdate()
{
transform.position -= new Vector3(0, speed, 0) * Time.fixedDeltaTime;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Bullet"))
{
Destroy(gameObject);
scoremanager.SetScore();
}
else if (collision.CompareTag("Player"))
{
Destroy(collision.gameObject);
scoremanager.GameOver();
}
}
}
試しに実行してみます。下記のように弾がマトに当たればスコアが更新され、機体(プレイヤー)にマトがぶつかるとゲームオーバーになればOKです。