UE4:レベルブループリントを用いないカメラの切り替えについて
2月15日から始まった(勝手に始めた)WeeklyGameJamが終わりまして、結局最終日にならないと集中できない病で日曜をまるまる潰してなんとか形になりました。参加してくださった方々ありがとうございました。(詳しくは後日まとめます。)
今回カメラを用いたBPをいろいろと作成してみたのでそれらについて書きたいと思います。お役に立てたら幸いです。
まずカメラを切り替える場合レベルブループリントを用いる方法が非常に楽ですが、レベルに依存しているためレベルを切り替える際に一々めんどくさい。といいますか、昨年の終わりから自分はレベルブループリントをあまり使わない縛りでUE4を弄っているため今回も依存しない形で作成しました。
今回作成したのはカメラがComponent上に入っている際のBP、そしてカメラBPを作成しBPInterfaceで通信をした際のBPになります。
ActorのComponentにカメラが設置されている場合(動画だと7:00あたりから)
ActorとカメラのBPを通信している(動画だと2:30あたりから)
この二種類の実装について書きたいと思います。
PlayerCharacterのような常に動くものはComponentにカメラを設置してActivate,Diactivateを用いたほうがいいはず・・・(多分・・・)
コンポーネントにカメラを設置した場合のブループリント
実装内容
「F」キーを押すとカメラが切り替わる。もう一度押すと元に戻る。
まずActorを作成します。
コンポーネントからスタティックメッシュとBoxCollision、Cameraを設置します。
まずプレイヤーがBoxCollisionに入った際に入力を受け付けるようにします。
Boxにプレイヤーが入ったら(BeginOverLapノード)EnableInputノード、プレイヤーが出たら(EndOverLapノード)DisableInputノードを付けます
これで入力が受け付けるようになりました。
次にカメラの切り替えについてです。
FKey入力からFlipflopをつなぎます。(Flipflop:入力が奇数の場合A、偶数の場合はB)
カメラの移動にはSetViewTargetwithBlendノードを使用します。
AのほうにはNewViewTargetにSelf(ノードを検索した場合「自身にリファレンスをGet」と出ています。)をつなぎます。BlendTimeは1秒にしました。
Bのほうは元に戻したいのでNewViewTargetには「GetPlayerCharacter」をつなぎました。
これで完成です。
Cameraのアクターを作成し通信するブループリントについて
実装内容
1、Fを押すとカメラが切り替わる
2、複数のカメラと通信する
3、複数のイベントと通信する
1,Fを押すとカメラが切り替わる
カメラ側のブループリント
Actorを作成しコンポーネントにはカメラのみ設置します。
椅子のActor側
まずアクターを作成します。
コンポーネントにはBoxCollisionとスタティックメッシュを設置しました。
先ほどと同じようにBoxCollisionにプレイヤーが入ったら入力を受け付けるようにしました。
次にActor型の変数を宣言します。名前をCameraActorにしました。
CameraActorのお目目アイコンにチェックを入れます。これでレベルエディタ上でActorの情報を入れることが出来ます。
BluePrintInterface側のブループリント
Actor同士を通信するためBluePrintInterface(ブループリントインターフェース)を作成します。
関数を一つ追加します。名前を「CameraMove」にしました。
カメラ側のブループリント
作成したブループリントインターフェースを追加します。クラスの設定から実装インターフェースにある追加ボタンを押して選択します。
次にイベントグラフ上にてノードを組んでいきます。
先ほどブループリントインターフェース上で作成した関数「CamerMove」を用い、イベントのCameraMoveを出します。そして以下のようにノードを組みます。
椅子のアクター側のブループリント
CameraActorから変数を取り出しそこからCameraMoveを出します。
レベルエディタ側
レベルエディタに戻り椅子BPとカメラBPを設置します。
詳細のデフォルトから設置したカメラBPを入れます。(これ入れないと動かないです)
これで完成です。
2,複数のカメラと通信する
椅子のブループリント側
Actor型の変数を作成し以下のように名前を付けました。(CameraActor2,CameraActor3)
そして以下のようにノードを組みました。
レベルエディタ側
カメラを2つ設置します。
作成したActor変数に設置したカメラBPを入れていきます。
完成です。
3.複数のイベントと通信する
カメラ側に複数イベントを用意しておくと便利です。
今回用意するのは
1、カメラの移動
2、カメラをプレイヤー側へ戻す
3、カメラを移動して数秒後にプレイヤーのカメラへ戻す
というものです。
まず、BlueInterfaceに複数の関数を作成します。
CameraMoveでカメラの移動、ResetCameraでプレイヤーのカメラへ戻す、AutoCameraでカメラが移動し数秒後プレイヤーのカメラを戻す用にしました。
AutoCamera側の関数ではInputにFloat型の変数を入れられるように追加しました。これはカメラが移動して何秒後にプレイヤーのカメラへ戻すか数値を入れられるようにしました。
カメラ側のブループリント
まずCameraMoveには先ほどと同じノード構成で、ResetCamraには以下のようにノードを組みます。
次にAutoCameraについでです。上2つのノード構成を一つにまとめ、その間にDelayをかませるだけでいいです。
椅子側のブループリントについて
そして先ほど作成した変数からブループリントインターフェースの関数を出しました。
AutoCameraのDelayTimeには2を入れました。これで2秒後に元のカメラへ戻ることが出来ます。
これで完成です。
とりあえず今回使用したカメラの切り替えはこんな感じです。
もっといい方法がありそうです!
是非何かいい方法がわかったら情報共有お願いします!
以上。