Unityで家の扉の開閉が出来るようにする

今回はUnity内に設置した家のドアを開閉してみようと思います。

通常はドアが閉まっていて通れない場所を主人公がドアを開ける事によって家の中に入れるようにします。

やるべき事はドアの近くに主人公が来た事を検知し、決められたマウスボタン等を押したらドアを開くアニメーションが行われ、家の中に入る事が出来るようにします。

開いている状態ならば決められたボタンを押す事によって閉めた状態にする事も出来ます。
ではさっそく作ってみましょう。

スポンサーリンク

家の3Dオブジェクトを用意する

まずは家のドアのアニメーションを作成します。

家とドアが別になっているプレハブを用意します。
今回は自前の適当に作った家を作成しました。

ドア1

ドア2

名前が同じですが・・・(^_^;)、Cube(7)がドアになります。

ドアの設定と開閉アニメーションの作成

Create Emptyで空オブジェクトを作成し、名前をDoorにします。

次にドアのモデル等を配置します(今回はCubeを変形して作成)。

単純な作成方法として、

ドアの階層を作る

↑のようにDoorはただの空のゲームオブジェクトで、Cubeが実際のドアになります。

Doorを移動させ見た目であるCubeの回転させる位置に移動させます。

Doorを見た目の回転させる位置に移動

Doorを移動させたら、CubeをDoorの子要素に移動させます。

という感じになります。

今回の場合はDoorの位置をCube(7)の基点となる位置(ドアの固定部分)に移動させます。

この場所が基点となって、ドアが開くアニメーションを展開させます。
いわゆるピポッドの位置になります。

ドア4

ドア3

Doorの基点を移動させたらDoorの子要素にCube(7)を移動させます。

ドアを選択した状態でAnimationウインドウを開き、Doorのアニメーションを作成します。
AnimationはAnimatorと似た名前ですが、AnimationはUnity内でアニメーションを作成する時に使います。

例えばボタンを作成した時にマウスがボタンの上にきた時に色を赤くする場合はタイムラインを使って色を変化させます。
UIを効果的に表示したりする時にも使えます。

ステータス画面UIのオンオフをUnityのAnimationで行います。UIゲームオブジェクトのオン・オフで単純に消したり登場させたり出来ますが、少しだけ演出を加えてUIを登場させてみましょう。

キャラクターの歩く、走るといったアニメーションは外部のアプリケーション(blender等)を使って作成します。

Animatorはアニメーションの切り替え等を行う時に使用するものでアニメーションを作成する機能ではありません。
こちらはアニメーションの遷移を管理する機能です。

ドア5

上のCreateを押しアニメーションを保存します。

OpenDoorとCloseDoorの二つのアニメーションクリップを作成します。
まずはOpenDoorを選択しドアが開くアニメーションを作成します。

ドア6

録画ボタンを押して最初の角度を保存し、最後にDoorの角度を水平に角度変換し保存します。

ドア8

オブジェクトを回転させる時は上と同じような選択モードを選ぶと回転出来ます。

ドア7

上の画像で言うと緑色の部分をドラッグするとドアが回転していきます。
アニメーション部分に関しては

Unityでタイトル画面を作成し、スタートボタンを押した時にゲームシーンへ遷移させ、ゲーム終了ボタンを押した時はゲームのプラットフォームに応じて処理わけする機能を作成します。

の方でも扱っていますので、そちらも参考にしてください。

これでドアが開くアニメーションが出来ましたので、次は閉めるアニメーションを作成します。
これは開くアニメーションとまったく逆のアニメーションを作成すればいいので、開くアニメーションの最後の部分をコピーします。

ドア9

上のように赤い四角部分を選択し、Ctrl+Cを押してCloseDoorに移動しコピーしたいフレームでCtrl+Vを押します。
OpenとCloseのクリップを逆に作ってしまいました・・・・画像との違いは気にしないでください(^_^;)

これで開くと閉じるのアニメーションが完成したので次は実際に主人公がドアに近づきSpaceキーを押したらドアが開くようにします。

主人公キャラがドアを開閉する為のスクリプト

主人公検知エリアを作成し、検知するスクリプトを作成します。

ドア10

上のようにDoorの子要素に空オブジェクトを作りSearchAreaとします。

ドア11

SearchAreaには主人公を検知する為にBoxコライダを追加します。
スクリプトからのみ使用し、衝突はさせないのでIs Triggerにチェックを入れます。

ドア12

検知エリアは上のようになりました。

もう少し大きめに作った方がいいかもしれません・・・。

次にSearchAreaにドアを開閉するOpenDoorスクリプトを設定します。

主人公がSearchAreaに入っているかどうかをisNearで判断します。

アニメーターは親のオブジェクトであるDoorにあるのでそちらから取得します。

UpdateメソッドではSpaceキーが押され、かつ主人公が近づいているか(nearがtrue)判断し、ドアの開閉をさせます。

アニメーションパラメータのOpenはOpen自体の値を反転させて設定する事によって開閉を勝手に判断させます。

ドアの開閉のアニメーション遷移をアニメーターコントローラーで作成

ドアの開閉の状態によってアニメーションの遷移を変更します。

ドアのアニメーションコントローラー

ドアのアニメーターはOpenDoorとCloseDoorのアニメーションを作った時に作成されていると思いますので、そちらのアニメーターの遷移を上のように作成します。

Idle状態を作成しDefaultStateにします。

アニメーションパラメータでOpenをbool型で作成します。

Idle→OpenDoorはOpenがtrueを条件にし、Has Exit Timeのチェックを外し、
OpenDoor→CloseDoorはOpenがfalseを条件にし、Has Exit Timeのチェックを外し、
CloseDoor→IdleはHas Exit Timeにチェックを入れるだけです。

ドア14

作成したOpenDoorとCloseDoorのアニメーションクリップでLoop Timeのチェックを外しておいてください。
チェックが入っているとアニメーションが永遠にループしてしまいます。

これで完成です。

ドアの近くにいったらSpaceキーを押して確認してみましょう。
ドアが開閉するはずです。

ドア16

細かい部分を作り込むには

近づいてSpaceキーを押すと自動ドアのように開いてしまいますが、もし細かく作るのであれば、取っ手の部分に手をつけて扉を開くアニメーションをして、ドアが開くようにしたいところです。

取っ手の部分に手の位置がくるようにIKを使うとうまく出来ます。

また家の外側と内側では取っ手の位置が変わりますので、Spaceキーを押したらキャラクターを所定の位置に移動させ、ドアを開きます。

手を取っ手に合わせる場合はIKを使うといいかもしれません。

もしくは律儀にドアノブを回して開けるのではなくけり飛ばしたり、押して中に入るという風に作るのもいいかもしれません。

次回はIKを使ってキャラクターがはしごを登っているアニメーションを作成してみます。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. くまもん より:

    unity初心者です!
    参考にさせていただいています!
    このドアの動作を行おうとしているのですがうまく動作しません
    初心者なので具体的にどこがおかしいといった質問ができなくて申し訳ないです
    少なくともAnimatorは動いていますがIdleからスペースを押してもopendoorに移行しません
    Parametersからboolでopenを作り、それをtrueでopendoorに行くようにしているのですがうまくいきません
    何か異なる点があれば教えてください

  2. りーくん より:

    アニメーションパラメーターがよくわからなかったので、画像付きがほしいです

    • アニメーションパラメータはAnimatorControllerで使用するパラメータでFloat、Int、Bool、Trigger型のパラメータを作成出来ます。

      このAnimatorControllerのアニメーションパラメータをスクリプトから操作しアニメーションの遷移を行います。

      つまりアニメーションを遷移させる時の条件ですね。

      アニメーションパラメータに関しては

      https://gametukurikata.com/animationanimator/changeanimation

      の記事を参照して頂くとわかりやすいかもしれません。

      この記事のAnimatorControllerの場合は

      ドア用のAnimatorControllerのアニメーションパラメータ

      ↑のようにBool型のOpenという名前のアニメーションパラメータを作成します。

  3. 匿名 より:

    2枚目の写真、どうやってドアの開くところとなる、原点を変更するんですか?

    開店しようとしても中心から回るだけでドアにはなりませんでした

    • 記事の説明不足で申し訳ありません。
      空オブジェクトであるDoorを移動させるとCube(7)も一緒に移動してしまう為、解りづらくなっています。


      ↑のようにDummyDoor(空オブジェクト)とDoor(実際のドア)を分けて作りそのままにしておきます。

      DummyDoorを選択します。

      DummyDoorの矢印を操作してDoorの左側まで移動させます。
      記事の文章の中では子要素に入れてから移動していた為Doorも一緒に移動してしまって解りづらいです。

      その後DoorをDummyDoorの子にします。

      DummyDoorのCenterをPivotに変更します。

      ↑のようにドアが開くようになります。

      後で記事の文章も直しておきます。
      ありがとうございました。(__)