【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の設定の仕方を図で示す。




このようにして、OpenDoor→CloseDoorとCloseDoor→OpenDoorも設定する。
6.OpenDoorとCloseDoorのアニメーションクリップで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スクリプトをアタッチする。

完成!!
これで実行して、ドアに近づくとドアが開いて、離れるとドアが閉まるはずです。
ディスカッション
コメント一覧
まだ、コメントがありません