UnityUnityメモ

Unityでパスワードを使ったドアを作成!初心者向けステップバイステップ解説

Unity

1. はじめに

Unityを使ったゲーム開発では、プレイヤーがゲーム内で特定の条件を満たすとイベントが発生する仕組みを作ることがよくあります。その中でも「パスワードを入力するとドアが開く」というシステムは、謎解きゲームやアドベンチャーゲームなどでよく使われる面白い仕掛けの一つです。

この記事では、Unity初心者の方でも簡単に理解できるように、ステップバイステップでこのシステムを作る方法を解説します。プレイヤーがドアに触れるとパスワード入力フィールドが表示され、正しいパスワードを入力するとドアが開き、一定時間後に自動で閉じる仕組みを作成します。


このチュートリアルを通じて、以下のスキルを学べます:

  • 3Dオブジェクトの作成と配置
  • ユーザーインターフェース(UI)の設定
  • C#スクリプトを使った簡単な動作の制御
  • プレイヤーとオブジェクトの連携

完成すると、プレイヤーがパスワードを入力して進む仕掛けを備えたシンプルなシーンが作れます。Unityを始めたばかりの方でも安心して取り組める内容ですので、ぜひ挑戦してみてください!

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



2. 必要な準備

この記事では、Unityを使ってパスワードを入力すると開くドアを作成します。そのためには、いくつかの準備が必要です。以下の手順に沿って進めてください。


2-1. 新規プロジェクトの作成

  1. Unity Hubを起動し、画面右上の「新しいプロジェクト」をクリックします。
  2. テンプレートとして「3D」を選択し、プロジェクト名を「PasswordDoor」と入力します。
  3. 保存場所を指定して「作成」をクリックします。

これで、新しい3Dプロジェクトが作成され、Unity Editorが開きます。


2-2. 簡単な操作説明

Unityに慣れていない方のために、基本的な操作を簡単に紹介します。

  1. シーンビュー
    中央に表示されるエリアで、ゲームオブジェクトを配置したり動かしたりするエリアです。マウスの右クリックで視点を回転させたり、ホイールでズームイン・ズームアウトできます。
  2. ヒエラルキーウィンドウ
    左側に表示されるウィンドウで、シーン内のオブジェクトを一覧表示しています。ここでオブジェクトを右クリックして新しい3Dオブジェクトや空のオブジェクトを追加できます。
  3. プロジェクトウィンドウ
    画面下部にあるウィンドウで、プロジェクト内のアセット(スクリプトや素材など)を管理します。右クリックで新しいスクリプトやフォルダを作成可能です。
  4. インスペクターウィンドウ
    右側に表示されるウィンドウで、選択したオブジェクトの詳細設定を確認・編集できます。オブジェクトにスクリプトをアタッチしたり、物理特性を追加したりする際に使います。

これで、プロジェクトを開始する準備が整いました!次のステップでは、ドアと床の作成を行います。それでは進めていきましょう!



3. ドアの作成

ここでは、3Dオブジェクトを使ってドアを作成し、動きを管理するための準備をします。Unityの基本操作を使うので、初心者でも簡単に進められますよ!


3-1. Plane(床)の作成

まずは床を作成して、ゲーム内の基盤となる部分を設定します。

  1. ヒエラルキーウィンドウを右クリックします。
  2. メニューから「3D Object」→「Plane」を選択します。
  3. 作成されたPlaneを選択し、位置(Position)を (0, 0, 0) に設定して中央に配置します。

これでキャラクターやドアを置く土台が完成しました!


3-2. Cube(ドア)の作成

次に、ドアとして機能するCubeを作成します。

  1. ヒエラルキーウィンドウを右クリックします。
  2. メニューから「3D Object」→「Cube」を選択します。
  3. 作成されたCubeを選択し、名前を「Door」に変更します。
  4. インスペクターウィンドウで以下のようにサイズを調整してください:
    • Position: (0, 1.5, 0)
    • Scale: (2, 3, 0.2)

これで、ドアとして見た目も動作も適したオブジェクトができました!


3-3. ドア管理用のオブジェクト作成

ドアを管理するための空のオブジェクトを作成し、親子関係を設定します。

  1. ヒエラルキーウィンドウを右クリックし、「Create Empty」を選択します。
  2. 作成された空のオブジェクトを「DoorManage」と名前を付けます。
  3. Position(1, 0, 0) に設定します。これにより、ドアの右下端に配置されます。
  4. ヒエラルキーウィンドウで「Door」を「DoorManage」の子オブジェクトとしてドラッグ&ドロップします。

これでドアの作成が完了です!次のステップでは、ドアを動かすスクリプトを作成します。楽しみにしていてくださいね!



4. スクリプトの作成とアタッチ

ここでは、ドアの動きを制御するスクリプトを作成し、それを適切なオブジェクトにアタッチする方法を解説します。初心者の方でも分かりやすいように、ステップごとに進めていきますね!


ステップ1: スクリプトを作成する

まず、プロジェクトウィンドウでスクリプトを作成しましょう。

  1. プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選択します。
  2. 新しいスクリプトに「DoorOpen」という名前を付けます。

これでスクリプトが作成されました!


ステップ2: スクリプトにコードを入力する

作成した「DoorOpen」スクリプトをダブルクリックして開き、以下のコードを入力してください。

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

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

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

        // 1秒間待つ
        yield return new WaitForSeconds(1.0f);

        // ドアを90度閉じる
        for (int turn = 0; turn < 90; turn++)
        {
            transform.Rotate(0, -1, 0); // Y軸を逆回転
            yield return new WaitForSeconds(0.01f);
        }
    }
}

このスクリプトでは、ドアが回転して開閉する動きをコルーチンで実現しています。


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

次に、このスクリプトを空のオブジェクト「DoorManage」にアタッチします。

  1. ヒエラルキーウィンドウで「DoorManage」を選択します。
  2. 「Inspector」ウィンドウにスクリプトをドラッグ&ドロップします。

これで「DoorOpen」スクリプトが「DoorManage」にアタッチされました。


ステップ4: ドアオブジェクトの親子関係を確認する

「Door」オブジェクトが「DoorManage」の子オブジェクトになっているか確認してください。これにより、スクリプトでドアを制御できるようになります。

  1. 「ヒエラルキーウィンドウ」で「DoorManage」の左側にある矢印をクリックします。
  2. 子オブジェクトとして「Door」が表示されていれば設定完了です。

これでスクリプトの作成とアタッチの工程は完了です!次のステップでは、プレイヤーがドアに接触したときにパスワード入力を行えるように設定していきますよ!



5. パスワード入力フィールドの設定

この記事では、プレイヤーが正しいパスワードを入力できるように、画面上にパスワード入力フィールド(InputField)を設置します。これを実現するための手順をわかりやすく説明します!


ステップ1: InputFieldの作成

  1. ヒエラルキーウィンドウで右クリックし、「UI」→「Legacy」→「Input Field」を選択します。InputFieldが作成され、ヒエラルキーに追加されます。
  2. 作成したInputFieldの名前を分かりやすく「PasswordField」に変更しておきましょう。

ステップ2: InputFieldの配置

  1. PasswordFieldを選択した状態で、インスペクター内の「Rect Transform」を調整し、フィールドの位置を画面の中央下あたりに移動します。
    • 例えば、以下の値に設定すると見やすく配置できます:
      • Position X: 0
      • Position Y: -200
      • Width: 200
      • Height: 30
  2. フィールドが小さすぎる場合は「Width」や「Height」の値を増やして調整してください。

ステップ3: InputFieldの外観をカスタマイズ

デフォルトのままだと少し味気ないので、InputFieldの見た目を調整してみましょう。

  1. PasswordFieldを選択し、子要素の「Placeholder」をクリックします。
    • インスペクター内で「Text」を変更し、たとえば「ここにパスワードを入力」と入力します。
  2. 次に「Text」のフォントサイズや色を調整し、見やすくカスタマイズします。
    • フォントサイズを16~20程度に設定するとよいでしょう。

ステップ4: InputFieldを非表示にする

プレイヤーがドアに触れるまではInputFieldが表示されないように設定します。

  1. PasswordFieldを選択した状態で、インスペクター内の「チェックボックス」を外して非表示にします。
  2. 後ほど「CubeMove」スクリプトでプレイヤーがドアに触れたときにフィールドを表示する機能を追加します。

ステップ5: InputFieldの機能をリンク

  1. ヒエラルキーウィンドウで、InputField(PasswordField)を選択します。
  2. インスペクター内の「On Submit ()」セクションを探します。
  3. +ボタン」を押してイベントを追加し、「Cube(プレイヤー)」をドラッグ&ドロップします。
  4. ドロップダウンメニューから「CubeMove」スクリプトの「InputPass()」を選択します。

これで、パスワード入力フィールドが完成しました!次のステップでは、プレイヤーが正しいパスワードを入力した際のドアの動作を設定していきます。



6. プレイヤーキャラクターの追加

この記事では、プレイヤーキャラクターとして使用するオブジェクトを追加し、自由に移動できるように設定します。このプレイヤーはドアに触れるとパスワード入力フィールドを表示させる役割を持ちます。


ステップ1:Cubeをプレイヤーとして設定

  1. ヒエラルキーウィンドウで右クリックして「3D Object」→「Cube」を選択します。
  2. 作成されたCubeを「Player」と名前を変更します。
  3. インスペクターで以下のように位置とサイズを調整します:
    • Position: X = 0, Y = 0.5, Z = 0
    • Scale: X = 1, Y = 1, Z = 1
    • これにより、床の上にプレイヤーが少し浮いている状態になります。

ステップ2:Rigidbodyを追加

プレイヤーが物理演算で動けるようにするために、Rigidbodyコンポーネントを追加します。

  1. Playerオブジェクトを選択します。
  2. インスペクター画面の「Add Component」ボタンをクリックします。
  3. 検索バーに「Rigidbody」と入力し、選択して追加します。

これで、Playerオブジェクトが物理エンジンで動く準備が整いました。


これで、プレイヤーキャラクターの追加が完了です!次は、このプレイヤーがドアに触れた際に入力フィールドを表示させる設定を行います。



7. プレイヤーとドアの連携

このステップでは、プレイヤーがドアに接触したときに入力フィールドを表示し、正しいパスワードを入力するとドアが開くように設定します。具体的には、スクリプトを作成してプレイヤーとドアの動きを連携させます。初心者でも簡単に理解できるように、丁寧に説明していきます!


スクリプトの作成と設定

まずは、プレイヤーがドアに触れると入力フィールドが表示される仕組みを作成します。

  1. スクリプトの作成 プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選びます。 新しいスクリプトに「CubeMove」と名前を付けて、「Cube」(プレイヤーオブジェクト)にアタッチします。
  2. スクリプトのコードを入力 作成した「CubeMove」スクリプトをダブルクリックして開き、以下のコードを入力してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CubeMove : MonoBehaviour
{
    public InputField inputField; // 入力フィールド
    public GameObject door;      // ドアオブジェクト
    public GameObject fieldObject; // 入力フィールド全体のオブジェクト
    
    void Start()
    {
        fieldObject.SetActive(false); // 初期状態では入力フィールドを非表示
    }

    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")
            fieldObject.SetActive(true);
    }

    public void InputPass()
    {
        // 正しいパスワードを入力した場合にドアを開く
        if (inputField.text == "1234") // パスワードを変更したい場合はここを編集
        {
            door.GetComponent<DoorOpen>().DoorMove();
            fieldObject.SetActive(false); // 入力フィールドを再度非表示に
        }
    }
}
  • CubeMoveスクリプトの設定 ヒエラルキーで「Cube」(プレイヤー)を選択し、インスペクターウィンドウの以下の項目を設定します:
    • InputField:作成したInputFieldオブジェクトをドラッグ&ドロップ
    • Door:DoorManageオブジェクトをドラッグ&ドロップ
    • FieldObject:InputField全体のオブジェクトをドラッグ&ドロップ

InputFieldのOnSubmit設定

最後に、InputFieldがEnterキーで動作するように設定を行います。

  1. InputFieldを選択
    ヒエラルキーでInputFieldオブジェクトを選択します。
  2. OnSubmitに関数を追加
    インスペクターウィンドウで「On Submit」のセクションを展開します。
    • 「+」ボタンをクリックして、新しいイベントを追加します。
    • Cube(プレイヤーオブジェクト)をドラッグ&ドロップします。
    • 関数リストから CubeMoveInputPass() を選択します。



8. 動作確認と調整

さあ、いよいよ完成したドアシステムがきちんと動作するか確認する段階です。以下の手順に沿って動作確認を進めてみましょう!


ステップ1: 再生ボタンをクリックする

Unityエディターの上部にある 再生ボタン(▶) をクリックして、ゲームを再生モードに切り替えます。


ステップ2: プレイヤーを移動させてドアに接触

キーボードの 矢印キー または WASDキー を使って、プレイヤー(Cube)を操作しましょう。プレイヤーがドア(Door)に接触すると、画面下に入力フィールド(InputField)が表示されるはずです。

  • 表示されない場合のチェックポイント:
    1. CubeMoveスクリプトの FieldObject に正しくInputFieldを割り当てているか確認
    2. OnCollisionEnter メソッドが正しく実行されているか確認(ヒエラルキーで名前が「Door」になっているかも重要です)

ステップ3: 正しいパスワードを入力する

InputFieldに「1234」と入力し、Enterキー を押します。すると、以下のような挙動が確認できるはずです。

  1. ドアがゆっくりと90度回転して開く。
  2. ドアが1秒間開いたままの状態を維持。
  3. 再びドアがゆっくりと閉じる。
  • 正しい挙動を確認するポイント:
    • ドアがスムーズに回転しているか
    • 開閉の間隔が適切か(1秒間開いた状態になっているか)

ステップ4: 間違ったパスワードを入力する

今度は、InputFieldに「1234」以外の文字列を入力してみてください。この場合はドアが開かず、InputFieldが閉じます。

  • 動作が意図通りでない場合のチェックポイント:
    1. CubeMoveスクリプト内の InputPass メソッドでパスワード判定が正しく行われているか確認。
    2. ドアオブジェクトが DoorOpen スクリプトを持っているか確認。

ステップ5: その他の動作を確認

以下の動作も確認しておきましょう:

  • プレイヤーがドアに触れるたびにInputFieldが正しく表示されるか。
  • ドアが回転する際、他のオブジェクトに干渉していないか。

動作確認後の調整

動作が問題ない場合でも、以下の点をカスタマイズすることでさらに良いゲーム体験を提供できます:

  • パスワードを変更したい場合
    CubeMoveスクリプトの InputPass メソッド内の "1234" を好きな文字列に変更します。
  • 開閉速度を調整したい場合
    DoorOpenスクリプト内の yield return new WaitForSeconds(0.01f); の値を小さくすれば早く、大きくすれば遅くなります。
  • 開閉角度を変更したい場合
    DoorOpenスクリプト内の for (int turn=0; turn<90; turn++) の90を好きな角度に変更します。

これで動作確認と調整は完了です!ゲームが期待通りに動けば、あなたのドアシステムは成功です🎉。ぜひ、追加の機能を実装したり、デザインを変更したりして、独自のシステムを作ってみてください!



よくある質問(Q&A)

Q
ドアが動かない場合はどうすればいいですか?
A

ドアが動かない場合、以下のポイントを確認してください:

  • スクリプトのアタッチミス: 「DoorManage」オブジェクトに「DoorOpen」スクリプトが正しくアタッチされているか確認しましょう。
  • オブジェクトの親子関係: 「Door」を「DoorManage」の子オブジェクトとして設定していますか? ヒエラルキーで確認してください。
  • エラー確認: スクリプトエラーがコンソールに表示されていないか確認し、該当箇所を修正しましょう。
Q
パスワードを変更したい場合はどうすればいいですか?
A

「CubeMove」スクリプトの以下の部分を編集することで、パスワードを変更できます:

if (inputField.text == "1234")

この "1234" の部分を任意のパスワードに書き換えて保存すれば、変更が適用されます。

Q
UIのInputFieldが表示されないのはなぜですか?
A

InputFieldが表示されない場合、以下を確認してください:

  • Canvasの設定: InputFieldが配置されているCanvasが「Active(有効)」になっているか確認してください。
  • FieldObjectの設定: CubeMoveスクリプトの「FieldObject」にInputFieldオブジェクトが正しくドラッグ&ドロップされていますか?
  • 表示位置の確認: InputFieldが画面の外に配置されている可能性があります。インスペクタで位置を調整してください。

おすすめのアセット

「Real Doors VII Sound Effects」は、さまざまなドアの音を集めたサウンドエフェクトパックです。ドアの開閉音、キーの回転音、ノック音など、リアルなドアの音が50種類以上収録されています。これにより、ゲームや映像作品に本物のような臨場感を加えることができます。

このパックは、簡単に使えるように編集されており、Unityプロジェクトにすぐに導入可能です。各音声ファイルは高品質で、無駄なノイズがないクリアな音を提供します。ドアの種類も、木製や金属製、古いドアから現代的なドアまで幅広くカバーしているため、どんなシーンにもマッチします。

初心者でも簡単に扱えるので、プロジェクトにリアルな音のアクセントを加えたい方におすすめです。これ一つで、作品のクオリティが一段とアップしますよ。