【Unity】自動ドアを作る(近づくと扉が自動で開閉する)

Unity

スポンサーリンク

自動ドアの作り方を紹介します。

扉を作る

1.Cubeなどを3つ並べて真ん中をドアにします。(ドアさえあればよいのでここはお好きなように作ってください。)
今回は赤いCubeを自動ドアとして機能させます。
オブジェクト名は「AutomaticDoor」としました。

起点となる空オブジェクトを作る

1.「Create Empty」を作成する。

2.作成された「Create Empty(GameObject)」を「BaseDoor」という名前にする。

3.「BaseDoor」の場所を「AutomaticDoor」を動かす起点となるところに移動させます。

「AutomaticDoor」を「BaseDoor」の子の要素とする

1.「AutomaticDoor」を「BaseDoor」の子の要素とする
※「AutomaticDoor」をクリックしたまま、「BaseDoor」にカーソルを移動させて離せば子の要素となります。

以上でドアの設定は終わりです。

ドアの開閉アニメーションを作成する

1.Animationウィンドウを開く

2.「BaseDoor」を選択した状態で「Create」ボタンを押下する。

3.保存画面がでるので、「OpenDoor」という名前で保存する。
ここではAssets配下にAnimationフォルダを作成して、そこに保存した。

4.「BaseDoor」を選択した状態で赤い録画ボタンを押す。

5.「1:00」(1秒)のところをクリックする。白い縦棒が1:00のところに来る。

6.「AutomaticDoor」の場所を自動ドアの開いた状態に場所をかえる。

7.1:00のところにキーフレーム(ダイヤの形のやつ)が打たれたことを確認する。

8.録画ボタンを押して、録画を停止して、再生ボタン"▷"を押して、1秒でドアが開くのを確認する。

9.次に閉じる動作を作る。

10.OpenDoorをクリックして、「Create New Clip」を押下する。

11.「CloseDoor」という名前で保存する。

12.開くときとは逆なので、4~8番と同様に作ればよいが、せっかく開くときのキーフレームがあるのでそれをコピペする。

13.「OpenDoor」の0:00のキーフレームをクリックして、Ctrl+Cでコピーする。

14.「CloseDoor」の1:00のところにCtrl+Vで貼り付ける。

15.同様に「OpenDoor」の1:00のキーフレームをコピーして、「CloseDoor」の0:00のところに貼り付ける。

16.CloseDoorの再生ボタン"▷"を押して、ドアが閉まる動作ができていることを確認する。

17.初期状態のドアの状態を作るために、「Create New Clip」を押下して、「IdleDoor」という名前で保存する。
こちらは初期状態なので、アニメーションは不要です。

ドアの開閉のアニメーション遷移を作成する。

1.アニメーションを保存したフォルダに「BaseDoor」という名前で、アニメーターコントローラーが作成されているので、ダブルクリックして、Animatorウィンドウを表示する。

2.初期状態では上記のような感じになっているので、以下のようにする。
オレンジのstateをIdleDoorに変えるには、Entryで右クリックして、「Set StateMachine Defaule State」をクリックして、矢印をIdleDoorにつなげる。
その他は「Make Transition」でつなげる。

3.IdleDoorはIdleDoorアニメーション、OpenDoorはOpenDoorアニメーション、CloseDoorはCloseDoorアニメーションを設定します。
同じ手順でやれば、おそらくすでに設定されているはず。

4.アニメーションパラメータでbool型のOpenを作成する。
以下の図の「Bool」をクリック

5.Transition(各アニメーションをつなげている矢印のこと)の設定を変更する。
Idle→OpenDoorはOpenがtrueを条件にし、Has Exit Timeのチェックを外す。
OpenDoor→CloseDoorはOpenがfalseを条件にし、Has Exit Timeのチェックを外す。
CloseDoor→OpenDoorはOpenがtrueを条件にし、Has Exit Timeのチェックを外す。
以下に設定の仕方の例として、Idle→OpenDoorのTransitionの設定の仕方を図で示す。

Idle→OpenDoorの矢印をクリック
右側のInspectorの欄のHas Exit Timeのチェックを外す
Conditionsの"+"を押下する。
Openパラメータの値をtrueにする。

このようにして、OpenDoor→CloseDoorとCloseDoor→OpenDoorも設定する。

6.OpenDoorとCloseDoorのアニメーションクリップでLoop Timeのチェックを外す。
チェックが入っているとアニメーションが永遠にループしてしまう。

OpenDoorをクリック
InspectorのLoop Timeのチェックを外す。

これでアニメーションは完了

ドアに近づくと開いて、離れると閉じるスクリプトの作成

1.BaseDoorの子要素にからオブジェクトを作成し、「DetectionArea」という名前にする。

2.DetectionAreaにBox Colliderを追加し、Is Triggerにチェックを入れる。

3.DetectionAreaの場所や大きさを適宜整える。

4.自動ドアのためのスクリプトを作成する。
「AutomaticDoor」という名前で今回は作成。

using UnityEngine;

public class AutomaticDoor : MonoBehaviour
{
    // ドアのアニメーター
    private Animator animator;

    void Start()
    {
        // 親のAnimatorを取得
        animator = transform.parent.GetComponent<Animator>();
    }

    /// <summary>
    /// 自動ドア検知エリアに入った時
    /// </summary>
    /// <param name="other"></param>
	private void OnTriggerEnter(Collider other)
    {
        // アニメーションパラメータをtrueにする。(ドアが開く)
        animator.SetBool("Open", true);
    }

    /// <summary>
    /// 自動ドア検知エリアを出た時
    /// </summary>
    /// <param name="other"></param>
	private void OnTriggerExit(Collider other)
    {
        // アニメーションパラメータをfalseにする。(ドアが閉まる)
        animator.SetBool("Open", false);
    }
}

5.Hierarchyの「DetectionArea」にAutomaticDoorスクリプトをアタッチする。

完成!!

これで実行して、ドアに近づくとドアが開いて、離れるとドアが閉まるはずです。

スポンサーリンク

Unity

Posted by ton