UE4建築コンテンツを制作する際に困ったこと、どう対応したか --03 ドアの開閉編--

 ※今回も建築VizでUE4初めてやるときにつまずいて対応した方法です、ところどころ穴があるかもしれませんが詳しくは公式ドキュメント等をご参照下さい。

 

今回はドアの開閉です。

 

最終動作はこんな感じです。

youtu.be

 

 

ではBPを作って行きましょう。

空のBPアクターを作成して、

 -1-

f:id:momomo_moz:20190120031238p:plain



画像の通り、

①部分を選択したまま、

コンポーネントを追加をクリックして

③staticmeshを2つ(今回はドア本体、丁番)、BoxCollison(ドア開閉判定用)を作ります。

 

 

-2-

次は先程作成したstaticmeshコンポーネントにドア、丁番それぞれのstaticmeshを割り当てます。

f:id:momomo_moz:20190120034850p:plain




①画像の通り、可動が目的なので今回はシンプルにプリセットのメッシュを変形させてそれらしく見せています。

可動性をムーバブルにすることをお忘れなく。

②次に丁番のstaticmeshを割り当てたコンポーネントに対して、ドアを割り立てたstaticmeshをドラッグドロップして親子付します。

このときに親側(画像では丁番、hinge)のピボット位置(ギズモ位置)でドアの回転が決まるので使用されているツールで調整して下さい。

③BoxCollisionのスケールや位置を変更して、ドア開閉の入力を受け付ける範囲を定めます。

 

 -3-
BPを組んでいきます。
イベントグラフタブに移動します。

f:id:momomo_moz:20190120035246p:plain

 BoxCollisionを選択しながらノード検索を行うと、Boxに対するアクションが選択できますので、画像のBegin overlapとEnd overlapと、次の画像のコンテナをそれぞれ生成してノードをつなぎます。

f:id:momomo_moz:20190120035514p:plain

 これで、キャラクターがBoxCollision内にいるときのみEnable input、つまり入力可能となります。

また、BoxcolisionからでたときDisable input、入力不可となります。

-4-
次に特定の入力ボタンを押したときにドアが開閉するノードを作ります。 
今回はプレイヤーキャラがBoxに乗っているときに「E」キーを押すとドアが90度回転する、というノードにします。

f:id:momomo_moz:20190120041417p:plain

まずは入力キー「E」、タイムライン、SetRelativeRotationを作成して画像のように接続します。
このとき、SetRelativeRotationのターゲットに回転させたい対象のオブジェクト(今回はhinge)のノードを刺しておきます。
また、今回Z軸回転だけさせたいので、SetRelativeRotationのNewRotation部分を右クリックし、構造体ピンを分割を選択して、XYZそれぞれの数値を個別入力できるようにしておきます。

 

-5-
回転角度を指定するために、タイムラインをダブルクリックして編集していきます。
今回タイムラインには、『1秒後に90になる』という情報をもたせます。

画像ではわかりにくいので動画をご参照下さい。

youtu.be

・タイムラインコンテナをダブルクリックしてタイムラインタブを開き、左上ボタンからfカーブを新規作成します。

・作成したfカーブの任意の二点を「shift+クリック」してグラフを作ります。
それぞれ、

○時間=0.0 値=0.0

●時間=1.0 値=90

とします、これで1秒後に90になるタイムライングラフができました。
Fカーブのイーズイン、イーズアウトなどはお好みで。

-6-

f:id:momomo_moz:20190120043059p:plain

上記の項目を作成すると、イベントグラフのタイムラインコンテナ内に新規トラック(名称は任意です)が出現するはずです、もうおわかりですね。
SetRelativeRotationのNewRotation(Z)につなぎます。

プレイヤーがBoxCollisionに乗っている状態でEキーを入力すると、1秒かけて90度回転するドア、の完成です。

 


でもこれでは一旦開いたあと、閉めることができませんね。


ですので、最終的なタイムラインを用いた、moz式開閉ドアのノードはこうです。

キー入力のあとにFlipFlop(AとBを交互に行う)を挟み、

Aをタイムラインのplayに

BをタイムラインのReverseに

IsVaildをSetRelativeRotationの下矢印を押して展開した中にある、sweepに接続します。

f:id:momomo_moz:20190120045400p:plain

 

ドアを開けるノード(Aルート)実行後はドアを閉めるノード(Bルート)に、交互に切り替わる仕組みができましたね。

こんな感じで動きます。(ヒンジ逆ですが)

youtu.be

 

-EX-
引き戸の場合は、上記のノードの

SetRelativeRotationをSetRelativeLocationに変更し、タイムラインの値を何cm動かしたいか、トラック数値の出力先をXYZの動かしたい方向のピンに変更すれば完成です。

次回はオービットカメラ(建築外観ビュー)を書く予定です。