Roll-a-Ball5(Collecting, Scoring and Building the Game)~Unity~

Unity

Creating Collectable Objects

プレイヤーが獲得するアイテムを作成します。
まずは、「GameObject」-「3DObject」-「Cube」で立方体を作成します。
名前を「PickUp」とする。
Transformについては、Potiosion(0,0.5,0)、Rotation(45,45,45)、Scale(0.5,0.5,0.5)とする。
また、「Add Compornent」から新たにスクリプトを作成します。
名前は、「Rotator」とします。
「Rotator」スクリプトを「Project」-「Script」フォルダの配下に置きます。
次に、作成したアイテムを目立たせるために回転させます。
「Rotator」スクリプトを開きます。

アイテムを回転させるスクリプトを作成します。
プレイ中にずっとアイテムを回転させるため、Update()の中に記述します。
以下が記述したコードです。

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

public class Rotator : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
    }
}

これで、アイテムが回転するようになりました。
実際に再生ボタンを押して、実行してみてください。

では、アイテムが回転することを確認できたなら次へいきます。
次は、この作成したアイテムを量産します。
まずは、「Project」の配下に「Prefabs」フォルダを新規に作成します。
作成した「Prefabs」フォルダの配下に先ほど作成した「PickUp」をドラッグして入れます。

次に、「GameObject」-「CreateEmpty」で新規に「PickUps」を作成します。
新規に作成した「PickUps」の配下に「PickUp」をいれます。
これで、量産する準備が完了です。

まずは、視点を真上から見るように変更し、空間を「Local」から「Global」に変更します。
これで、アイテムをコピーして配置します。(「Edit」-「Duplicate」もしくは、「Ctrl+d」でコピーできます。)

これで、配置ができました。
アイテムが白だと壁と同じ色のため、色を変更します。
「Project」-「Create」から「Material」で新規に「PickUp」の名前で作成します。
作成したマテリアルの色を黄色に設定します。

その後、作成した「PickUp」マテリアルを「Prefabs」配下の「PickUp」にドラッグで適応させます。
これで、全部のアイテムの色が変化しました。

Collecting the Pick Up Objects

プレイヤーがアイテムに衝突した際に、アイテムを取得できるようにします。
まずは、プレイヤーのスクリプト「PlayerController」を開きます。
今回は、プレイヤーがアイテムを通り抜けてたら、取得します。そのため、通り抜けたら、実行するOnTriggerEnter()の中に記述します。
中身は、通り抜けたものが「PickUp」タグのものであれば非表示にするというものです。

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody rb;
    public float speed;
    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    private 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("PickUp"))
        {
            other.gameObject.SetActive(false);
        }
    }
}

次に、アイテムにタグを作ります。
「Tag」-「Add Tag」で新たにタグを作成します。
「List is empty」と記述されているところに、先ほど設定したタグと同名の「PickUp」を記述します。

新たにタグを作成したので、「Tag」の中から作成した「PickUp」タグを選択して、設定します。
また、「Box Collider」の「Is Trigger」にチェックを入れます。

次に、「Add Component」-「Physics」-「Rigidbody」を選択して、追加します。
追加した「Rigidbody」-「Use Gravity」のチェックを外します。

これで、設定が終わりました。
再生ボタンを押して、実行してみてください。
プレイヤーを動かして、アイテムを取得することができます。

Displaying the Score and Text

取得したアイテムを数える機能とゲームを終わらせる機能を作成します。
まず、取得したアイテムを数える機能を作成します。
「GameObject」-「UI」-「Text」を新規に作成します。
名前を「CountText」とします。

こちらが、Canvasの設定です。
※このの設定で、私は詰まりました。
 ここで、詰まった方は、
 CanvasとTextをまとめましたのでを参考にしてください。
 CanvasとTextについて

こちらが、Textの設定です。
Rect Transformでは、図を選択後、「Shift+Alt」を押して、左上を選択してください。

これで、Game画面の左上に「Count Text」という文字が表示できました。
これで、再生ボタンを押して、ゲームをプレイしていてもずっと左上に文字があることがわかります。

次に、「PlayerController」スクリプトに取得した数をカウントするコードを記述します。
以下が追加で記述したコードです。

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody rb;
    private int count;
    public float speed;
    public Text countText;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
    }

    private 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("PickUp"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetCountText();
        }
    }

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

これで、アイテムの取得したカウントができます。
あとは、先ほど作成した「CountText」をドラッグで、「Player」のCount Textにドラッグで入れます。
これで、プレイするとアイテムを取得する度にカウントされます。

最後に、アイテムをすべて取得した際に「You Win」というメッセージが表示されるようにします。
「Count Text」を作成した手順でWinTextを作成して、文字の位置を真ん中にします。
「PlayerController」の中は以下の様に記述します。

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody rb;
    private int count;
    public float speed;
    public Text countText;
    public Text winText;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
        winText.text = "";
    }

    private 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("PickUp"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetCountText();
        }
    }

    void SetCountText()
    {
        countText.text = "Count: " + count.ToString();
        if (count >= 12)
        {
            winText.text = "You Win!";
        }
    }
}

最後に、作成した「Win Text」をドラッグで「Player」のWin Textの中にいれます。
これで、「Roll-a-Ball」の完成です。

Building the Game

「Roll-a-Ball」ゲームをビルドして、実行ファイルにします。
「File」-「Build Setting」を選択します。
選択すると下の画面が表示されます。
そこで、「Add Open Scenes」で作成したゲームのシーンを追加します。
追加の方法は、ドラッグで持ってくることもできます。
「Build」ボタンを押して、ビルドします。

これで、フォルダを選択して、ビルドしたファイルの保存先を選択します。
(ここでは、「Build」フォルダを新規作成して選んでいます。)

これで、ビルドができました。
先ほど保存したフォルダを開きます。
「Roll-a-Ball」を選んで、実行します。

実際に実行した画面です。
無事に実行することができました。

おわりに

今回は、Unity Learnの「Roll-a-Ball」を実施しました。
難易度は優しいですが、Unityの開発で大事な要素が多く詰まっていたと感じます。
これから、Unityに触れようと考えている方におすすめです。

コメント

タイトルとURLをコピーしました