スイカゲーム風「ベジタブルゲーム」の作り方、12回目の今回で最終回、今回は野菜が結合し、進化するタイミングで新開した野菜の場所からスコアを表示させるという演出を行います。
ユニティルーム サンプルの投稿ゲーム
12,スコア演出
12.1 スコアテキスト作成
Hierarchy上にあらたな Canvas と Text(TMP) を生成します。
生成したUI Canvas を Inspector から以下のように修正します。
❶ 名前: ScoreCanvas に指定 ❷ RectTransformコンポーネント Scale : X:0.01、Y:0.01 に指定 ❸ Canvasコンポーネント Render Mode : World Space を指定し、野菜と同じ次元に表示 Sorting Layer : FrontCanvas を指定し、最前面に表示
続いてText(TMP)を以下のように修正します。
❶ 名前: Text に指定 ❷ RectTransformコンポーネント Width:200、Height:100 程度に指定 ❸ TextMeshProコンポーネント ここは各自任意に指定して頂いて結構です。 フォントやOutLineの色は、進化した野菜の種類によって変化します。 Text : 「1234」など適当な値を入力 Font Asset : 任意のフォントを指定 Font Size : 80程度 Alignment : 縦横中央揃え ❹ Shader ここも任意の配色にします。 サンプルではOutlineを太くし、文字に立体感を出す演出をしています。 ここで指定した色は後ほどプログラムで修正します
12.2 スコアテキストのプログラム
スコアテキストは表示後、0.5秒程度その場にとどまって、その後上昇、徐々に薄くなり最後は消滅します。
まずはこの動きを作成します。[02_Scripts]フォルダに ScoreManager というスクリプトファイルを作成し、上の課題で作成した ScoreCanvas にアタッチしておきます。
ここで新たに使用する変数は以下の通りです。
変数名 | 型 | アクセス | 説明 |
scoreRT | RectTransform | private | RectTransform型の変数 |
sourceText | TextMeshProUGUI | private | TextMeshProUGUI型の変数 |
「ScoreManager.cs」を立ち上げて、NameSpaceにTMProを指定します。
ScoreManager.cs
using TMPro;
続いて変数の宣言と初期値の取得を行います。
ScoreManager.cs
RectTransform scoreRT; //RectTransform型の変数
TextMeshProUGUI scoreText; //TextMeshProUGUI型の変数
void Start()
{
scoreRT = GetComponent<RectTransform>(); //初期値を取得し代入
scoreText = GetComponentInChildren<TextMeshProUGUI>(); //初期値を取得し代入
}
続いて、スコアのテキストが2秒間上昇をしづ付け一旦停止、直後に1秒かけて徐々に薄くなって消滅するという動きを作成します。
同時に作成したコルーチンをStart()関数内で呼び出します。
ScoreManager.cs
IEnumerator FadeOut()
{
yield return new WaitForSeconds(0.5f); //出現後0.5秒その場に待機
for(int i = 0; i < 200; i++) //200回繰り返し
{
scoreRT.Translate(Vector3.up * 0.02f); //0.02ずつ上昇
yield return new WaitForSeconds(0.01f); //0.01秒待機
}
for (int i = 0; i < 20; i++) //20回繰り返し
{
scoreText.color -= new Color(0, 0, 0, 0.05f); //5%ずつ薄くなる
yield return new WaitForSeconds(0.05f); //0.05秒待機
}
Destroy(gameObject); //オブジェクトを削除
}
void Start()
{
//記述済みコード省略
StartCoroutine(FadeOut());
}
Hierarchy上の ScoreCanvas が上昇しテキストが徐々に薄くなって最後に消えるのが確認できたら、このオブジェクトを [03_Prefabs]フォルダ にドラッグ&ドロップでプレハブ化しておきます。
Hierarchy上のオブジェクトは不要なので、削除しておきましょう。
12.3 スコアテキスト生成プログラム
GameManagクラス にスコアを加算する関数 AddScore() が出来上がっているので、ここにスコアテキストを生成するプログラムを追加すればよさそうですね。
GameManagクラスで新たに使用する変数は1つだけです。
変数名 | 型 | アクセス | 説明 |
scorePrefab | GameObject | [SerializeField] | スコアのプレハブ |
変数の宣言を行います。
GameManager.cs
[SerializeField] GameObject scorePrefab; //スコアプレハブ
インスペクターから宣言した変数に、上の課題で作成しプレハブ化した ScoreCanvas をAssignします。
また、スコアが加算されたときの効果音も、新たに指定したいので2つ目の音源に 「進化1」 という効果音を追加します。
関数:AddScore() を以下のように修正します。
GameManager.cs
void AddScore(int n,Vector3 pos) //生成する場所を指定する引数:pos を追加
{
/*score += v_score[n];
scoreText.text = "Score:" + score; 記載済み */
source.PlayOneShot(crips[1]); //効果音を鳴らす
// scorePrefab を受け取った場所に生成、scoreObj という名前で変数化
GameObject scoreObj = Instantiate(scorePrefab, pos, Quaternion.identity);
//scoreObj の大きさを野菜の種類に応じて拡大
scoreObj.transform.localScale *= (0.8f + (float)n / 5);
//野菜の種類に応じて、scoreObjのテキストを更新
scoreObj.GetComponentInChildren<TextMeshProUGUI>().text = v_score[n].ToString();
//scoreObjの色を赤色にして scoreColor という名前で変数化
Color scoreColor = new Color(1,0,0); //赤
if (n < 4) scoreColor = new Color(0, 1, 1); //ピーマン以下ならシアン
else if (n < 6) scoreColor = new Color(0, 1, 0); //トマト、ナスなら緑
else if (n < 8) scoreColor = new Color(1, 1, 0); //ジャガ、玉ねぎなら黄色
else if (n < 10 ) scoreColor = new Color(1, 0.25f, 0); //ブロ、カリならオレンジ
else if (n < 12) scoreColor = new Color(1, 0, 0.4f); //キャベツ、かぼちゃならピンク
//scoreObjのOutlineColor を変数:scoreColor に指定
scoreObj.GetComponentInChildren<TextMeshProUGUI>().outlineColor = scoreColor;
}
引数が増えているので、この関数を呼び出す部分(関数:CreateVegetable())も修正します。
受け取ったVector3型の引数 : p をそのまま、AddScore()の第二引数に受け渡します。
GameManager.cs
public void CreateVegetable(int t, int v, Vector3 p)
{
//前半省略
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,p); //修正
}
}
これで、進化時に効果音が発生しスコアが表示されるプログラムが完成しました。
ここまでの記事で、このゲームの基本的な動き、演出が出来ています。
「VegetablGameの作り方」その他の記事はこちらから
サンプル作品にはさらに進化の状況演出、ゲームオーバー後のランキング表示、セーブ&ロード機能などが付加されています。これらの機能の追加やさらなる改造、またはその他オリジナル作品を作ってみたいというご希望があれば、ファイブボックスまでお問い合わせください。
ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments