Unreal Engine - ドアの実装

Blueprintを使用しシーン中、プレイヤーのアクションに応じて開閉するドアを実装する。

www.youtube.com

基本的な動作条件は以下の通り。

  • 開閉は押し引きで行う。
  • プレイヤーがドアの前に立った状態でボタンを押すたび開閉を行う。
  • プレイヤーがドアの前に立ち、操作を一切行っていない場合はガイドメッセージを表示する。
  • 一度操作を行った後、ドアの前から離れるまではガイドメッセージは再表示しない。

Viewport図

f:id:DYMN:20150515010731p:plain
TriggerDoor:ドアの開閉を受け付ける当たり判定。ドアの前後に伸びている。
TriggerDoorFront/TriggerDoorBehind:プレイヤーがドアのどちら側にいるのか判断する当たり判定。それぞれ大きさはTriggerDoorの半分。TriggerDoorと重なるようにドアの前後に設置する。

※ドア本体(この場合はDoorActor)の子に当たり判定を設置しないこと。さもないとドアが開いた時に当たり判定自体も回転してしまう。

Blueprint図

f:id:DYMN:20150515010736p:plain

※OCBO・OCEO=OnComponentBeginOverlap・OnComponentEndOverlap

上部

OCBO(TriggerDoorFront/Behind)->SET:Current Door Trigger
プレイヤーが現在、「ドアのどちら側にいるか?」を取得する。取得した側のボックスコリジョンを変数「Current Door Trigger」にセットする。
OCEO(TriggerDoorFront/Behind)->Set Visibility(FALSE):MsgDoorHandleB/F
ドア前後の当たり判定を「抜けた」時には自動的にガイドメッセージを消去する。

中部

OCBO(TriggerBox)->Enable Input->Set Visibility(TRUE)
プレイヤーが新たにTriggerBoxの中に入った場合、入力を受付可能にすると共にガイドメッセージを表示する。
OCEO(TriggerBox)->Disable Input->Set Visibility(FALSE)
プレイヤーがTriggerBoxの中から抜けた場合、入力受付を不可にすると共にガイドメッセージを消去する。
CurrentDoorTrigger->Get Child Component->Set Visibility
Visibilityをセットする際、対象となるテキストアクタはあらかじめ取得してあるCurrentDoorTrigger変数に格納されているアクタの子を取得する。

下部

プレイヤーの操作を受けて実際にドアアクタの角度を変更する。
F:Fキーの入力を受け付ける
Branch:変数IsCloseの内容に従い、処理を振り分ける(ドアを開けるか、閉めるか)
IsCloseがTrue(閉まっている)場合はIsCloseをFalse(開いている)に変更し、TimeLineノードのPlayに接続する。
IsCloseがFalse(開いている)場合はIsCloseをTrue(閉じている)に変更し、TimeLineノードのReverseに接続する。
※TimeLineノードは単純に数値を0~90まで1.5秒かけて増加させている。Easingを入れるか否かはお好みで。
0~90(Play)または90~0(Revrese)の値をMake Rotノードで受け取りRotationに変換する。回転はヨーイングで行うのでYawへ接続。
DoorActorを対象とするSet Relative Rotation(相対回転)ノードのNew RotationにMake Rotの出力を接続し、実際のドアの回転を行う。
ドア開閉の入力を受け付けた後はガイドメッセージを消去する。