Unityの学習 part4

今回でボール遊びは最終となります
次回からは、また別のプロジェクトで学習を続けていきます

前回でキューブに触れて通過できるようにしました
今回は
キューブが消える時に得点を加算する
得点を表示するテキストを追加する
クリアした時に表示するテキストを追加する
クリア状態でスペースボタンを押すと再スタートする
ことを実装していきます

スコアテキストの追加

テキストはGameObject > UI > Textで追加することができます
追加したテキストオブジェクトは「ScoreText」としておきます
addText

Rect Transformの左側にある、四角で囲ってある部分をクリックすると以下のようなものがでてきます
これでカメラから見た、テキストの大体の位置を簡単に設定することができます
anchor

左上に持っていくにはAltを押しながら、左上のアンカーを押すことで設定できます
あとはPosXやPosYで微調整していい感じの位置に設定しましょう

では、スクリプトでキューブに接触した際にスコアを加算、表示の更新をするようにしていきます

まずはクラス変数として、テキスト、キューブ1つにつき何点つけるか、現在キューブをいくつ取得したかを表す変数を追加します
これは、Textはスクリプトの外から設定、scoreRatioも同様に設定するのでSerializeFieldをつけます

    [SerializeField]
    private Text scoreText;
    [SerializeField]
    private int scoreRatio;
    private int cnt;

 

カウントの変数はスタート時に初期化します

    private void Start()
    {
        cnt = 0;
    }

 

次に、キューブに接触した時にカウントを進めて、テキストを更新します

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Item"))
        {
            cnt++;     
            scoreText.text = "Score:" + (cnt * scoreRatio);
        }
    }

 

このまま進めたのであれば、実行できませんので、Unityの画面にもどってテキストの適用とスコアレシオの設定をします
script

スコアテキストの部分には、テキストのオブジェクトをドラッグ&ドロップします
スコアレシオの部分には、加算したいスコアを入れます(私の場合、10)

これで実行をするとキューブに触れるごとにスコアを表示しているテキストにスコアが加算されていきます

クリアテキストの追加

スコアと同様にテキストを追加しますので、主にスクリプトの紹介になります

クラス変数では、クリアフラグとクリア時に表示するテキストの変数を追加します

    private bool clear;
    [SerializeField]
    private Text clearText;

 

スタート時には、クリアフラグをfalseにして、テキストを非表示にします

    private void Start()
    {
        clear = false;
        clearText.enabled = false;
    }

 

Updateでは、クリアしていない時だけボールを動かします
クリアしている時にスペースを押されると、再度シーンを読み込むことでリスタートをします

    if (!clear)
        {
            float horizon = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");

            Vector3 move = new Vector3(horizon, 0, vertical);

            if (Input.GetKeyDown(KeyCode.Space) && onGournd)
            {
                rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
            }

            rb.AddForce(move * speed);
        }else
        {
            if (Input.GetKey(KeyCode.Space))
            {
                SceneManager.LoadScene(0);
            }
        }

 

接触したキューブが指定個数以上になると、クリアフラグをtrueにして、テキストを表示します

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Item"))
        {
            cnt++;
            scoreText.text = "Score:" + (cnt * scoreRatio);
            if(cnt >= 7)
            {
                //クリア
                clear = true;
                clearText.enabled = true;
            }
        }
    }

 

最後は以下のようになります
クリアしたら、ボールを止めた方がいいかもしれませんでした
Finish

終わりに

part1では、球体にRigidbodyを追加して跳ねるようにしました
しかし、Rigidbodyのみの追加だけでは、跳ねないのに注意が必要です
Physic MaterialのBoundsを設定しないと跳ねないので、忘れないように設定しましょう

part2では、壁を作ってaddForceでボールを動かしました
今回は、カメラを固定にして力を加えているので素直なスクリプトでしたが、
カメラの位置が変わると力を加える方法をカメラの向きから取得しないといけなので
注意が必要となります
また入力キーを増減したい場合には、InputManagerから変更できることも覚えておきましょう

part3では、キューブオブジェクトを追加してボールとの接触イベントを実装しました
イベントにはOnTriggerやOnCollisionがあるのでよく注意して実装することが必要です

part4では、テキストを追加しました
テキストは、プレイの邪魔にならないように、見やすいところに設置する必要があります
文字サイズ、色、配置のデザインをある程度決めてから作っていくことが重要と思います

今回は、ボールをコントロールするスクリプトに全部を詰め込んでしまいましたが、本来はゲームマネージャーなどを作ってそちらで管理した方がいいかと思います

火曜日担当:poppy



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム