UnityUnityメモ

UnityでのOnCollisionStay活用法:オブジェクト接触中のイベント発生方法

Unity

はじめに

こんにちは!今回はUnityのOnCollisionStayを使って、オブジェクトが他のオブジェクトに触れている間にイベント呼び出せるようにする方法を紹介します。具体的には、Cubeが床に触れている間は前に動き、浮いているときは動かないようにします。

そして、接地している間はCubeが緑色になり、浮いているときは赤色に変わるようにしていきます。初心者にもわかりやすく、手順を追いながら進めていくので安心してくださいね!

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



ステップ1: シーンの設定

まず、Unityで新しいシーンを作成し、次のオブジェクトを配置します。

床 (Plane)を配置する

  1. Hierarchyウィンドウで右クリックし、「3D Object」→「Plane」を選びます。
  2. プロジェクトウィンドウを右クリック、「Create」→「Material」を選択します。
  3. インスペクター画面から作成したMaterialの色を設定(この記事では青)してアタッチします。
  4. Planeを選択し、Inspectorウィンドウで「Tag」を「Ground」に設定します。
    • タグがない場合は新しく作成してください。

Cubeを配置する

  1. Hierarchyウィンドウで右クリックし、「3D Object」→「Cube」を選びます。
  2. Cubeの位置を調整して、適当な場所に配置します。
  3. inspector画面の「AddComponent」から「Rigidbody」を検索して追加します。



ステップ2: スクリプトの作成

次に、Cubeに動きを与えるスクリプトを作成します。

  1. 新しいC#スクリプトの作成:
    • Projectウィンドウで右クリックし、「Create」→「C# Script」を選び、「ClickUp」と名付けます。
    • ClickUpスクリプトをダブルクリックして開き、以下のコードを入力します。

コード全体の説明

このスクリプトは、以下のような動きを実現します:

  1. ゲームが始まると、オブジェクトのRigidbodyコンポーネントを取得します。
  2. プレイヤーがマウスの左ボタンをクリックすると、オブジェクトは上方向に力を受けてジャンプします。
  3. オブジェクトが床から離れたときは赤色に変わり、床に接している間は緑色に変わって少し前進します。

各部分の説明

  1. Rigidbodyの取得
    • private Rigidbody rb; は、Rigidbodyコンポーネント(物理挙動を制御するためのもの)を格納する変数を定義しています。
    • public float upForce = 200f; は、オブジェクトに加える上方向の力の大きさを設定する変数です。ここではデフォルト値を200fにしています。
    • void Start() メソッドは、ゲームが始まったときに一度だけ実行されます。ここで、rbにオブジェクトのRigidbodyコンポーネントを取得しています。
  2. マウスクリックによるジャンプ
    • void Update() メソッドは、毎フレーム実行される関数です。ここにゲームの主なロジックを記述します。
    • if (Input.GetMouseButtonDown(0)) は、マウスの左ボタンがクリックされた瞬間を検出します。
    • rb.AddForce(new Vector3(0, upForce, 0)); は、クリックされたときにオブジェクトに上方向の力を加えます。
  3. 床から離れたときの処理
    • private void OnCollisionExit(Collision collision) は、オブジェクトが他のオブジェクトと衝突を終了したときに呼ばれます。
    • if (collision.gameObject.name == "Plane") は、衝突を終了したオブジェクトが名前”Plane”であるかを確認します。ここでは、床が”Plane”という名前であると仮定しています。
    • GetComponent<Renderer>().material.color = Color.red; は、オブジェクトの色を赤色に変更します。
  4. 床に接している間の処理
    • private void OnCollisionStay(Collision collision) は、オブジェクトが他のオブジェクトと衝突している間、毎フレーム呼ばれます。
    • if (collision.gameObject.name == "Plane") は、衝突しているオブジェクトが名前”Plane”であるかを確認します。
    • GetComponent<Renderer>().material.color = Color.green; は、オブジェクトの色を緑色に変更します。
    • transform.Translate(0, 0, 0.02f); は、オブジェクトを少し前進させます。

全体の動き

  1. ゲームが始まると、オブジェクトのRigidbodyが取得されます。
  2. プレイヤーがマウスの左ボタンをクリックすると、オブジェクトは上方向にジャンプします。
  3. オブジェクトが床から離れると赤色に変わり、床に接触している間は緑色に変わって少し前進します。
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 OnCollisionStay(Collision collision)
    {
        if (collision.gameObject.name == "Plane")
        {
            GetComponent<Renderer>().material.color = Color.green;
            transform.Translate(0, 0, 0.02f);
        }
    }
}

スクリプトの適用

  1. Cubeにスクリプトをアタッチ:
    • HierarchyウィンドウでCubeを選択します。
    • ProjectウィンドウからClickUpスクリプトを選び、Cubeにドラッグ&ドロップします。



動作確認

いよいよ動作確認の時間です!以下の手順で正しく動作するか確認してみましょう。

  1. プレイモードを開始
    Unityエディターの上部にある「▶(再生ボタン)」をクリックしてプレイモードを開始します。
  2. Cubeの動作を確認
    • 接地している場合: CubeがPlane(床)の上にいるとき、Cubeが前方(Z方向)に動き出し、Cubeの色が 緑色 に変わります。
    • 浮いている場合: Cubeが床から離れると、Cubeの動きが止まり、Cubeの色が 赤色 に変わります。

これで、Cubeが床に触れている間は前に動き、浮いているときは動かないようになりました。また、接地している間はCubeが緑色になり、浮いているときは赤色に変わるはずです。

これで、OnCollisionStayを使った基本的なUnityのスクリプトの作成方法がわかりましたね。



よくある質問 (Q&A)

Q
Cubeが動かないのですが、どうすればいいですか?
A

CubeにRigidbodyコンポーネントがアタッチされていることを確認してください。また、Planeに「Ground」タグが設定されていることを確認してください。

Q
Cubeが赤色にならないのですが、どうすればいいですか?
A

CubeとPlaneが正しく接触していることを確認してください。Planeが十分に大きく、Cubeが接地しているかを見てみましょう。

Q
色の変更がうまくいかないのですが、なぜでしょうか?
A

CubeのRendererコンポーネントが正しく取得されているか確認してください。また、マテリアルの色が変更可能なものかも確認してみてください。