UnityUnityメモ

Unity初心者向け!プレイヤーが乗ると落下する床を作る方法

Unity

1. はじめに

Unityを使ってゲームを作り始めたばかりの方にとって、動きのある仕掛けを作るのはとても楽しい経験ですよね!この記事では、**「プレイヤーが乗ると落下する床」**を作成する方法をご紹介します。

この仕掛けは、プレイヤーが床の上に乗った瞬間に床が落下するというシンプルなものですが、ゲームに緊張感や驚きを与える効果的な要素です。この記事を読むことで、Raycastを使ってオブジェクトを検知し、Rigidbodyで物理的な動きを制御する方法を学べます。

初心者でもわかりやすいステップで進めていくので安心してください!最終的には、自分でカスタマイズして、ユニークな仕掛けを作れるようになるはずです。

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



2. 準備:シーンにオブジェクトを配置する

まずは、Unityのシーンに必要なオブジェクトを配置していきましょう。ここでは、プレイヤーが移動する床(FloorAとFloorB)と、プレイヤーとなるSphereを作成して配置します。また、これらが物理的に動作するために、Rigidbodyコンポーネントを追加します。


床(FloorAとFloorB)を作成する

  1. ヒエラルキー(Hierarchy)ウィンドウを開きます
    空白部分を右クリックして、メニューを表示します。
  2. 「3D Object」→「Cube」を選択
    シーンに新しいCubeが作成されます。このCubeが床となります。
  3. 名前を「FloorA」に変更
    作成したCubeを選択し、インスペクター(Inspector)ウィンドウ上部の名前を「FloorA」に変更します。
  4. サイズを調整
    インスペクターウィンドウで、以下のように「Transform」のScaleを設定します:
    • X: 5
    • Y: 0.5
    • Z: 5
  5. もう1つの床を作成
    同じ手順で、もう1つのCubeを作成し、名前を「FloorB」に変更します。こちらも同様のScale設定を行い、シーン上でFloorAの隣に配置してください。

プレイヤー(Sphere)を作成する

  1. ヒエラルキーを右クリック
    「3D Object」→「Sphere」を選択します。
  2. Sphereを床の上に配置
    シーンビューでSphereをドラッグして、FloorAの上に置きます。

Rigidbodyコンポーネントを追加する

  1. FloorBにRigidbodyを追加
    • ヒエラルキーでFloorBを選択します。
    • インスペクターウィンドウの「Add Component」をクリックし、「Rigidbody」を検索して追加します。
    • 「Is Kinematic」にチェックを入れます。これにより、FloorBが物理的に動く準備ができますが、まだ動かない状態にします。
  2. SphereにもRigidbodyを追加
    • ヒエラルキーでSphereを選択し、同様にRigidbodyを追加します。
    • Sphereの場合、「Is Kinematic」のチェックは不要です。これにより、プレイヤーが物理的に床の上を移動できるようになります。

これで準備は完了です!次のステップでは、プレイヤーが床に乗ったときに床が落下する動きをスクリプトで実装していきます。お楽しみに!



3. 床の動きを制御するスクリプト

ここでは、プレイヤー(Sphere)が床に乗った瞬間にその床が落下する仕組みをスクリプトで実装します。このスクリプトでは、Unityの**Raycast(レイキャスト)**という機能を使用します。Raycastを使うことで、床がプレイヤーの位置を検知できるようになります。


スクリプトの作成

  1. スクリプトを作成する
    • プロジェクトウィンドウを右クリックします。
    • 「Create」→「C# Script」を選択し、スクリプト名を「FloorMove」とします。
    • 作成したスクリプトをダブルクリックして開きます。
  2. 以下のコードを入力してください
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FloorMove : MonoBehaviour
{
    private float rayDistance;

    void Start()
    {
        // レイキャストの距離を設定
        rayDistance = 1.0f;
    }

    void Update()
    {
        // 床の真上方向にレイを発射
        Vector3 rayPosition = transform.position + new Vector3(0.0f, 0.0f, 0.0f);
        Ray ray = new Ray(rayPosition, Vector3.up);
        Debug.DrawRay(rayPosition, Vector3.up * rayDistance, Color.red);

        RaycastHit hit;
        // Sphereがレイに触れたら床が落下
        if (Physics.Raycast(ray, out hit, rayDistance))
        {
            if (hit.collider.name == "Sphere")
            {
                DropDown();
            }
        }
    }

    // 床を落下させる処理
    void DropDown()
    {
        GetComponent<Rigidbody>().isKinematic = false;
    }
}

コードのポイント

  • レイキャストとは?
    • レイキャストは、ある位置から指定した方向に向けて見えない線を発射し、その線が何かにぶつかったかどうかを判定する機能です。
    • このコードでは、床の真上に向かってレイを発射し、プレイヤー(Sphere)がそのレイに触れた場合に落下処理を行います。
  • Debug.DrawRay
    • シーンビューでレイを視覚的に確認できるデバッグ用の機能です。これを使うと、床の真上に赤い線が表示され、レイの動作を確認できます。
  • DropDownメソッド
    • このメソッドでは、床に設定されたRigidbodyコンポーネントのisKinematicfalseに変更することで、床を物理的に落下させます。

スクリプトをアタッチする

作成したスクリプトをUnityエディターに戻り、「FloorB」にドラッグ&ドロップしてアタッチします。

  1. ヒエラルキーで「FloorB」を選択。
  2. 「FloorMove」スクリプトを「FloorB」にドラッグ&ドロップ。

次は、プレイヤーを動かすスクリプトを作成して、床へ移動できるようにします!



4. プレイヤー操作のスクリプト

この記事のこの部分では、プレイヤー(Sphere)が矢印キーで自由に動けるようにするスクリプトを作成します。Unity初心者の方でもわかりやすく、丁寧に解説しますので安心してください!


スクリプトの作成方法

まず、プロジェクトウィンドウで新しいスクリプトを作成します。以下の手順を進めてみてください:

  1. プロジェクトウィンドウで右クリック
    空白部分を右クリックして、「Create」→「C# Script」を選びます。
  2. スクリプトに名前をつける
    新しいスクリプトの名前を「SphereMove」とします。
  3. スクリプトを編集する
    作成した「SphereMove」スクリプトをダブルクリックして開き、以下のコードを入力してください:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SphereMove : MonoBehaviour
{
    void Update()
    {
        // 上矢印キーで前進
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(0f, 0f, 0.05f);
        }
        // 下矢印キーで後退
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(0f, 0f, -0.05f);
        }
        // 左矢印キーで左移動
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(-0.05f, 0f, 0f);
        }
        // 右矢印キーで右移動
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(0.05f, 0f, 0f);
        }
    }
}

コードの説明

  1. Update()メソッド
    このメソッドは、毎フレーム呼び出されます。ユーザーが矢印キーを押しているかどうかを常に確認します。
  2. Input.GetKey()
    矢印キー(KeyCode.UpArrow など)を押した場合に、対応する移動処理が実行されます。
  3. transform.Translate()
    オブジェクトを指定した方向に動かします。例えば、transform.Translate(0f, 0f, 0.05f) はZ軸方向に前進します。

スクリプトのアタッチ方法

  1. Sphereを選択
    ヒエラルキーで「Sphere」をクリックして選択します。
  2. スクリプトをアタッチ
    プロジェクトウィンドウから「SphereMove」スクリプトをドラッグ&ドロップで、Sphereにアタッチします。

これでプレイヤー操作のスクリプトが完成しました。次のステップでは、床の動きを制御するスクリプトと連動させて、落下する床を実現します。



5. スクリプトをアタッチしてテストプレイ

ここでは、実際にゲーム内で動作を確認する方法を解説します。

テストプレイを実行する

  1. ゲームを再生
    • Unityエディターの上部にある「▶︎」ボタン(再生ボタン)をクリックして、シーンを再生します。
  2. Sphereを操作して床を渡る
    • 上下左右の矢印キーを使って、Sphereを動かします。
    • 「FloorB」の上にSphereが乗ると、Raycastがプレイヤーを検知し、床が落下するはずです。
  3. 動作の確認
    • 以下の動作が正しいか確認してください。
      • Sphereが「FloorA」から「FloorB」に移動できる。
      • 「FloorB」の上にSphereが乗ると、床が落下する。
      • 「FloorA」はそのまま残っている。

問題が発生した場合の対処法

もし以下の問題が発生した場合、設定を見直してください。

  • 床が落下しない場合
    • 「FloorB」にRigidbodyコンポーネントが正しく追加されているか確認してください。
    • 「Is Kinematic」のチェックが初期状態でオンになっているか確認してください。
    • 「FloorMove」スクリプトが正しくアタッチされているか確認してください。
  • Sphereが動かない場合
    • 「SphereMove」スクリプトが正しくアタッチされているか確認してください。
    • 矢印キーが効いているか(入力が受け付けられるか)確認してください。

これで、簡単なテストプレイが完成です! プレイヤーが動いて床が落下する動きを確認できましたね。次は、この仕組みをさらに応用して、複雑なギミックを作ってみてください!



まとめ

この記事では、Unityで「プレイヤーが乗ると落下する床」を作る方法を学びました。

この仕組みは、アクションゲームやパズルゲームのギミックなど、さまざまなゲームで応用が可能です。


例えば、以下のようなアイデアに発展させることができます:

  • 一定時間が経過すると床が落ちる仕掛けを作る。
  • 床が落ちるだけでなく、消えるエフェクトを追加する。
  • プレイヤーの重さに応じて床の落下速度を変える。

Unityを使うと、アイデア次第で面白い仕掛けを簡単に作成できます。今回の記事を参考にして、ぜひあなた自身のゲーム開発に役立ててみてください!



よくある質問(FAQ)

Q
プレイヤーが床に乗ったのに床が落ちません。原因は何ですか?
A

主な原因として以下の可能性が考えられます:

  • 「FloorMove」スクリプトが正しくアタッチされていない。ヒエラルキーで「FloorB」を選択し、スクリプトがインスペクターに表示されているか確認してください。
  • Raycastの距離(rayDistance)が短すぎる可能性があります。「FloorMove」スクリプト内で値を大きめに設定してみてください。例:rayDistance = 1.5f;
  • Sphereの名前が「Sphere」になっていない場合、スクリプトで検知されません。ヒエラルキーで名前を確認し、正しく設定してください。
Q
Sphereが移動しません。どうしたらいいですか?
A

以下を確認してください:

  • 「SphereMove」スクリプトがSphereにアタッチされているか確認してください。インスペクターにスクリプトが表示されていない場合、ドラッグ&ドロップでアタッチしましょう。
  • Unityの「Game」ビューが選択されていることを確認してください。「Scene」ビューではプレイモードでの動きが反映されません。
  • キーボード入力が反応しない場合、別のキー(例:矢印キーではなくWASDキー)に変更してみてください。
Q
床が最初から落ちてしまいます。どうすれば直せますか?
A

床が最初から落ちる場合、以下を確認してください:

  • Rigidbodyコンポーネントの「Is Kinematic」がチェックされていない可能性があります。ヒエラルキーで「FloorB」を選択し、インスペクターのRigidbody設定を確認してください。「Is Kinematic」にチェックを入れておくと、床はスクリプトで動作を指示されるまで落ちません。
  • 床の位置が適切か確認してください。Sphereの直下に床が配置されているか、必要に応じて調整してください。

おすすめのアセット

Retro Casual Games Bundle #1は、複数のレトロ風カジュアルゲームを簡単に作成できるテンプレートパックです。このバンドルには、クラシックなスネークゲームやバブルシューティングゲームなどが含まれており、初心者でもすぐに活用可能なゲーム制作ガイド付きです。モバイル向けに最適化されており、アーケードスタイルのゲームを作りたい方におすすめのアセットです。