音無サノトの空想録

ゆるく生きている人の漫画

【ゲーム制作】イチから Unity の学びなおし ⑦玉転がしゲーム その6 アイテムの取得

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

週末はゲーム制作を行っていまーす。Unity の公式チュートリアルを淡々とやっており、前回まではアイテムの設置まで行ったので、今度は取得の部分を実装します。

 

(この行を消して、ここに「私の生活習慣」について書いてください)

 

衝突時の処理を追加

まず、前回 Player を非アクティブ状態にしているので、アクティブ状態に戻します。

Player を選択し、Inspector ウィンドウの名前の左側にあるボックスにチェックを入れます。

f:id:otonasisanoto:20190425131557p:plain

 

これで、Player が再びゲーム画面に表示されました。

この Player を操作して、前回までに制作したアイテム(Pick Up)に衝突したとき、 Pick Up を非アクティブ状態にする様にスクリプトを変更します。

 

Unity には衝突判定の際に使用する形状をコライダーと呼ばれるもので定義しており、これを利用すると簡単に衝突時の処理が書けます。

今回の Player の場合はこれ。

f:id:otonasisanoto:20190425132139p:plain

 

Sphere Collider」というのが元からついています。この部分が他のオブジェクトに衝突した際に判定される範囲になります。
 

試しに Mesh Renderer のチェックを外すと、衝突判定に範囲が緑色で表示されているのが分かります。

f:id:otonasisanoto:20190425132426p:plain

赤矢印のチェックを外すと

f:id:otonasisanoto:20190425132503p:plain

Player の緑色の枠が見える。

 

ここが衝突判定の範囲になります。

Unity には様々な形状のコライダーが用意されているので、使用するオブジェクトに合わせて、適している形状のコライダーをアタッチします。

f:id:otonasisanoto:20190425132751p:plain

こんな感じで沢山のコライダーがあります

 

それではスクリプトを変更します。

OnTriggerEnter という関数を用意して処理を追加します。

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

public class PlayerContoller : MonoBehaviour
{
    public float speed;

    private Rigidbody rb;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }


    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);
        }
    }
}

 

まず OnTriggerEnter() という関数は物体が衝突した際に呼ばれるものです。

この場合、スクリプトを適用した Player というオブジェクトが他のオブジェクトに衝突した際に呼ばれます。

そして、衝突したオブジェクトが other という変数に格納されるイメージです。

f:id:otonasisanoto:20190425134057p:plain

 

次の if 文で CompareTag() という関数を使って、衝突したオブジェクトのタグが Pick Up かどうかを確認しています。タグについてはのちほど。

f:id:otonasisanoto:20190425134548p:plain

 

そして、SetActive() 関数でそのオブジェクトを非アクティブ状態にしています。

f:id:otonasisanoto:20190425134723p:plain

 

これで Player の処理は完了です。

ただ、この段階ではアイテムに衝突しても何も起きません。

なぜならアイテムのオブジェクトのタグを変更していないからです。

なので次はアイテムのタグを変更しましょう。

 

タグの変更

まず Project ウィンドウ内にあるプレハブの Pick Up を選択します。

f:id:otonasisanoto:20190425135056p:plain

 

Inspector ウィンドウを見てみると、名前の下に Tag という欄があることが分かります。

f:id:otonasisanoto:20190425135246p:plain

 

Unity ではこのタグを変更することでオブジェクトを識別することができます。

今回なら、衝突したオブジェクトのタグが Pick Up だったら非アクティブ状態にする処理を実行するが、それ以外なら何もしない、ということができます。

 

それでは新しくタグを追加しましょう。

タグ欄のところをクリックし、Add Tag… を選択します。

f:id:otonasisanoto:20190425135512p:plain

List is Empty というところの+部分をクリックして、

f:id:otonasisanoto:20190425135626p:plain

Pick Up という名前のタグを新しく入力して Save を押します。

f:id:otonasisanoto:20190425135658p:plain

 

これでタグが追加されたので、先ほどと同じように Pick Up のプレハブをクリックしてタグを変更します。

f:id:otonasisanoto:20190425135906p:plain

これですべてのアイテムのタグが Pick Up に変更されます。

f:id:otonasisanoto:20190425140003p:plain

 

ただし、この状態でもまだアイテムの取得処理はできません。

衝突時にトリガーを使用しているので、トリガーの状態をオンにしておく必要があります。

Pick Up の Box Collider の Is Triger にチェックを入れます。

f:id:otonasisanoto:20190425140340p:plain

 

これで衝突時にアイテムのオブジェクトが消えるようになりました。

f:id:otonasisanoto:20190425140541p:plain

 

次回は取得したアイテム数を画面に表示します。

 

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