ファイブボックスVegetableゲームの作り方、サムネイル画像

スイカゲーム風「ベジタブルゲーム」の作り方、12回目の今回で最終回、今回は野菜が結合し、進化するタイミングで新開した野菜の場所からスコアを表示させるという演出を行います。

ユニティルーム サンプルの投稿ゲーム

ファイブボックス作成 スイカゲーム風、ベジタブルゲームイメージ画像

「ベジタブルゲームの作り方」その他の記事はこちらから

スコア演出

スコアテキスト作成

Hierarchy上にあらたな CanvasText(TMP) を生成します。

スコア素材の準備の説明画像

生成したUI Canvas を Inspector から以下のように修正します。

  1. 名前ScoreCanvas に指定
  2. RectTransformコンポーネント
      Scale : X:0.01、Y:0.01 に指定
  3. Canvasコンポーネント
      Render Mode : World Space を指定し、野菜と同じ次元に表示
      Sorting Layer : FrontCanvas を指定し、最前面に表示

スコア素材の設定方法説明画像

続いてText(TMP)を以下のように修正します。

  1. 名前: Text に指定
  2. RectTransformコンポーネント
      Width:200、Height:100 程度に指定
  3. TextMeshProコンポーネント
      ここは各自任意に指定して頂いて結構です。
      フォントやOutLineの色は、進化した野菜の種類によって変化
      Text : 「1234」など適当な値を入力
      Font Asset : 任意のフォントを指定
      Font Size : 80程度
      Alignment : 縦横中央揃え
  4. Shader
      ここも任意の配色にします。
      サンプルではOutlineを太くし、文字に立体感を出す演出
      ここで指定した色は後ほどプログラムで修正
スコア素材 テキストコンポーネントの設定

スコアテキストのプログラム

スコアテキストは表示後、0.5秒程度その場にとどまって、その後上昇、徐々に薄くなり最後は消滅します。

まずはこの動きを作成します。[02_Scripts]フォルダに ScoreManager というスクリプトファイルを作成し、上の課題で作成した ScoreCanvas にアタッチしておきます。

ここで新たに使用する変数は以下の通りです。

変数名アクセス説明
scoreRTRectTransformprivateRectTransform型の変数
sourceTextTextMeshProUGUIprivateTextMeshProUGUI型の変数

「ScoreManager.cs」を立ち上げて、NameSpaceにTMProを指定します。

using TMPro;

続いて変数の宣言と初期値の取得を行います。

RectTransform scoreRT;          //RectTransform型の変数
TextMeshProUGUI scoreText;      //TextMeshProUGUI型の変数

void Start()
{
    scoreRT = GetComponent<RectTransform>();    //初期値を取得し代入
    scoreText = GetComponentInChildren<TextMeshProUGUI>();   //初期値を取得し代入
}

続いて、スコアのテキストが2秒間上昇をしづ付け一旦停止、直後に1秒かけて徐々に薄くなって消滅するという動きを作成します。

同時に作成したコルーチンを Start()関数 内で呼び出します。

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上のオブジェクトは不要なので、削除しておきましょう。

スコアテキスト生成プログラム

GameManagクラス にスコアを加算する関数 AddScore() が出来上がっているので、ここにスコアテキストを生成するプログラムを追加すればよさそうですね。

GameManagクラスで新たに使用する変数は1つだけです。

変数名アクセス説明
scorePrefabGameObject[SerializeField]スコアのプレハブ

変数の宣言を行います。

[SerializeField] GameObject scorePrefab;  //スコアプレハブ

インスペクターから宣言した変数に、上の課題で作成しプレハブ化した ScoreCanvas をAssignします。

また、スコアが加算されたときの効果音も、新たに指定したいので2つ目の音源に 「進化1」 という効果音を追加します。

スコアオブジェクトの生成方法

関数:AddScore() を以下のように修正します。

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() の第二引数に受け渡します。

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);  //修正
    }
}

これで、進化時に効果音が発生しスコアが表示されるプログラムが完成しました。

サンプル作品にはさらに進化の状況演出、ゲームオーバー後のランキング表示、セーブ&ロード機能などが付加されています。これらの機能の追加やさらなる改造、またはその他オリジナル作品を作ってみたいというご希望があれば、ファイブボックスまでお問い合わせください。

ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

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

体験授業を受ける子供

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

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

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

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

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