UnityUnityメモ

UnityでのOnCollisionExit活用法:オブジェクト離脱時のイベント処理ガイド

Unity

はじめに

UnityのOnCollisionExitを使えば、オブジェクトが別のオブジェクトから離れたときにアクションを起こすことができます。この記事では、クリックでCube(キューブ)に力を加え、着地しているときと浮上しているときで色を変える方法を説明します。

Unityを触ったことがないという方はコチラの記事から見てみてください!



1. Unityでプロジェクトの準備をする

まずは、Unityを開いて新しい3Dプロジェクトを作成しましょう。プロジェクトが開いたら、次のステップに進みます。

床を作成する

  • ヒエラルキーウィンドウで右クリックし、「3D Object」→「Plane」を選び、床を作成します。
  • 位置やサイズはそのままで問題ありません。

キューブを作成する

  1. ヒエラルキーウィンドウで右クリックします。
  2. 「3D Object」→「Cube」を選びます。
  3. 同じようにして、「3D Object」→「Plane」を選び、床を作成します。
  4. キューブを少し上に移動させ、床の上に配置します。

物理特性を追加する

キューブが物理的に動くようにするため、Rigidbodyコンポーネントを追加します。

  1. キューブを選択し、インスペクターウィンドウで「Add Component」ボタンをクリックします。
  2. 「Rigidbody」を検索して追加します。



2. スクリプトを作成する

次に、キューブに力を加えるスクリプトを作成します。

  1. プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選びます。
  2. スクリプトの名前を「ClickUp」にします。
  3. スクリプトをダブルクリックして開き、以下のコードを入力します。

コード全体の説明

  1. Rigidbodyコンポーネントを取得して、オブジェクトに物理的な力を加えます。
  2. マウスの左ボタンが押されたときにオブジェクトを上に動かします。
  3. オブジェクトが床に接触したり、離れたりしたときに色を変更します。

各部分の説明

変数の宣言

  • rb: オブジェクトの物理演算を管理するためのRigidbody型の変数。
  • upForce: オブジェクトを上に動かす力の大きさを指定する変数。200という値を初期値にしています。

Startメソッド

  • Startメソッドは、ゲームが開始されたときに一度だけ実行されます。
  • rb変数に、このスクリプトがアタッチされているオブジェクトのRigidbodyコンポーネントを代入します。

Updateメソッド

  • Updateメソッドは、毎フレーム呼び出されます。
  • Input.GetMouseButtonDown(0)は、マウスの左ボタンが押されたことをチェックします。
  • 左ボタンが押されると、rb.AddForceで上方向(Y軸方向)に力を加えます。この力はupForceの値によって決まります。

OnCollisionExitメソッド

  • オブジェクトが他のオブジェクトと接触して離れたときに呼ばれます。
  • collision.gameObject.nameが”Plane”(床)だった場合、このオブジェクトの色を赤に変更します。

OnCollisionEnterメソッド

  • オブジェクトが他のオブジェクトと接触したときに呼ばれます。
  • collision.gameObject.nameが”Plane”(床)だった場合、このオブジェクトの色を緑に変更します。

全体の動き

  1. ゲーム開始時に、オブジェクトのRigidbodyを取得します。
  2. 毎フレーム、マウスの左ボタンが押されたかどうかをチェックします。
  3. マウスの左ボタンが押されたら、オブジェクトに上方向の力を加えます。
  4. オブジェクトが床に接触したら緑色に、離れたら赤色に変わります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClickUp : MonoBehaviour
{
    private Rigidbody rb;
    public float upForce = 200f;

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

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            rb.AddForce(new Vector3(0, upForce, 0));
        }
    }

    // 床から離れたとき
    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.name == "Plane")
        {
            GetComponent<Renderer>().material.color = Color.red;
        }
    }

    // 床に着地したとき
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "Plane")
        {
            GetComponent<Renderer>().material.color = Color.green;
        }
    }
}

このスクリプトでは、クリックでキューブに上向きの力を加え、着地しているとき(OnCollisionEnter)に緑色、浮上しているとき(OnCollisionExit)に赤色に変わるようにしています。

5. スクリプトをキューブにアタッチする

作成したスクリプトをキューブにアタッチします。

  1. プロジェクトウィンドウで「ClickUp」スクリプトを選びます。
  2. そのスクリプトをドラッグしてキューブにドロップします。



3. ゲームをプレイして確認する

これで準備完了です!再生ボタンを押してゲームを実行し、キューブをクリックしてみてください。キューブが浮上しているときは赤色に、着地すると緑色に変わることを確認できます。

これでキューブをクリックして力を加え、色を変える方法がわかりましたね。ぜひ、他のオブジェクトや効果を試してみて、Unityの楽しさを体験してください!



よくある質問

Q
キューブがうまく動かない場合はどうすればいいですか?
A

まず、キューブにRigidbodyが追加されているか確認してください。また、スクリプトが正しくアタッチされているかも確認してください。

Q
キューブの色が変わらないのはなぜですか?
A

スクリプト内でRendererを取得しているか確認してください。また、マテリアルが設定されているかもチェックしてください。

Q
クリックしてもキューブが動かない場合は?
A

スクリプトのUpdateメソッド内でInput.GetMouseButtonDown(0)を使っている部分を確認し、デバッグログを追加してクリックイベントが検出されているか確認すると良いでしょう。