スイカゲーム風「ベジタブルゲーム」の作り方、前回までの記事で一連のゲームのフローが完成しています。今回からは演出関連の機能を追加していきましょう。まずはスコアの管理から。
ユニティルーム サンプルの投稿ゲーム
7,スコア管理
7.1 スコア表示UI
まずはスコアを表示するためのUIを用意します。
今回は表現の幅が豊富なTextMeshProを使用してみます。
作成済みのCanvasの配下で、UI ⇒ TextTextMeshPro を選択します。TMP Importer が立ち上がり、TMP Essential、及び TMP Essential & Extras のインポートが促されるので、ともにインポートしておきます。
取り込んだTextを以下のように修正します。
❶ 名前:ScoreText に指定 ❷ RectTransformコンポーネント AnchorPreset:Top-Left に指定し左上に基準点を置く PosX:500,PosY:-80 Width:600、Height:200 ❸ TextMeshProコンポーネント Text:「Score:999999」などとサンプル文字を代入 FontAsset: 任意のフォントを指定 FontSize: 任意の大きさを指定 Alignment:横位置:左寄せ、縦位置:中央 ❹ ElectricHi Highway Sighn これも任意で色の装飾を行います。
7.2 スコア更新プログラム
スコアは野菜が進化したタイミングで加算します。また大きい野菜程高い得点が加算されるようにします。このスコアは GameManagerクラス で管理したいと思います。ここで新たに使用する配列、変数を確認します。
配列名 | 型 | アクセス | 説明 |
v_Score | int | public | 進化時のスコア(13個) |
また使用する変数は以下の通りです。
変数名 | 型 | アクセス | 説明 |
score | int | private | スコアを管理する変数 |
scoreText | TextMeshProUGui | private | TextMeshProを管理する変数 |
まずは GameManagerクラス のNameSpceにTextMeshProを使用するための宣言を行います。
gameManager.cs
using UnityEngine.UI;
続いて変数、配列の宣言と初期値の指定、取得を行います。
gameManager.cs
public int[] v_score = new int[13]; //野菜の大きさを管理する配列
int score; //Scoreを管理する変数
TextMeshProUGUI scoreText; //Scoreを表示するUI
void Start()
{
//記述済みコード省略
//スコア配列に得点を代入
v_score = new int[] {0, 1, 2, 4, 8, 16, 32, 64, 150, 400, 1000, 3000, 10000 };
scoreText =GameObject.Find("ScoreText").GetComponent<TextMeshProUGUI>();
}
配列:v_Score[] に入れたScoreの値は、その野菜に進化したときに発生するスコアです。
この値はサンプルなので、各自任意の値を指定してみましょう。
12個目の「かぼちゃ」が進化したときのプログラムはまだ作成していませんが、スコアだけ用意しておきたいので、v_Score[] の要素数は13個にしています。
続いてスコア加算のプログラムを作成します。
gameManager.cs
void AddScore(int n) //引数を受け取ってスコアを加算する関数
{
score += v_score[n]; //scoreにv_score[]のn番目の値を加算
scoreText.text = "Score:" + score; //UIを更新
}
作成した関数を呼び出します。CreateVegetable(int t, int v, Vector3 p)関数 で進化生成のタイミングで、引数:v をそのまま渡して呼び出します。
gameManager.cs
public void CreateVegetable(int t, int v, Vector3 p)
{
if (v == 12)
{
//GameObject meat= Instantiate(meatPrefab, p, Quaternion.identity); 記述済み
//meat.GetComponent<SpriteRenderer>().sprite = neatImg[Random.Range(0, 3)]; 記述済み
AddScore(v); //AddScore()関数を呼び出す
//return; 記述済み
}
/*
GameObject vege = Instantiate(v_Prefab[v], p, Quaternion.identity);
VegetableManager vm = vege.GetComponent<VegetableManager>();
vm.index = v;
if (t == 0)
{
vm.type = VegetableManager.MOVETYPE.NEXT;
vege.GetComponent<CircleCollider2D>().enabled = false;
vege.transform.SetParent(tray.transform);
} 上記記述済み*/
else if (t == 1)
{
/*vm.type = VegetableManager.MOVETYPE.STAY;
vege.transform.localScale = Vector3.one * v_size[v];
vege.transform.SetParent(vegetables.transform);
vege.GetComponent<Rigidbody2D>().AddForce(Vector2.up * 80); 記述済み*/
AddScore(v); //AddScore()関数を呼び出す
}
}
スコアが加算されているのを確認してください。
最後に開始時のスコアが正しく表示されていないので、Start() 関数内で初期値を指定します。
gameManager.cs
void Start()
{
scoreText.text = "Score:0";
}
これでスコアが正しく表示されるようになりました。
「VegetablGameの作り方」その他の記事はこちらから
ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comentarios