UnityUnityメモ

Unityで簡単な物理ギミック作成!障害物落下をスクリプトで実現する方法

Unity

1. はじめに

Unityでゲームを作るとき、「プレイヤーが特定の場所を通過したら障害物が落下する仕組み」を作れると、ゲームにちょっとしたスリルや遊び心を加えることができます。このギミックは、アクションゲームやパズルゲームでよく使われる仕掛けの一つです。

今回は、プレイヤーが矢印キーで操作できる「Cube」を使い、そのCubeが球体の真下を通ると球体が落下するという仕組みを作っていきます。スクリプトも簡単なので、Unity初心者の方でも安心して取り組めますよ!

それでは、さっそく一緒に作っていきましょう!

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



2. シーンの準備

まずはUnityでシーンをセットアップします。以下の手順に従って、プレイヤー (Cube)、床 (Plane)、そして落下する障害物 (Sphere) を配置しましょう。


1. 床 (Plane) を作成する

  1. ヒエラルキー (Hierarchy) ウィンドウ を右クリックします。
  2. 3D ObjectPlane を選択して床を追加します。
  3. 作成されたPlaneを選択し、インスペクターで以下の位置を設定します:
    • Position: (0, 0, 0)
    • Scale: (10, 1, 10)(広めの床に設定)

これで、プレイヤーが移動するための床が準備できました。


2. プレイヤー (Cube) を作成する

  1. ヒエラルキー (Hierarchy) ウィンドウ を右クリックします。
  2. 3D ObjectCube を選択してプレイヤーオブジェクトを追加します。
  3. Cubeを選択し、インスペクターで以下の設定を行います:
    • Position: (0, 0.5, 0)
    • Scale: (1, 1, 1)

このCubeがプレイヤーとして動きます。


3. 障害物 (Sphere) を作成する

  1. ヒエラルキー (Hierarchy) ウィンドウ を右クリックします。
  2. 3D ObjectSphere を選択して球体を追加します。
  3. Sphereを選択し、インスペクターで以下の設定を行います:
    • Position: (0, 5, 0)
    • Scale: (1, 1, 1)

4. Rigidbodyを追加する

球体が落下するには物理エンジンが必要です。Rigidbodyコンポーネントを追加しましょう。

  1. Sphereを選択した状態で、インスペクターの「Add Component」ボタンをクリックします。
  2. 検索欄に「Rigidbody」と入力し、コンポーネントを追加します。
  3. Rigidbodyの設定では、Use Gravity をチェックしたままにしておきます。

これで、シーンの準備は完了です!次は、プレイヤーを移動させるスクリプトを作っていきます。



3. スクリプトの作成と設定

次に、プレイヤーを移動させるスクリプトと、球体を落下させるスクリプトを作成していきます。Unityの基本的なスクリプト作成手順を覚えながら進めましょう!


1. プレイヤーを移動させるスクリプト

プレイヤー (Cube) を矢印キーで移動できるようにします。

  1. プロジェクト (Project) ウィンドウ を右クリックし、
    CreateC# Script を選択して新しいスクリプトを作成します。
  2. スクリプト名を PlayerMove とします。
  3. スクリプトをダブルクリックして開き、以下のコードを貼り付けます:

全体の説明

このスクリプトは、Unityでキャラクター(プレイヤー)を動かすためのものです。プレイヤーの動きは、キーボードの矢印キーや “WASD” キーによって制御されます。

各部分の説明

  1. using UnityEngine;
    • Unityの基本的な機能を使うための宣言です。
  2. public class PlayerMove : MonoBehaviour
    • PlayerMoveという名前のクラスを作っています。このクラスはMonoBehaviourを継承しています。MonoBehaviourは、Unityで使うスクリプトの基本となるクラスです。
  3. void Update()
    • Updateメソッドは、毎フレーム(画面が1回更新されるたびに)呼び出されます。ゲームの動きをリアルタイムで更新するのに使います。
  4. float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
    • Input.GetAxis("Horizontal")は、左右の入力(例えば左矢印キーや”A”キーで左、右矢印キーや”D”キーで右)を取得します。
    • Time.deltaTimeは、前のフレームから現在のフレームまでにかかった時間を取得します。これにより、動きが一定の速さで行われます。
    • 3.0fはプレイヤーの移動速度です。
    • これらを掛け合わせて、dxという変数に左右の移動量を計算して保存します。
  5. float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
    • Input.GetAxis("Vertical")は、前後の入力(例えば上矢印キーや”W”キーで前、下矢印キーや”S”キーで後)を取得します。
    • Time.deltaTime3.0fを掛け合わせて、dzという変数に前後の移動量を計算して保存します。
  6. transform.position = new Vector3(transform.position.x + dx, 0.5f, transform.position.z + dz);
    • 現在のプレイヤーの位置を取得して、新しい位置に更新します。
    • transform.position.x + dxは、新しいX座標です。
    • 0.5fはY座標です。このスクリプトでは常にプレイヤーを高さ0.5の位置に固定しています。
    • transform.position.z + dzは、新しいZ座標です。

全体の動き

  1. プレイヤーがキーボードの矢印キーや”WASD”キーを押すと、その入力がスクリプトに渡されます。
  2. 入力に応じて、プレイヤーの移動量(dxdz)が計算されます。
  3. 計算された移動量を元に、プレイヤーの新しい位置が決定されます。
  4. プレイヤーの位置が更新され、画面上で動きが見えるようになります。
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    void Update()
    {
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
        transform.position = new Vector3
        (
            transform.position.x + dx, 0.5f, transform.position.z + dz
        );
    }
}
  • スクリプトをCube (プレイヤー) にアタッチします。
    • プロジェクトウィンドウで PlayerMove スクリプトを選択し、ヒエラルキーのCubeにドラッグ&ドロップしてください。

2. 球体が落下するスクリプト

プレイヤーが球体の真下を通ると落下する仕組みを作ります。

  1. 新しいC#スクリプトを作成し、名前を SphereDrop にします。
  2. スクリプトをダブルクリックして開き、以下のコードを貼り付けます:

コード全体の説明

このスクリプトは、SphereDropというクラスを定義しています。クラスの中には、ターゲットとなるオブジェクト(target)とそのオブジェクトとの距離を計算して、一定の距離以内に入ったら重力を働かせる処理があります。

各部分の説明

  1. public GameObject target;
    • これは、他のオブジェクトを参照するための変数です。例えば、シーン上の特定のキューブやキャラクターなどを指すことができます。
  2. void Update()
    • Updateメソッドは、毎フレーム(画面が1回更新されるたび)に呼び出されるメソッドです。ここでは、ターゲットオブジェクトとの距離を毎フレーム計算し、一定の距離以内に入った場合に重力を働かせるかどうかを判断します。
  3. Vector3 cube = target.transform.position;
    • これは、ターゲットオブジェクトの位置を取得して、その位置をcubeという変数に保存しています。
  4. float dis = Vector3.Distance(cube, this.transform.position);
    • ここでは、ターゲットオブジェクトとこのスクリプトがアタッチされているオブジェクト(球体)の距離を計算しています。
  5. if (dis < 4.6f)
    • 距離が4.6未満の場合、次の処理を実行します。この距離は任意の数値で、どれくらい近づいたら重力を働かせるかを設定します。
  6. SphereGravity();
    • 距離が条件を満たした場合、SphereGravityメソッドを呼び出します。
  7. void SphereGravity()
    • このメソッドでは、球体にアタッチされているRigidbodyコンポーネントのuseGravityプロパティをtrueに設定して、球体に重力を働かせます。

全体の動き

  1. 毎フレーム、ターゲットオブジェクトとの距離を計算します。
  2. 距離が4.6未満になった場合、SphereGravityメソッドを呼び出します。
  3. SphereGravityメソッドは、球体に重力を働かせるように設定します。
using UnityEngine;

public class SphereDrop : MonoBehaviour
{
    public GameObject target;

    void Update()
    {
        Vector3 cube = target.transform.position;
        float dis = Vector3.Distance(cube, this.transform.position);

        if (dis < 4.6f)
        {
            SphereGravity();
        }
    }

    void SphereGravity()
    {
        GetComponent<Rigidbody>().useGravity = true;
    }
}
  1. スクリプトを球体 (Sphere) にアタッチします。
    • プロジェクトウィンドウで SphereDrop スクリプトを選択し、ヒエラルキーのSphereにドラッグ&ドロップしてください。
  2. ターゲット (Target) を設定します
    • Sphereを選択し、インスペクターの Target フィールドに Cube (プレイヤー) をドラッグ&ドロップします。



4. 実行してみよう

これまでの手順で、シーンの準備とスクリプトの設定が完了しました。最後に、プレイモードで実際に動作確認をしてみましょう!


プレイモードを開始する

  1. Unityエディター上部にある「Play ボタン」をクリックしてプレイモードを開始します。
  2. キーボードの 矢印キー または W/A/S/D を使ってプレイヤー (Cube) を動かしてみましょう。

球体が落下するか確認

  1. プレイヤーを球体の真下に移動させます。
  2. 球体 (Sphere) がプレイヤーの下を通過した瞬間に落下するか確認しましょう。

動作が正しい場合

以下のように動作していれば成功です!

  • プレイヤーが球体の真下を通過するまでは、球体は静止しています。
  • プレイヤーが球体の真下を通過した瞬間、球体が落下します。

うまくいかない場合のチェックポイント

  1. スクリプトが正しくアタッチされているか確認
    • Cubeに PlayerMove スクリプト、Sphereに SphereDrop スクリプトがアタッチされているかを確認してください。
  2. ターゲット (Target) が設定されているか確認
    • SphereDropスクリプトの Target フィールドに、Cubeが正しく設定されていることを確認してください。
  3. Rigidbodyが追加されているか確認
    • Sphereに Rigidbody コンポーネントが追加され、Use Gravity がチェックされていることを確認してください。

これで基本的なセットアップと動作確認は完了です!次は、仕組みを応用して複数の障害物やランダムな動きを追加することで、さらに面白い仕掛けを作ることもできます。チャレンジしてみてください! 🎮



よくある質問

Q
Rigidbody コンポーネントが見つかりません。どうすればいいですか?
A

ヒエラルキーで球体を選択し、インスペクターから「Add Component」をクリック。検索欄に「Rigidbody」と入力して追加してください。

Q
球体が落下しません。どうすればいいですか?
A

SphereDrop スクリプトの Target フィールドにプレイヤー (Cube) が設定されていることを確認してください。また、距離判定 (dis < 4.6f) を調整してみてください。

Q
プレイヤーが移動しません。どうすればいいですか?
A

PlayerMove スクリプトが正しくアタッチされているか確認し、Input 設定が有効になっていることをチェックしてください。

おすすめのアセット

プラットフォーマーエンジンは、Unityで2Dプラットフォームゲームを作成するための強力なテンプレートです。このエンジンを使えば、ジャンプや移動、敵との戦闘など、基本的なゲームプレイ要素を簡単に追加できます。