音無サノトの空想録

4コマ漫画と創作日記

【ゲーム制作】イチから Unity の学びなおし ⑧玉転がしゲーム その7 テキストの追加

どうも音無サノトです(^^♪

週末のゲーム制作記事になります。前回はアイテムの取得処理を作ったので、今回は取得した数をゲーム内に表示します。

 

 

アイテムの取得数をカウントする

それではまず、アイテムを取得した際に、その数をカウントする処理を制作します。

PlayerContoller を以下のように変更します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerContoller : MonoBehaviour
{
    public float speed;

    private Rigidbody rb;
    private int count; // アイテムの取得数を格納する変数


    void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0; // 初期化
    }


    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);

    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            count = count + 1; // 衝突判定のイベントが発生した際に count の数を1上げる
        }
    }
}

 

それではコードの説明です。

まずアイテム数をカウントする変数を用意します。

f:id:otonasisanoto:20190427115231p:plain

その変数を Start() 関数内で初期化します。

f:id:otonasisanoto:20190427115326p:plain

アイテムを取得した際にカウントしたいので、OnTriggerEnter() 関数内のアイテム取得時の処理内にカウントする処理を追加します。

f:id:otonasisanoto:20190427115413p:plain

 

これでアイテムの取得数をカウントする処理が書けました。

 

取得数を表示する

アイテムの取得数を表示するためのテキストを用意します。

Unity には便利な UI 機能があるのでそれを利用します。

 

Hierarchy ウィンドウの Create から UI > Text を選択します。

f:id:otonasisanoto:20190427115756p:plain

 

するとテキストが追加されました。

f:id:otonasisanoto:20190427115908p:plain

Canvas の子オブジェクトに Text が自動で用意されます。

Unity の UI 要素は Canvas 内で管理するため、すべて Canvas の子オブジェクトにする必要があります。

EventSystem オブジェクトは Canvas のメッセージシステムとして利用するものです。

 

テキストを追加したら、名前を「Count Text」に、文字の色を白に、デフォルトのテキスト表示を「Count Text」に変更します。

f:id:otonasisanoto:20190427121006p:plain

 

次にテキストの表示場所を変更します。

Inspector ウィンドウの Rect Transform の下にあるアイコンをクリックして、Anchor Presets を表示します。そして左隅をクリックします。

Shift キーを押すと、画面のどのポジションに映るかが青い点で表示されます。Alt キーを押すと画面そのものがどの位置に表示されるかがわかります。

f:id:otonasisanoto:20190427121507p:plain

ゲームシーンの左隅にテキストが表示されます。

f:id:otonasisanoto:20190427122150p:plain

この状態だと、左隅に寄りすぎなので、ポジションを調整します。

f:id:otonasisanoto:20190427122352p:plain

いい感じの場所に表示されました。

f:id:otonasisanoto:20190427122432p:plain

 

次にテキストの表示をスクリプトで変更できるようにコードを追加します。

PlayerContoller に処理を以下のように変更します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // UnityEngine.UIクラスを使用できるように

public class PlayerContoller : MonoBehaviour
{
    public float speed;
    public Text countText; // カウントを表示するテキストを格納

    private Rigidbody rb;
    private int count;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText(); // CountTextの変更
    }


    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);

    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetCountText(); // CountTextの変更
        }
    }

    void SetCountText()
    {
        countText.text = "Count : " + count.ToString();
    }
}

 

それではコードの説明です。

まず using ステートメントを使って UnityEngine.UI クラスを使用できるようにします。

これは別の名前空間で定義されたクラスを利用する際に使用する C# の書き方です。別のところに用意された処理を使用したいときに、「ここで定義されている処理をつかうよ」と宣言しているイメージです。

f:id:otonasisanoto:20190427123830p:plain

 

それからカウントを表示するテキストを public で宣言しておきます。

f:id:otonasisanoto:20190427124145p:plain

それから処理が重複するので、一つの関数にまとめておきます。

一番下に以下の処理を用意しておきます。

f:id:otonasisanoto:20190427124236p:plain

先ほど、宣言したカウントを表示するテキストの表示を変更しています。

"Count : " という文字列に count の数値を String 型に変更してから連結しています。

count は Int 型で宣言されているので ToString() という処理を使って、 String 型にする必要があります。

プログラミングは変数の型か異なっていると処理に不具合が生じるので、型を統一する考えは非常に重要です。

 

そして、Start() 関数内と OnTriggerEnter() 関数内に、テキスト表示の変更処理を追加します。

f:id:otonasisanoto:20190427124612p:plain

f:id:otonasisanoto:20190427124626p:plain

 

Hierarchy ウィンドウで Player を選択し、Count Text のところにテキストオブジェクトをドラッグ&ドロップします。

f:id:otonasisanoto:20190427123520p:plain

 

実際にゲームを再生してアイテムを取得してみると、カウントの表示が変わるのが確認できます。

f:id:otonasisanoto:20190427123622p:plain

 

全部取得した際のテキストを表示する

 アイテムを全部取得した際に、ゲームをクリアしたことを伝えるテキストを表示しましょう。

先ほど、Count Text を追加したときと、同じように Hierarchy ウィンドウの Create から UI > Text を選択してテキストを追加します。

名前を「Win Text」、文字の大きさを24、文字の色を白、デフォルトの表示を「Win Text」に変更します。

f:id:otonasisanoto:20190427130101p:plain

ポジションをセンターにします。

f:id:otonasisanoto:20190427130140p:plain

 

それから文字の表示を真ん中にし、Y軸方向のポジションを調整します。

f:id:otonasisanoto:20190427130345p:plain


いい感じの位置に表示されるようになりました。

f:id:otonasisanoto:20190427130432p:plain


それでは、アイテムを全部取得した際にテキストを表示できるように PlayerContoller の処理を以下のように変更します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerContoller : MonoBehaviour
{
    public float speed;
    public Text countText;
    public Text winText; // 表示する文字列を格納する変数

    private Rigidbody rb;
    private int count;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
        winText.text = ""; // 文字列の初期化 
    }


    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);

    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetCountText();
        }
    }

    void SetCountText()
    {
        countText.text = "Count : " + count.ToString();
        if(count >= 12)
        {
            winText.text = "You Win!"; // 全部のアイテムを取得したら(12個配置していた場合)
        }
    }
}


処理の説明です。

まず、テキストを格納する変数を用意しています。

f:id:otonasisanoto:20190427131114p:plain

Start() 関数内で初期化しています。

f:id:otonasisanoto:20190427131139p:plain

先ほど用意した SetCountText() 関数内の処理に追加します。

f:id:otonasisanoto:20190427131224p:plain

if 文を使って count の数値を判定しています。

この場合、12個になったら「You Win!」という文字列を表示するようになっています。
if 文のところは Pick Ups の子オブジェクトの個数と比較する様に変更した方がプログラムとしてはよりいいコードになります。
そうすることで、アイテム数を増やしてもコードを変更する必要がないからです。

が、今回はチュートリアル通りにゲームを作って、全部終わった後に変更していきましょう。

 

コードを書いたら、Hierarchy ウィンドウで Player を選択して、Win Text をドラッグ&ドロップします。

f:id:otonasisanoto:20190427130817p:plain

 

ゲームを再生させて、全部のアイテムを取得したら「You Win!」が表示されることを確認しましょう。

f:id:otonasisanoto:20190427130925p:plain

 

これで一通りゲームっぽいものができました。

次回はチュートリアルの最後であるゲームのビルドを行います。ビルドとはプログラムをソフトにするって感じの意味です。

これをやればチュートリアルは終了なので、そこから少しこのゲームを改造していこうかなと思います。

 

本日は以上となります。最後まで読んでいただきありがとうございました!