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

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

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

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

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

スポンサーリンク
スポンサーリンク

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

まずは家のドアのゲームオブジェクトを作成します。

家とドアが別になっているプレハブを用意します。

今回はCubeを使って自前で適当な家を作成しました。

ドア1

ドアの設定

ドアの設定をしていきます。

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

次にドアのモデルをCubeを使って作成し、名前をDoorModelとします。

DoorModelのScaleをXは1、Yは2、Zは0.1とします。

ドアの基点とドアのモデルを並列に作る

上のような感じで作成しました。

BasePointOfDoorを移動させ見た目であるDoorModelを回転させる基点となる位置に移動させます。

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

上のようにBasePointOfDoorをDoorModelの家に取り付けてある部分に移動させます。

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

BasePointOfDoorが基点となって、ドアが開くアニメーションを展開させます。

BasePointOfDoorはいわゆるピポッド(中軸)の位置になります。

ドアのピポットとドアのモデルの階層

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

ドアの設定が終わったので次はドアの開閉アニメーションを作成していきます。

AnimationはAnimatorと似た名前ですが、AnimationはUnity内でアニメーションを作成する時に使います。

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

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

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

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

ヒエラルキーのBasePointOfDoorを選択した状態でAnimationウインドウを開き、ドアの開閉アニメーションを作成します。

ドア5

上のCreateを押しファイル名をOpenDoorとしてアニメーションを保存します。

これでBasePointOfDoorというアニメーターコントローラーとOpenDoorというアニメーションクリップが作成されます。

OpenDoorを選択しAnimationウインドウでドアが開くアニメーションを作成します。

ヒエラルキーのBasePointOfDoorを選択した状態で、赤い丸の録画ボタンを押します。

フレームの1:00に移動しBasePointOfDoorの回転をします。

ドア6

1:00でBasePointOfDoorを回転させると0:00と1:00にキーフレームが打たれます(アニメーションの変化位置)。

ドア8

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

ドア7

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

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

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

これでドアが開くアニメーションが出来ましたので、次は閉めるアニメーションを作成します。

ドアを閉めるアニメーションは開くアニメーションとまったく逆のアニメーションを作成すればいいので、OpenDoorアニメーションの最初と最後の部分(0:00フレームと1:00フレーム)をコピーします。

ドア9

上のように赤い四角部分を選択し、Ctrl+Cを押してキーフレームをコピーできます。

AnimationウインドウのOpenDoorの部分をクリックしCreate New Clipを選択して名前をCloseDoorとします。

CloseDoorに移動しコピーしたいフレームでCtrl+Vを押します。

順番としてはOpenDoorの1:00をCloseDoorの0:00に貼り付け、OpenDoorの0:00をCloseDoorの1:00に貼り付けます。

次にCloseDoorの部分をクリックしCreate New Clipを選択し名前をIdleDoorとします。

Idleドアは初期状態のドアのアニメーションクリップとして使いますが、特にアニメーションはさせないのでそのままにしておきます。

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

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

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

ドアのアニメーターコントローラーはBasePointOfDoorという名前で作成されているので選択しAnimatorウインドウで状態と遷移を上のように作成します。

IdleDoorはIdleDoorアニメーション、OpenDoorはOpenDoorアニメーション、CloseDoorはCloseDoorアニメーションを設定します。

アニメーターコントローラーの使い方については

Unityのアニメーションの切り替えシステムとスクリプト
Unityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。

Unityのアニメーターコントローラーのブレンドの使い方
Unityのアニメーターコントローラーのブレンドの基本的な使い方を学習していきます。

を参照してください。

IdleDoor状態を作成し右クリックからSet As Layer Default Stateを選択します。

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

Idle→OpenDoorはOpenがtrueを条件にし、Has Exit Timeのチェックを外し、
OpenDoor→CloseDoorはOpenがfalseを条件にし、Has Exit Timeのチェックを外し、
CloseDoor→OpenDoorはOpenがtrueを条件にし、Has Exit Timeのチェックを外します。

ドア14

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

これで完成です。

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

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

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

ドアの階層下にサーチエリアを作成する

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

ドア11

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

ドア12

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

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

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

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

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

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

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

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

ドア16

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

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

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

家の外と内で別の検知範囲を作ってそれぞれの検知範囲でドアノブを掴む前にキャラクターを移動させる位置と角度を指定してある程度移動と回転が済んだらノブを掴んでドアを開けると細かく作るのも良さそうですね(大変ですが)

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

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

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

コメント

  1. 匿名 より:

    Idle状態というのがどうすればいいのか分かりません

    そしてアニメーションはOpenとCloseどっちも作ったのですが、MotionのところにOpenDoorの表示ができないです、Animatorで躓いてます・・・

    Scriptは赤い!マークがでたので一度無くしましたが、Scriptは必須ですか??
    初心者なもので、質問が基礎中の基礎だと思いますが申し訳ありません。。。

  2. くまもん より:

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

  3. りーくん より:

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

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

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

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

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

      https://gametukurikata.com/animationanimator/changeanimation

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

      この記事のAnimatorControllerの場合は

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

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

  4. 匿名 より:

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

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

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


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

      DummyDoorを選択します。

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

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

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

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

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

タイトルとURLをコピーしました