はじめに
Unityでゲームやアプリを開発していると、オブジェクトに触れている間、何らかのイベントを発生させたい場面がよくあります。たとえば、プレイヤーが床に立っている間だけジャンプできるようにしたり、オブジェクトに触れ続けることでダメージを受け続けるようにするなどです。
この記事では、「床に触れている間はずっと前に動いて、浮上しているときは動かない」キャラクターの動きをUnityでどうやって作れるかを、初心者の方にもわかりやすく解説します。
基本概念の理解
まず、Unityでキャラクターを動かす基本的な概念から理解しましょう。Unityでは、オブジェクト(この場合はキャラクター)を動かすために「Rigidbody」というコンポーネントを使用します。Rigidbodyを使うと、物理法則に基づいてオブジェクトに力を加えることができ、自然な動きを実現することが可能です。
次に、「Collider」というコンポーネントが重要です。Colliderはオブジェクトの「当たり判定」を司ります。キャラクターが床に触れているかどうかを判定するためには、キャラクターと床にColliderを設定し、互いに接触しているかを検出する必要があります。
1. キャラクターと床の準備
- Unityエディタを開き、新しいシーンを作成します。
- シーンに「Plane」オブジェクトを追加して床を作ります。
- キャラクター用のオブジェクトをシーンに追加します。簡単な例としては、「Cube」を使用すると良いでしょう。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-05_152327.png)
2. RigidbodyとColliderの設定
- キャラクターオブジェクトに「Rigidbody」コンポーネントを追加します。これにより、物理法則が適用されます。
- キャラクターと床のオブジェクトに「Collider」コンポーネントを追加します。ほとんどの場合、これらのオブジェクトには既に「BoxCollider」や「MeshCollider」が追加されています。
3. 接触判定と前進の実装
- キャラクターの動きを制御するための新しいスクリプトを作成します。例えば、「MoveForward.cs」という名前で。
- スクリプト内で、キャラクターが床に触れているかどうかを判定し、触れている間だけ前に進むロジックを実装します。
このスクリプトは、ユーザーがマウスのボタンをクリックしたときにキャラクター(この場合はRigidbody
を持つオブジェクト)を上に力を加えてジャンプさせ、キャラクターが「Plane」という名前のオブジェクト(床と想定)に触れている間と触れていないときの状態を色の変更で視覚的に表示するものです。
スクリプトの概要
- 変数定義:
private Rigidbody rb;
: オブジェクトのRigidbodyコンポーネントへの参照を格納します。public float upForce = 200f;
: 上向きの力の大きさを指定します。この値はInspectorから調整可能です。
- Startメソッド:
- ゲーム開始時にオブジェクトのRigidbodyコンポーネントを取得し、
rb
変数に格納します。
- ゲーム開始時にオブジェクトのRigidbodyコンポーネントを取得し、
- Updateメソッド:
- ユーザーがマウスの左ボタンをクリックした時に、設定された上向きの力(
upForce
)をオブジェクトに加えてジャンプさせます。
- ユーザーがマウスの左ボタンをクリックした時に、設定された上向きの力(
- OnCollisionExitメソッド:
- オブジェクトが「Plane」から離れたときに、オブジェクトの色を赤に変更します。これはキャラクターが空中にいることを示します。
- OnCollisionStayメソッド:
- オブジェクトが「Plane」と接触している間、オブジェクトの色を緑に変更し、わずかに前進させます(
transform.Translate(0, 0, 0.02f);
)。これはキャラクターが床に接触している状態を示し、この条件下でのみ前進するようにします。
- オブジェクトが「Plane」と接触している間、オブジェクトの色を緑に変更し、わずかに前進させます(
注意点
このスクリプトでは、オブジェクトが「Plane」という名前のオブジェクトにのみ反応するように設定されています。実際のゲーム開発では、複数の異なるタイプの地形やオブジェクトに対応するために、タグを使用するか、レイヤーに基づく判定を行う方法が一般的です。また、transform.Translate
を使用して直接位置を変更すると、物理エンジンの計算結果と競合する可能性があるため、物理ベースの動きにはRigidbody
のメソッドを利用することが推奨されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveForward : 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);
}
}
}
まとめ
以上で、「床に触れている間はずっと前に動いて、浮上しているときは動かない」キャラクターの基本的な動きをUnityで実装する方法をご紹介しました。Unityでゲームを作る醍醐味は、自分の思い描く動きを実現できることにあります。今回の例を参考に、さまざまなキャラクターの動きを試してみてください。