UnityUnityメモ

【初心者向け】Unityでぶつかると開く自動ドアを作る方法

Unity

1. はじめに

Unityを使ったゲーム開発では、「オブジェクト同士が衝突したら特定の動作をする」という仕組みはとてもよく使われます。たとえば、プレイヤーがボタンを押したらドアが開いたり、敵に攻撃を加えたらリアクションを返したりするのが典型的な例です。

この記事では、Cubeがドアにぶつかると開き、1秒後に自動的に閉まるという仕組みを作っていきます。必要な手順を、初心者の方でも分かりやすく解説していきます。


この仕組みを作ることで、ゲームのインタラクティブ性を高める技術が学べます。ドアの開閉だけでなく、他のオブジェクトにも応用可能なので、これからゲーム開発に挑戦する人にとって良い練習にもなるでしょう。

「Unityを触り始めたばかり」という方でも簡単に実践できる内容にしているので、安心して進めてください!それでは、準備から始めていきましょう!

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



2. 環境の準備

Unityを使ってプロジェクトを開始するために、まず必要な環境を整えましょう。


新しいプロジェクトの作成

Unityエディターを開いて、新しいプロジェクトを作成しましょう。

  1. Unity Hubでプロジェクトを作成
    Unity Hubの「プロジェクト」タブに移動し、「新規作成」ボタンをクリックします。
  2. テンプレートを選択
    テンプレート選択画面が表示されますので、「3D」を選んでください。これは3Dゲームの開発に最適な設定が含まれています。
  3. プロジェクトの名前を設定
    プロジェクト名を「DoorControl」として入力し、保存先を選択します。最後に「作成」ボタンをクリックすると、プロジェクトが開きます。

基本的な設定を確認する

  1. Unityの画面構成を確認
    プロジェクトが開いたら、Unityの画面構成を確認してください。主に使うのは以下のウィンドウです:
    • ヒエラルキー (Hierarchy): ゲームオブジェクトを管理するリスト。
    • シーン (Scene): ゲームの視覚的な作業スペース。
    • インスペクター (Inspector): オブジェクトの詳細設定を行うエリア。
  2. プロジェクトの保存
    必ず進捗を保存するようにしましょう。「File」メニューから「Save Project」を選ぶか、Ctrl+S(Macの場合はCmd+S)を使ってこまめに保存してください。

これでUnityの準備は完了です!次のステップでは、実際にオブジェクトを配置していきましょう。簡単な設定でも、ゲーム開発の第一歩を踏み出すことができます。ドキドキしてきましたね!それでは続けていきましょう!



3. オブジェクトの配置

UnityでCubeがぶつかるとドアが開く仕組みを作るために、まずは必要なオブジェクトを配置していきましょう。このステップでは、Player(Cube)、そしてドアを作成します。それぞれの手順を詳しく解説します!


床の配置

まずはオブジェクトを配置するための床を作成します。

  1. 「ヒエラルキー」ウィンドウで右クリックします。
  2. メニューから**「3D Object」→「Plane」**を選択します。
  3. 作成されたPlaneは床として使用されます。サイズや位置は初期設定のままでOKです。

これで、オブジェクトを置ける「床」が完成しました!


Playerの配置

次に、動いてドアにぶつかるオブジェクトを配置します。ここではCubeをPlayerとして使用します。

  1. 「ヒエラルキー」ウィンドウで右クリックします。
  2. メニューから**「3D Object」→「Cube」**を選びます。
  3. Cubeがシーンに追加されます。これがプレイヤーの代わりとなるオブジェクトです。

Rigidbodyの追加

Cubeが物理的に動作するために、Rigidbodyコンポーネントを追加します。

  1. 「インスペクター」ウィンドウでCubeを選択していることを確認します。
  2. 「Add Component」ボタンをクリックします。
  3. 検索バーに「Rigidbody」と入力し、表示されたRigidbodyコンポーネントを選択します。

これで、Playerオブジェクトが物理的な動きを持つようになりました。




ドアの配置

次に、開閉するドアを配置します。ここでもCubeを使用します。

  1. 「ヒエラルキー」ウィンドウで右クリックします。
  2. メニューから**「3D Object」→「Cube」**を選びます。
  3. このCubeを「ドア」として使用します。以下のように位置とサイズを調整してください:
    • Position(位置)X: 0, Y: 1, Z: 0
    • Scale(サイズ)X: 2, Y: 3, Z: 0.2

名前を「Door」に変更

  1. ヒエラルキーウィンドウでドアとして使用するCubeを選択します。
  2. 名前を「Door」に変更します。これでスクリプトで認識しやすくなります。

ドア管理オブジェクトの作成

ドアの制御を簡単にするため、管理用の空のオブジェクトを作成します。

  1. 「ヒエラルキー」ウィンドウで右クリックします。
  2. メニューから**「Create Empty」**を選びます。
  3. 空のオブジェクトの名前を**「DoorManage」**に変更します。

DoorManageの位置調整

  1. 「インスペクター」ウィンドウでDoorManageを選択します。
  2. Positionを次のように設定します:
    • X: 1, Y: 0, Z: 0(Doorの右下端に配置するイメージです)

ドアをDoorManageの子オブジェクトに設定

  1. 「ヒエラルキー」ウィンドウで「Door」を「DoorManage」にドラッグ&ドロップします。
  2. ドアがDoorManageの子オブジェクトとして登録されます。

これで、オブジェクトの配置は完了です!次のステップでは、スクリプトを作成してドアが開閉する仕組みを設定していきます。



4. スクリプトの作成

Unityでドアを開閉する仕組みを作るためには、スクリプトを記述してそれぞれのオブジェクトに割り当てる必要があります。ここでは、ドアを開閉するスクリプトと、Cubeが動いてドアにぶつかったときの挙動を制御するスクリプトを作成していきます。


ドアを制御するスクリプト

まずは、ドアを開閉するスクリプトを作成します。

  1. スクリプトの作成
    ヒエラルキーウィンドウを右クリックし、「Create」→「C#Script」を選びます。新しいスクリプトに「DoorOpen」と名前を付けます。
  2. スクリプトの記述
    「DoorOpen」スクリプトをダブルクリックして開き、以下のコードを入力してください。
using System.Collections;
using UnityEngine;

public class DoorOpen : MonoBehaviour
{
    public void DoorMove()
    {
        StartCoroutine("DoorRotate");
    }

    IEnumerator DoorRotate()
    {
        for (int turn = 0; turn < 90; turn++)
        {
            transform.Rotate(0, 1, 0); // ドアを90度回転
            yield return new WaitForSeconds(0.01f);
        }

        yield return new WaitForSeconds(1.0f); // ドアが開いた状態で1秒間待機

        for (int turn = 0; turn < 90; turn++)
        {
            transform.Rotate(0, -1, 0); // ドアを元の位置に戻す
            yield return new WaitForSeconds(0.01f);
        }
    }
}
  • スクリプトのアタッチ
    ヒエラルキーウィンドウで「DoorManage」オブジェクトを選択します。作成した「DoorOpen」スクリプトをドラッグ&ドロップして「インスペクター」ウィンドウにアタッチします。

Cubeの動作と衝突判定スクリプト

次に、Cubeを動かしてドアにぶつかったときにドアを開くためのスクリプトを作成します。

  1. スクリプトの作成
    再度ヒエラルキーウィンドウを右クリックし、「Create」→「C#Script」を選びます。新しいスクリプトに「CubeMove」と名前を付けます。
  2. スクリプトの記述
    「CubeMove」スクリプトを開き、以下のコードを入力してください。
using System.Collections;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    public GameObject door;

    void Start()
    {
        // "DoorManage"オブジェクトを検索して取得します
        door = GameObject.Find("DoorManage");

        // ドアが見つからない場合のエラーチェック
        if (door == null)
        {
            Debug.LogError("DoorManageオブジェクトが見つかりません。オブジェクト名を確認してください。");
        }
    }

    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, transform.position.y, transform.position.z + dz
        );
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "Door" && door != null)
        {
            door.GetComponent<DoorOpen>().DoorMove(); // ドアを開く
        }
    }
}
  1. スクリプトのアタッチ
    ヒエラルキーウィンドウでCubeを選択し、作成した「CubeMove」スクリプトをドラッグ&ドロップして「インスペクター」ウィンドウにアタッチします。

これで、必要なスクリプトの作成とアタッチが完了しました!次のステップでは、実際にテストプレイをして仕組みが正しく動作しているか確認しましょう。



5. テストプレイ

それでは、作成した仕組みが正しく動作するか確認しましょう!以下の手順でテストプレイを行いましょう。


① 再生ボタンをクリック

Unityエディターの上部にある「再生ボタン(▶)」をクリックします。これでシーンが実行されます。


② Cubeを動かしてみる

キーボードの矢印キーまたは「W」「A」「S」「D」キーを使って、Cubeを移動させます。Cubeが滑らかに動くことを確認してください。

  • 動かない場合:
    まず、Cubeに「Rigidbody」が正しく追加されているかを確認してください。次に、CubeMoveスクリプトがCubeにアタッチされているか確認しましょう。

③ ドアにCubeをぶつける

Cubeを移動させて、ドアにぶつけてみてください。以下のような動作が起こるはずです:

  1. ドアがスムーズに90度回転して開きます。
  2. 1秒間開いた状態が続きます。
  3. ドアが元の位置に戻り、閉じます。
  • ドアが開かない場合:
    ドアが開かない場合は、次の点をチェックしてください:
    • 「DoorManage」オブジェクトにDoorOpenスクリプトが正しくアタッチされているか。
    • CubeMoveスクリプト内でGameObject.Find("DoorManage")が正しく動作しているか。
    • ドアのオブジェクト名が「Door」に設定されているか。

④ コンソールの確認

もし動作がおかしい場合やエラーが発生している場合は、Unityエディター下部の「Console」タブを確認してください。以下のようなメッセージが表示されるかもしれません:

  • “DoorManageオブジェクトが見つかりません。”
    → ドア管理オブジェクトの名前が正しく設定されているか、またプロジェクト内で削除されていないか確認してください。
  • “NullReferenceException”
    → スクリプト内で参照が正しく設定されていない可能性があります。特にGameObject.Findやスクリプトのアタッチを確認しましょう。

⑤ 動作を改善したい場合

テストプレイ中に以下の点を調整することで、さらに良い動きを実現できます:

  • ドアの開閉速度を調整:yield return new WaitForSeconds(0.01f);の値を変更する。
  • ドアの開く角度を変更:for (int turn=0; turn<90; turn++)の90を他の値に変更する。

無事にテストプレイが完了すれば、Cubeがドアにぶつかると開く仕組みの完成です。動作を確認しながら、ゲームの演出を追加してみましょう!例えば、ドアが開く際に音を鳴らしたり、エフェクトを追加することでさらに魅力的なゲームに仕上げることができます。



よくある質問

Q
Rigidbodyを追加しないとどうなりますか?
A

RigidbodyがないとCubeに物理挙動が適用されず、ドアにぶつかる動作が正しく機能しません。

Q
ドアが開かない原因は何ですか?
A

スクリプトが正しくアタッチされているか、またはオブジェクト名が間違っていないか確認してください。

Q
他のキーでCubeを動かしたい場合、どう変更すればいいですか?
A

Input.GetAxisの部分を、Input.GetKeyなどに変更することで、特定のキーで制御できます。

おすすめのアセット

「Door System」は、ゲーム内でのドア操作を簡単に実装できるツールキットです。このアセットを使えば、ドアの開閉やロック、アンロックなどの機能を簡単に設定できます。直感的なインターフェースで、複雑なコーディングなしにドアシステムを導入できるので、初心者にも安心です。

特徴として、アニメーション対応、カスタマイズ可能なサウンドエフェクト、さまざまなドアタイプのサポートがあります。また、ドアの動作をトリガーする条件も多様で、キーアイテムやプレイヤーの接近など、柔軟に設定できます。

このアセットは、FPS、RPG、アドベンチャーゲームなど、あらゆるジャンルのゲーム開発に役立ちます。プロジェクトにリアルなドアの動きを簡単に追加したい方におすすめです。