UnityUnityメモ

Unityで特定エリア内の動作を制限!ジャンプ禁止ゾーンを作る方法

Unity

1. はじめに

ゲーム開発では、「特定のエリアに入ると動作が制限される」という仕組みを作ることがよくあります。たとえば、RPGでは毒の沼地に入ると移動速度が遅くなったり、ステルスゲームでは特定のエリアに入ると隠れた状態になったりしますね。

この記事では、Unityを使って「ジャンプ禁止ゾーン」を作成する方法を解説します。プレイヤーが特定のエリアに入るとジャンプができなくなり、そこから抜け出すと再びジャンプできるようになる仕組みを実装します。

この方法を応用すれば、さまざまなエリア効果をゲームに追加できるので、ぜひ試してみてください!



2. シーンの準備

まずは、ジャンプを制限するエリアを作成するための基本的なシーンを準備しましょう。Unityのヒエラルキー(Hierarchy)ウィンドウを活用して、必要なオブジェクトを配置していきます。


① Plane(床)を作成

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリック
  2. 「3D Object」→「Plane」を選択
  3. 名前を「Ground」に変更(分かりやすくするため)

これはプレイヤーが立つための床になります。


② Cube(プレイヤー)を作成

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリック
  2. 「3D Object」→「Cube」を選択
  3. 名前を「Player」に変更
  4. インスペクター(Inspector)ウィンドウでTransformのPositionを (0, 1, 0) に変更
    • Y = 1 に設定することで、床の上に配置されるようになります。

このCubeがプレイヤーの役割を持ち、移動やジャンプをするオブジェクトになります。




③ CubeにRigidbodyを追加

プレイヤー(Cube)が物理的に動けるように、Rigidbody(リジッドボディ)を追加します。

  1. ヒエラルキーで「Player(Cube)」を選択
  2. インスペクターウィンドウの「Add Component」をクリック
  3. 検索バーに「Rigidbody」と入力して追加
  4. 「Use Gravity」がオンになっていることを確認

これで、プレイヤーが重力の影響を受けて落下したり、外部から力を加えられるようになります。


④ シーンの見た目を調整

現時点でのシーンは以下のようになります:

  • Ground(Plane)が広がった床
  • Player(Cube)が床の上に配置
  • Rigidbodyを追加し、物理演算が適用される状態

これで、プレイヤーオブジェクトの基本設定が完了しました!次は、ジャンプを制限する「エリア」を作っていきましょう。




3. ジャンプ禁止ゾーンを作成

では、プレイヤー(Cube)が特定のエリアに入るとジャンプできなくなる「ジャンプ禁止ゾーン」を作成していきましょう!


① 空のGameObjectを作成

まず、ジャンプを制限するエリアを作るために、空のオブジェクトを作成します。

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリック
  2. 「Create Empty」を選択
  3. 作成したGameObjectの名前を「JumpRestrictionArea」に変更する

② ボックスコライダーを追加し、トリガーを有効化

次に、このGameObjectに**Box Collider(ボックスコライダー)**を追加し、プレイヤーがこのエリアに入ったかどうかを判定できるようにします。

  1. 「JumpRestrictionArea」を選択した状態で、インスペクター(Inspector)ウィンドウを開く
  2. Add Component」ボタンをクリック
  3. Box Collider」を検索して追加
  4. **「Is Trigger」**のチェックボックスをオンにする
     → これにより、物理的な衝突ではなく、プレイヤーがエリア内に入ったかどうかを判定できるようになります。

③ コライダーのサイズと位置を調整

最後に、「JumpRestrictionArea」のボックスコライダーのサイズを調整し、ジャンプを制限するエリアを設定します。

  1. インスペクターで「Box Collider」の「Edit Collider」ボタンをクリック
  2. **「Size」**のX・Y・Zの値を変更(例えば X=5, Y=2, Z=5 など)
  3. 「JumpRestrictionArea」の位置を移動し、プレイヤーが通過するエリアに配置する

💡 ヒント
「シーンビュー(Scene)」でボックスコライダーが緑色のワイヤーフレームとして表示されるので、見やすい位置に調整しましょう!

これで、ジャンプ禁止ゾーンが準備できました!
次のステップでは、このエリアに入るとプレイヤーのジャンプを無効化するスクリプトを作成します。




4. スクリプトの作成

それでは、ジャンプ禁止エリアの判定を実装するスクリプトを作成しましょう。

「えっ…スクリプトを書くのって難しそう…」と思った方も安心してください!

実は、C#を使わなくてもゲームの動きを作れるツールもあるんです。
たとえば、【PlayMaker】は、コードなしでビジュアルにロジックを組めるUnityの人気アセットです。

初心者でもブロックを組み立てるような感覚で「ジャンプ制限」や「トリガーイベント」などを簡単に実装できますよ!

① 新しいスクリプトを作成

まず、プレイヤー(Cube)を操作するスクリプトを作成します。
プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択して、CubeMove という名前を付けます。

作成した CubeMove.cs を、ヒエラルキーの Cube にドラッグ&ドロップしてアタッチしてください。

② CubeMove.cs のコードを記述

次に、以下のコードを CubeMove.cs に入力してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    Renderer cubeMaterial;
    private float input;
    Rigidbody rb;
    private bool isArea;  // 特定エリア内にいるかどうかのフラグ

    void Start()
    {
        // CubeのマテリアルとRigidbodyコンポーネントを取得
        cubeMaterial = GetComponent<Renderer>();
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // ←キーで左に移動
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(-0.01f, 0f, 0f);
        }

        // →キーで右に移動
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(0.01f, 0f, 0f);
        }

        // スペースキーでジャンプ
        if (Input.GetKey(KeyCode.Space))
        {
            if (!isArea) // ジャンプ禁止エリア外ならジャンプできる
            {
                rb.AddForce(new Vector3(0, 3, 0));
            }
        }
    }

    // エリア内に入った時にジャンプ不可にする
    void OnTriggerStay(Collider other)
    {
        if (other.gameObject.name == "GameObject") // ここでエリア名を判定
        {
            isArea = true;
            Debug.Log("エリア内ジャンプ不可");        
        }
    }

    // エリアから出た時にジャンプ可能にする
    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "GameObject")
        {
            isArea = false;
            Debug.Log("エリア外ジャンプ可");
        }
    }
}

③ コードの解説

このスクリプトでは、以下の機能を実装しています。

左右移動: キー (KeyCode.LeftArrow) で左へ、 キー (KeyCode.RightArrow) で右へ移動。
ジャンプ処理: スペースキー (KeyCode.Space) を押すと上方向に力を加える。
エリア判定:

  • OnTriggerStay() を使い、特定のエリアに入ると isAreatrue にする。(ジャンプ禁止)
  • OnTriggerExit() でエリアを出たとき isAreafalse にしてジャンプを可能にする。

④ スクリプトのアタッチ

コードを入力したら、必ず Cube にスクリプトをアタッチ してください。(プロジェクトウィンドウの CubeMove.cs を Cube にドラッグ&ドロップ)

これで、特定のエリアでジャンプを制限する処理の実装が完了しました!
この仕組みを応用すれば、他の動作(移動制限、攻撃制限など)も作ることができます。




5. 実際に動かしてみる

それでは、実際にゲームを再生してジャンプ禁止ゾーンが機能するか試してみましょう!

1. シーンを保存して再生

まずは作成したシーンを保存し、Unityの「▶(再生)」ボタンをクリックしてゲームを開始します。

2. プレイヤー(Cube)を操作

矢印キー(← →)を使ってCubeを左右に移動し、スペースキーを押してジャンプしてみましょう。
エリアの外では通常どおりジャンプできるはずです。

3. ジャンプ禁止ゾーンに入る

ジャンプ禁止ゾーン(トリガーを設定したエリア)に移動してみます。
エリア内に入ると、スペースキーを押してもCubeがジャンプしなくなることを確認してください。

4. エリアから抜け出す

次に、ジャンプ禁止ゾーンから出てみましょう。
エリア外に移動すると、再びジャンプできるようになるはずです。

5. 正しく動作しない場合の確認ポイント

もし意図した動作にならない場合は、以下のポイントを確認してください。

  1. CubeにRigidbodyが追加されているか
    • Rigidbodyがないと物理的な力(AddForce)が適用されません。
    • CubeのインスペクターRigidbodyコンポーネントが追加されているか確認しましょう。
  2. ボックスコライダーのトリガーが有効か
    • ジャンプ禁止エリアのボックスコライダーの 「Is Trigger」 にチェックが入っているか確認してください。
  3. スクリプトのオブジェクト名が正しいか
    • OnTriggerStayOnTriggerExitother.gameObject.name == "GameObject" の部分が、
      実際のオブジェクト名と一致しているかチェックしてみてください。

これで、特定のエリアではジャンプができなくなり、エリアを出ると再びジャンプできるようになる動作が確認できましたね!🎮✨
この仕組みを応用すれば、例えば「スローモーションゾーン」や「攻撃禁止エリア」なども作成できますよ。




よくある質問(FAQ)

Q
ジャンプだけでなく移動も制限できますか?
A

はい!OnTriggerStay 内で transform.Translate(0, 0, 0) などの制限を追加すれば可能です。

Q
ジャンプ禁止ゾーンを視覚的にわかりやすくしたいです。
A

ボックスコライダーのエリアに透明なPlaneを配置し、色を変えると視覚的に認識しやすくなります。

Q
複数のエリアを設定できますか?
A

可能です!複数のGameObjectを作成し、タグを使って管理すると便利です。

タイトルとURLをコピーしました