はじめに
今回は、Unityでオブジェクトから離れたときにイベント発生させる方法、具体的にはCubeにクリックによる力を加え、Cubeが着地しているときと空中に浮かんでいるときで色を変える方法について、初心者の方にも理解しやすいように解説します。
基本設定
Unityを開き、新しいプロジェクトを作成します。3Dプロジェクトを選択してください。プロジェクトが開いたら、まずは操作するCubeをシーンに追加しましょう。Hierarchyパネルで右クリックし、「3D Object」>「Cube」を選択します。これで、シーンにCubeが追加されました。
Cubeに力を加える
Cubeをクリックした際に力を加えるには、スクリプトを作成してCubeにアタッチします。プロジェクトパネルで右クリックし、「Create」>「C# Script」を選択し、スクリプトに「AddForceOnClick」という名前をつけます。このスクリプトを開き、以下のコードを記述します。
- 変数の定義:
private Rigidbody rb;
: オブジェクトにアタッチされているRigidbody
コンポーネントを参照します。Rigidbody
は、物理演算をオブジェクトに適用するために必要です。public float upForce = 200f;
: クリック時にオブジェクトに加える上向きの力の大きさを定義します。この値はInspectorウィンドウから調整可能で、デフォルトでは200
に設定されています。
- Startメソッド:
- ゲーム開始時に一度だけ呼び出され、
Rigidbody
コンポーネントへの参照をrb
変数に格納します。このステップはオブジェクトが物理演算を受ける準備をするために必要です。
- ゲーム開始時に一度だけ呼び出され、
- Updateメソッド:
- ゲーム中毎フレームに呼び出され、マウスの左ボタンが押されたかどうかを検出します。
Input.GetMouseButtonDown(0)
メソッドは、左ボタンがそのフレームで押されたかどうかをチェックし、true
を返す場合、指定された力(upForce
)をオブジェクトに上向き(Y軸方向)に加えます。
- ゲーム中毎フレームに呼び出され、マウスの左ボタンが押されたかどうかを検出します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AddForceOnClick : 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));
}
}
}
色の変化を実装する
Cubeの色を着地しているときと空中に浮かんでいるときで変えるためには、さらにスクリプトを編集します。
OnCollisionExitメソッド
OnCollisionExit
は、ゲームオブジェクトが他のオブジェクトから離れた瞬間に呼び出されます。- この例では、
collision.gameObject.name == "Plane"
をチェックして、衝突して離れたオブジェクトが「Plane」かどうかを判断しています。 - 条件が真(つまり、離れたオブジェクトが「Plane」である)の場合、現在のゲームオブジェクトの
Renderer
コンポーネントを取得し、そのmaterial.color
プロパティをColor.red
に設定しています。これは、ゲームオブジェクトが空中にあることを示します。
OnCollisionEnterメソッド
OnCollisionEnter
は、ゲームオブジェクトが他のオブジェクトと衝突した瞬間に呼び出されます。- このメソッドも、衝突したオブジェクトが「Plane」であるかどうかを
collision.gameObject.name == "Plane"
でチェックします。 - 条件が真であれば、同様に
Renderer
コンポーネントを取得し、material.color
をColor.green
に変更します。これは、ゲームオブジェクトが地面に着地していることを示します。
注意点
- このコードは、衝突するオブジェクトが正確に「Plane」という名前であることを前提としています。ゲームの設計によっては、衝突判定を行いたいオブジェクトの名前や、より汎用的な判定方法(例えばタグを使用する)を変更する必要があるかもしれません。
- オブジェクトの
Renderer
コンポーネントやmaterial
にアクセスするためには、該当するゲームオブジェクトにこれらのコンポーネントがアタッチされている必要があります。また、マテリアルが色の変更をサポートしている必要があります。
//床から離れたとき
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;
}
}
ゲームオブジェクトが「Plane」に着地した際には緑色に、そして「Plane」から離れたときには赤色に変わります。これにより、ゲームオブジェクトの状態(空中にあるか、地面にあるか)を視覚的に示すことができます。
まとめ
Unityでクリック操作によりCubeに力を加え、さらにその状態(着地しているか、空中に浮かんでいるか)に応じて色を変える方法を紹介しました。Unityでの開発は、こうした基本的な機能から始めて、徐々に複雑な機能を追加していくことで、想像力豊かなアプリやゲームを作り上げることができます。ぜひ挑戦してみてください。