僕の私のUnrealな日々

UE4のBluePrintを使って小さなギミックを作ったりしてます。ブログを通じて情報共有ができたらなと思います。

UE4:レベルブループリントを用いないカメラの切り替えについて

2月15日から始まった(勝手に始めた)WeeklyGameJamが終わりまして、結局最終日にならないと集中できない病で日曜をまるまる潰してなんとか形になりました。参加してくださった方々ありがとうございました。(詳しくは後日まとめます。)

 

www.youtube.com

 

今回カメラを用いたBPをいろいろと作成してみたのでそれらについて書きたいと思います。お役に立てたら幸いです。

 

まずカメラを切り替える場合レベルブループリントを用いる方法が非常に楽ですが、レベルに依存しているためレベルを切り替える際に一々めんどくさい。といいますか、昨年の終わりから自分はレベルブループリントをあまり使わない縛りでUE4を弄っているため今回も依存しない形で作成しました。

 

docs.unrealengine.com

 

今回作成したのはカメラがComponent上に入っている際のBP、そしてカメラBPを作成しBPInterfaceで通信をした際のBPになります。

 

f:id:Bussan_dayo:20160222020805p:plain

ActorのComponentにカメラが設置されている場合(動画だと7:00あたりから)

 

 

 

f:id:Bussan_dayo:20160222020841p:plain

ActorとカメラのBPを通信している(動画だと2:30あたりから)

 

この二種類の実装について書きたいと思います。

 

PlayerCharacterのような常に動くものはComponentにカメラを設置してActivate,Diactivateを用いたほうがいいはず・・・(多分・・・)

 

 

unrealbussan.hatenablog.com

 

 

コンポーネントにカメラを設置した場合のブループリント

実装内容

「F」キーを押すとカメラが切り替わる。もう一度押すと元に戻る。

 

 

 

 

まずActorを作成します。

コンポーネントからスタティックメッシュとBoxCollision、Cameraを設置します。

f:id:Bussan_dayo:20160222141335p:plain

 

 

 

まずプレイヤーがBoxCollisionに入った際に入力を受け付けるようにします。

f:id:Bussan_dayo:20160222141437p:plain

 

 Boxにプレイヤーが入ったら(BeginOverLapノード)EnableInputノード、プレイヤーが出たら(EndOverLapノード)DisableInputノードを付けます

 これで入力が受け付けるようになりました。

 

 次にカメラの切り替えについてです。

FKey入力からFlipflopをつなぎます。(Flipflop:入力が奇数の場合A、偶数の場合はB)

f:id:Bussan_dayo:20160222141727p:plain

 

 カメラの移動にはSetViewTargetwithBlendノードを使用します。

AのほうにはNewViewTargetにSelf(ノードを検索した場合「自身にリファレンスをGet」と出ています。)をつなぎます。BlendTimeは1秒にしました。

Bのほうは元に戻したいのでNewViewTargetには「GetPlayerCharacter」をつなぎました。

 

これで完成です。

 

 

Cameraのアクターを作成し通信するブループリントについて

実装内容

1、Fを押すとカメラが切り替わる

2、複数のカメラと通信する

3、複数のイベントと通信する

 

 

 1,Fを押すとカメラが切り替わる

カメラ側のブループリント

 Actorを作成しコンポーネントにはカメラのみ設置します。

f:id:Bussan_dayo:20160222142835p:plain

 

椅子のActor側

まずアクターを作成します。

コンポーネントにはBoxCollisionとスタティックメッシュを設置しました。

f:id:Bussan_dayo:20160222142635p:plain

 

 先ほどと同じようにBoxCollisionにプレイヤーが入ったら入力を受け付けるようにしました。

f:id:Bussan_dayo:20160222142728p:plain

 

次にActor型の変数を宣言します。名前をCameraActorにしました。

f:id:Bussan_dayo:20160222143002p:plain

 

CameraActorのお目目アイコンにチェックを入れます。これでレベルエディタ上でActorの情報を入れることが出来ます。

f:id:Bussan_dayo:20160222143014p:plain

 

 

BluePrintInterface側のブループリント

Actor同士を通信するためBluePrintInterface(ブループリントインターフェース)を作成します。

 

f:id:Bussan_dayo:20160222143300p:plain

 

関数を一つ追加します。名前を「CameraMove」にしました。

f:id:Bussan_dayo:20160222143322p:plain

 

 

カメラ側のブループリント

作成したブループリントインターフェースを追加します。クラスの設定から実装インターフェースにある追加ボタンを押して選択します。

f:id:Bussan_dayo:20160222145939p:plain

 

 次にイベントグラフ上にてノードを組んでいきます。

先ほどブループリントインターフェース上で作成した関数「CamerMove」を用い、イベントのCameraMoveを出します。そして以下のようにノードを組みます。

f:id:Bussan_dayo:20160222150024p:plain

 

 

 

椅子のアクター側のブループリント

 

CameraActorから変数を取り出しそこからCameraMoveを出します。

f:id:Bussan_dayo:20160222150227p:plain

 

 

レベルエディタ側

レベルエディタに戻り椅子BPとカメラBPを設置します。

詳細のデフォルトから設置したカメラBPを入れます。(これ入れないと動かないです)

f:id:Bussan_dayo:20160222150429p:plain

 

これで完成です。

 

2,複数のカメラと通信する

 

椅子のブループリント側

Actor型の変数を作成し以下のように名前を付けました。(CameraActor2,CameraActor3)

f:id:Bussan_dayo:20160222150719p:plain

 

そして以下のようにノードを組みました。

f:id:Bussan_dayo:20160222150925p:plain

 

 レベルエディタ側

 カメラを2つ設置します。

f:id:Bussan_dayo:20160222151050p:plain

 

作成したActor変数に設置したカメラBPを入れていきます。

f:id:Bussan_dayo:20160222151127p:plain

 

 

完成です。

 

3.複数のイベントと通信する

 

カメラ側に複数イベントを用意しておくと便利です。

今回用意するのは

1、カメラの移動

2、カメラをプレイヤー側へ戻す

3、カメラを移動して数秒後にプレイヤーのカメラへ戻す

というものです。

 

 

まず、BlueInterfaceに複数の関数を作成します。

f:id:Bussan_dayo:20160222153301p:plain

 

CameraMoveでカメラの移動、ResetCameraでプレイヤーのカメラへ戻す、AutoCameraでカメラが移動し数秒後プレイヤーのカメラを戻す用にしました。

AutoCamera側の関数ではInputにFloat型の変数を入れられるように追加しました。これはカメラが移動して何秒後にプレイヤーのカメラへ戻すか数値を入れられるようにしました。

 

 

カメラ側のブループリント

まずCameraMoveには先ほどと同じノード構成で、ResetCamraには以下のようにノードを組みます。

f:id:Bussan_dayo:20160222153617p:plain

 

次にAutoCameraについでです。上2つのノード構成を一つにまとめ、その間にDelayをかませるだけでいいです。

f:id:Bussan_dayo:20160222153754p:plain

 

 

 椅子側のブループリントについて

そして先ほど作成した変数からブループリントインターフェースの関数を出しました。 

f:id:Bussan_dayo:20160222154115p:plain

AutoCameraのDelayTimeには2を入れました。これで2秒後に元のカメラへ戻ることが出来ます。

 

 

これで完成です。

 

 

とりあえず今回使用したカメラの切り替えはこんな感じです。

もっといい方法がありそうです!

 

是非何かいい方法がわかったら情報共有お願いします!

 

以上。