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

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

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

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

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

スポンサーリンク

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

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

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

ドア1


ドア2

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

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

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

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

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

ドア4

ドア3

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

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

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

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

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

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

ドア5

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

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

ドア6

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

ドア8

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

ドア7

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

Unityでスタートボタン、ゲーム終了ボタンのUIを作成する
Unityでタイトル画面に表示するスタートボタン、ゲーム終了ボタンのUIを作成していきます。シーン移動や画面遷移をしたい時にボタンを押す事で移動出来るようにします

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

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

ドア9

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

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

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

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

ドア10

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

ドア11

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

ドア12

検知エリアは上のようになりました。
もう少し大きめに作った方がいいかもしれません・・・。
次に検知エリアにスクリプトを設定します。

まずは開いているか閉じているかを判断するopened変数を宣言します。

主人公が近づいているかどうかはnearで判断します。
アニメーターは親のオブジェクトであるDoorにあるのでそちらから取得します。

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

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

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

ドア15

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

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

アニメーションパラメータでOpenをbool型で作成し、trueならOpenDoor、OpenがfalseならOpenからCloseDoorに遷移するように作成します。

ドア14

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

これで完成です。

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

ドア16

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

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

また家の外側と内側では取っ手の位置が変わりますので、Spaceキーを押したら取っ手の左側にキャラクターを移動させて扉を開く必要があります。

IKを使う場合取っ手が左側にある場合に右手が変な曲がり方をしてしまいます・・・・(^_^;)

ドアを開閉する時はキャラクター自体の位置を固定した位置にむりやり移動させドアを開閉させるというのがいいかもしれません。
でもその場合はあまり自然とは言えないですけどね・・・。

わたくしは、まだここらの対処をどうしたらいいかわかりません。
勉強不足ですね・・・(^_^;)

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

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

コメント

  1. 匿名 より:

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

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

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


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

      DummyDoorを選択します。

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

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

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

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

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