10「玉転がし」Roll a Ball – PickUpゲームオブジェクトとの衝突検出

PickUpゲームオブジェクトとの衝突検出

PickUpゲームオブジェクトにプレイヤーが衝突したときに消えるようにスクリプトを修正します。

OnTriggerEnterでオブジェクトを非アクティブに設定

OnTriggerEnter関数を追加し、その関数内で他のオブジェクトを非アクティブに設定します。

1. OnTriggerEnter関数を追加

PlayerController.csをエディターで開き編集します。

PlayerController.cs

...(省略)
public class PlayerContrller : MonoBehaviour
{
    ...(省略)
    void FixedUpdate()
    {
        ...(省略)
    }

+    void OnTriggerEnter(Collider other)
+    {
+        
+    }
}

2. 他のオブジェクトを非アクティブに設定

OnTriggerEnter関数内にオブジェクトを非アクティブに設定するコードを追加します。

PlayerController.cs

...(省略)

public class PlayerContrller : MonoBehaviour
{
    ...(省略)
    void OnTriggerEnter(Collider other)
    {
+        other.gameObject.SetActive(false);
    }
}

※PickUpゲームオブジェクトがトリガーとして設定されていないため、ゲーム上ではまだ何も起こりません。

PickUpプレハブにタグを追加

新しいタグを作成し、PickUpプレハブに作成したタグを適用させます。

1. PickUpプレハブをプレハブ編集モードで開く

ProjectビューのPrefabsフォルダのPickUpプレハブをダブルクリックしてプレハブ編集モードを開始します。

プレハブ編集モードで加えた変更は、すべてのPickUpゲームオブジェクトに適用されます。

2. 新しいタグの作成

Inspectorビューの上部にある「Tag」ドロップダウンメニューから「Add Tag..」を選択します。

追加(+)ボタンを選択し「PickUp」という名前でタグ作成します。

※大文字と小文字が区別されるので正確に入力してください。

3. PickUpプレハブにタグを適用

PickUpプレハブを選択したまま、「Tag」ドロップダウンメニューから、「PickUp」を選択します。

プレハブ編集モードを終了しScene内のすべてのPickUpゲームオブジェクトに「PickUp」タグが適用されているかを確認してください。

衝突時の条件文を追加

「PickUp」タグを確認し、その条件が満たされている場合にオブジェクトを非アクティブにするスクリプトに修正します。

1. 「PickUp」タグを確認します。

PlayerController.csを開きます。

OnTriggerEnter関数内の先頭にif文を追加します。

PlayerController.cs

...(省略)
public class PlayerContrller : MonoBehaviour
{
    ...(省略)
    void OnTriggerEnter(Collider other)
    {
+        if (other.gameObject.CompareTag("PickUp"))
+        {
+            
+        }
        other.gameObject.SetActive(false);
    }
}

2. 条件が満たされた場合にオブジェクトを非アクティブにする

other.gameObject.SetActive(false);if文の中に移動させます。

PlayerController.cs

...(省略)
public class PlayerContrller : MonoBehaviour
{
    ...(省略)
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp"))
        {
+            other.gameObject.SetActive(false);
        }
-        other.gameObject.SetActive(false);
    }
}

3. OnTriggerEnter関数の最終スクリプト

OnTriggerEnter関数の全体

PlayerController.cs

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp"))
        {
            other.gameObject.SetActive(false);
        }
    }

PickUpプレハブのコライダーをトリガーとして設定

PickUpプレハブのトリガーを変更し、ゲームをテストします。

1. PickUpプレハブをトリガーに変更する

ProjectビューのPrefabsフォルダでPickUpプレハブをダブルクリックしプレハブ編集モードを開きます。

InspectorビューのBox ColliderのIs Triggerを有効にします。

プレハブ編集モードを終了し、この変更がSceneビューのPickUpゲームオブジェクトに適用されていることを確認します。

2. ゲームテスト

PickUpゲームオブジェクトにプレイヤーが触れるとオブジェクトが消えることを確認してください。

PickUpプレハブにRigidbodyコンポーネントを追加

PickUpプレハブにRigidbodyコンポーネントを追加します。しかし、最適化のために物理計算は無効にします。

1. PickUpプレハブにRigidbodyコンポーネントを追加

ProjectビューのPrefabsフォルダでPickUpプレハブをダブルクリックしプレハブ編集モードを開きます。

Inspectorビューで「Add Component > Rigidbody」の順番で選択しRigidbodyコンポーネントを追加します。

2. 物理計算の無効化

RigidbodyコンポーネントのUse Gravityを無効にし、Is Kinematicを有効にします。

プレハブ編集モードを終了し、ゲームテストでゲームが期待通りに動作することを確認してください。

最終スクリプト

PlayerController.cs

using UnityEngine;
// PlayerゲームオブジェクトにアタッチしたPlayerInputからの入力を受け付けるために必要な名前空間
// キーボード/ゲームパッド → Actions(ProjectビューにあるInputSystem_Actionsファイル) →
// PlayerゲームオブジェクトにアタッチしたPlyaerInput → このスクリプト
using UnityEngine.InputSystem;

public class PlayerContrller : MonoBehaviour
{
    /// <summary>
    /// Playerの移動速度を保存する変数
    /// </summary>
    public float speed = 5f;

    // private(プライベート)で定義する変数の名前は最初に_(アンダーバー)を付けます。
    // private変数は他のスクリプトファイルから値を取得・変更させることができない変数です。

    /// <summary>
    /// PlayerにアタッチされたRigidbodyを保存する変数
    /// </summary>
    private Rigidbody _rb;

    /// <summary>
    /// X方向の移動量を保存する変数
    /// </summary>
    private float _movementX;

    /// <summary>
    /// Y方向の移動量を保存する変数
    /// </summary>
    private float _movementY;

    void Start()
    {
        // PlayerにアタッチされたRigidbodyを取得し変数_rbに保存します。
        _rb = GetComponent<Rigidbody>();
    }

    /// <summary>
    /// プレイヤーのキーボード(WASD)/ゲームパッド(Lスティック)の入力があった際に呼び出される関数です。
    /// </summary>
    /// <param name="movementValue">入力デバイスのX方向とY方向の値を持っています。</param>
    void OnMove(InputValue movementValue)
    {
        // Vecotr2(2次元座標:X座標/Y座標)型の変数movementVecotrにmovementValueをVector2(2次元座標)に変換し保存します。
        Vector2 movementVector = movementValue.Get<Vector2>();

        // movementVectorのX座標・Y座標をそれぞれに変数に保存します。
        _movementX = movementVector.x;
        _movementY = movementVector.y;
    }

    void FixedUpdate()
    {
        // _movmentXをX軸の値に_movmentYをZ軸の値にした3次元座標に変換し変数momventに保存します。
        Vector3 movement = new Vector3(x: _movementX, y: 0.0f, z: _movementY);

        // RigidbodyのAddFrouce関数に3次元座標を渡し、指定した方向に力を加えます。
        // movment(力)にspeed(移動速度)掛け合わせます。
        _rb.AddForce(movement * speed);
    }

    void OnTriggerEnter(Collider other)
    {
        // プレイヤーが衝突したオブジェクトにPickUpタグが付いているか確認します。
        if (other.gameObject.CompareTag("PickUp"))
        {
            // 衝突したオブジェクトを非アクティブ化します。(非表示になる)
            other.gameObject.SetActive(false);
        }
    }
}