UnityUnityメモ

初心者向け:Unityで簡単に自動ドアを作成する手順

Unity

1. はじめに

Unityを使ってゲーム開発を始めると、「自動ドア」のような動作を実装してみたくなることがありますよね。今回の記事では、Unity初心者でも簡単に実現できる「自動ドア」を作る方法をご紹介します!

具体的には、プレイヤーが近づくとドアが自動で開き、通過した後に閉じる仕組みを作成します。また、ドアが開いている最中にプレイヤーがエリアから離れると、途中でもドアが閉じるような動きも実装していきます。

これを実現するために、Unityの OnTrigger 機能を使ってプレイヤーの動きを感知し、ドアの開閉を制御します。難しそうに聞こえるかもしれませんが、この記事を読めば初心者の方でも分かりやすく作れるように丁寧に解説します。


この記事を最後まで読むことで、以下のスキルを身に付けられます:

  • Unityの基本的なオブジェクト配置方法
  • OnTriggerを使用した当たり判定の使い方
  • 簡単なスクリプトを使った動作の制御

一緒に楽しみながら学んでいきましょう!では、さっそく始めましょう!

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



2. 必要な準備

Unityで簡単な自動ドアを作るためには、まずUnityの環境を整えましょう。以下のステップで必要な準備を進めていきます。


新規プロジェクトの作成

  1. Unity Hubを開き、「新規プロジェクト」をクリックします。
  2. テンプレートで「3D」を選択し、プロジェクト名を入力します(例: AutoDoorProject)。
  3. 「作成」ボタンを押してプロジェクトを立ち上げます。

必要なフォルダ構成

プロジェクトの整理をスムーズにするため、以下のフォルダを作成します。

  1. プロジェクト(Project)ウィンドウを右クリックして「Create」→「Folder」を選択。
  2. 必要なフォルダを作成します。
    • Materials: マテリアルを保存するフォルダ。
    • Scripts: スクリプトを保存するフォルダ。
    • Prefabs: プレハブを保存するフォルダ(後で使います)。

これで準備完了です!次は、Unity上で自動ドアを作成するための具体的な手順に進んでいきましょう。



3. シーン構成

Unityで自動ドアを作るためには、まずシーンの基本構成を設定します。以下の手順に従って進めていきましょう!


1. 平面(床)の作成

シーンに地面となる平面を追加します。

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. メニューから「3D Object」→「Plane」を選択します。
  3. 作成されたPlaneが地面として機能します。

これでプレイヤーが動くための土台が完成しました!


2. プレイヤーの作成

次に、プレイヤーオブジェクトを作成します。

  1. ヒエラルキーウィンドウを右クリックして「3D Object」→「Cube」を選択します。
  2. 作成したCubeを選択し、名前を「Player」に変更します。
  3. インスペクター(Inspector)ウィンドウで「Add Component」をクリックし、「Rigidbody」を検索して追加します。

これでプレイヤーは物理的な移動が可能になりました。


3. ドアの作成

自動ドアのメインとなる部分を作ります。

  1. ヒエラルキーウィンドウを右クリックして「3D Object」→「Cube」を選択します。
  2. Cubeを選択し、名前を「DoorObject」に変更します。
  3. インスペクターウィンドウでScale(スケール)を以下のように変更します:
    • Scale: (2, 2, 0.1)
  4. これでドアの形が整いました。

4. 空のオブジェクトの作成

ドアをグループ化するための空のオブジェクトを用意します。

  1. ヒエラルキーウィンドウを右クリックして「Create Empty」を選択します。
  2. 名前を「Door」に変更します。
  3. DoorObjectをドラッグ&ドロップして「Door」の子オブジェクトにします。

これでドアとその親オブジェクトの構成が完成しました。


5. トリガーエリアの作成

プレイヤーが近づいたことを検知するためのエリアを作成します。

  1. ヒエラルキーウィンドウを右クリックして「3D Object」→「Cube」を選択します。
  2. Cubeの名前を「TouchArea」に変更します。
  3. インスペクターウィンドウで「Box Collider」の「Is Trigger」にチェックを入れます。
  4. TouchAreaをドアの前に配置します。

6. トリガーエリアの透明化

トリガーエリアは見えないように設定します。

  1. プロジェクト(Project)ウィンドウを右クリックして「Create」→「Material」を選択します。
  2. 新しいマテリアルに「Toumei」と名前を付けます。
  3. インスペクターウィンドウで以下の設定を行います:
    • Rendering Mode: Fade
    • AlbedoのAlpha値: 0
  4. 作成した「Toumei」マテリアルを「TouchArea」にドラッグ&ドロップします。

これでトリガーエリアが見えなくなり、自然な見た目のシーンが完成します。


次のステップでは、プレイヤーの動きを制御するスクリプトや、ドアの開閉を制御するスクリプトを作成していきます!



4. スクリプトの作成

Unityで自動ドアを作成するための主要な部分が「スクリプト」です。以下では、プレイヤーの移動を制御する「PlayerMoveスクリプト」と、ドアの開閉を制御する「DoorOpenスクリプト」の作成手順と、その役割について詳しく説明します。


PlayerMoveスクリプトの作成

  1. スクリプトの新規作成 プロジェクトウィンドウを右クリックして、「Create」→「C# Script」を選択します。スクリプトの名前を 「PlayerMove」 と入力してください。
  2. スクリプトを編集 以下のコードを「PlayerMove」スクリプトに書き込んでください:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public bool isArea;

    void Start()
    {
        isArea = false;
    }

    void Update()
    {
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;
        transform.position = new Vector3(transform.position.x + dx, transform.position.y, transform.position.z + dz);
    }

    void OnTriggerStay(Collider other)
    {
        if (other.gameObject.name == "TouchArea")
        {
            isArea = true;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "TouchArea")
        {
            isArea = false;
        }
    }
}
  1. 解説
    • Update メソッド:矢印キーまたはWASDキーでプレイヤーを動かせるようにしています。
    • OnTriggerStayOnTriggerExit:プレイヤーが「TouchArea」に入ったかどうかを判定します。「isArea」変数がその状態を管理します。
  2. スクリプトをアタッチ ヒエラルキーの「Player」オブジェクトに、このスクリプトをドラッグ&ドロップしてアタッチしてください。

DoorOpenスクリプトの作成

  1. スクリプトの新規作成 再びプロジェクトウィンドウを右クリックして、「Create」→「C# Script」を選択します。スクリプトの名前を 「DoorOpen」 と入力します。
  2. スクリプトを編集 以下のコードを「DoorOpen」スクリプトに書き込んでください:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorOpen : MonoBehaviour
{
    private Vector3 pos;
    public GameObject player;

    void Update()
    {
        pos = transform.position;

        if (player.GetComponent<PlayerMove>().isArea == true)
        {
            if (pos.x < 2f)
            {
                transform.Translate(0.02f, 0, 0);
            }
        }

        if (player.GetComponent<PlayerMove>().isArea == false)
        {
            if (pos.x > 0)
            {
                transform.Translate(-0.02f, 0, 0);
            }
        }
    }
}
  1. 解説
    • player フィールド:プレイヤーの状態を参照するために必要です。
    • ドアの位置制御:プレイヤーが「TouchArea」にいるときだけドアが開き、いなくなると閉じます。
    • transform.Translate:ドアの動きを実現するためのメソッドです。
  2. スクリプトをアタッチ
    • ヒエラルキーで「Door」オブジェクトを選択し、このスクリプトをドラッグ&ドロップしてアタッチします。
    • インスペクターウィンドウで「Player」フィールドに「Player」オブジェクトをドラッグ&ドロップしてください。

以上で、Unityの自動ドアを動かすためのスクリプト作成は完了です!次のステップでは、これらのスクリプトを使用して動作確認を行いましょう。



5. 動作確認とトラブルシューティング

さて、ここまでで自動ドアの基本設定は完了しました!次は、ゲームを実行してちゃんと動作するか確認してみましょう。うまくいかない場合の解決法も一緒に紹介します。


1. ゲームを実行して動作確認

  1. プレイヤーを動かしてみる
    • プレイボタン(▶️)をクリックしてゲームを実行します。
    • キーボードの矢印キーまたはWASDキーでプレイヤー(Player)を移動させます。
    • プレイヤーがドアに近づくと自動で開き、離れると閉じることを確認しましょう。
  2. 正常動作のチェックポイント
    • ドアが開閉しているか?
    • プレイヤーがドアを通り抜けられるか?
    • プレイヤーが離れたときにドアが確実に閉じるか?

2. トラブルシューティング

もし、うまく動作しない場合は以下を確認してください:

  1. スクリプトが正しくアタッチされているか?
    • 「PlayerMove.cs」がPlayerオブジェクトにドラッグ&ドロップされているか確認してください。
    • 「DoorOpen.cs」がDoorオブジェクトにドラッグ&ドロップされているか確認してください。
  2. TouchAreaの「Is Trigger」が有効か?
    • TouchAreaオブジェクトの「Box Collider」の「Is Trigger」にチェックが入っているかを確認してください。
    • これが無効だとプレイヤーが触れても反応しません。
  3. Playerフィールドの設定が正しいか?
    • Doorオブジェクトにアタッチされた「DoorOpen」スクリプトのインスペクターウィンドウで、PlayerフィールドにPlayerオブジェクトをドラッグ&ドロップしたかを確認してください。
  4. スクリプトのエラーを確認する
    • Unityエディター下部の「Console」タブでエラーメッセージが表示されていないか確認してください。
    • エラーがある場合、該当スクリプトを再度見直しましょう。
  5. プレイヤーの動きがスムーズでない場合
    • RigidbodyがPlayerに追加されているか?
    • Rigidbodyの「Use Gravity」がオンになっていないか(必要であればオフに設定)。
  6. ドアが開閉しない場合
    • DoorOpenスクリプト内の条件文が正しいかチェックしましょう。
    • ドアの位置(transform.position)の数値がスクリプト内の条件と一致しているか確認してください。

3. 動作確認のポイントを振り返る

  • Playerの移動がスムーズに行えるか?
  • ドアが正しいタイミングで開閉しているか?
  • プレイヤーがTouchAreaから離れるとドアが閉じるか?

これらを確認して、もし問題がなければ自動ドアの完成です!次に、アニメーションを追加するなど、さらなるカスタマイズにも挑戦してみてください。



6. まとめ

今回のチュートリアルでは、Unityを使って自動ドアを作る方法を一から解説しました。プレイヤーが近づくとドアが開き、離れると閉じる仕組みを、シンプルなスクリプトと設定で実現できましたね!以下に、記事の内容をおさらいします:


  1. シーンの準備
    平面(床)、プレイヤー、ドア、トリガーエリアなどのオブジェクトを作成し、それぞれに適切なコンポーネントを設定しました。
  2. スクリプトの作成
    • PlayerMove.csでプレイヤーの移動とトリガーエリア内での当たり判定を実装しました。
    • DoorOpen.csでトリガーの情報を基にドアの開閉を制御しました。
  3. 動作確認
    スクリプトをオブジェクトにアタッチし、ゲームを実行して動作を確認しました。プレイヤーがエリアに入るとドアがスムーズに開き、エリアを離れると閉じる動きを実現しました。

このチュートリアルを参考にして、自分のゲームに応用してみてください!例えば、ドアをスライドではなく回転させたり、音を追加してよりリアルな演出を加えることもできます。また、今回学んだOnTriggerRigidbodyの使い方は、さまざまなシーンで応用可能です。

ゲーム開発は試行錯誤の連続ですが、その分楽しさも倍増します!引き続き、Unityの機能を活用して、自分だけのオリジナルゲームを作っていきましょう。応援しています!



よくある質問

Q
ドアが正しく動かないのですが、どうすればいいですか?
A

スクリプトやオブジェクトの設定を再確認しましょう。特に、ドアの位置設定やスクリプトのアタッチが正しいか確認してください。

Q
トリガーが反応しません。どうしたらいいですか?
A

トリガーエリアの「Is Trigger」が有効になっているか、プレイヤーのタグが「Player」に設定されているか確認してください。

Q
ドアの開く速度を変更したいです。どうすればいいですか?
A

スクリプトのtransform.Translateの値を変更してください。値を大きくすると速く、小さくすると遅くなります。

おすすめのアセット

「Door System」は、Unityで簡単にドアの開閉機能を実装できるツールです。複雑なスクリプトを書かずに、ドラッグアンドドロップで動作させることができます。このアセットは、自動ドア、手動ドア、鍵付きドアなど、さまざまなドアのタイプをサポートしています。ドアの設置や設定が初心者でも簡単に行えます。