格闘ゲームの作り方・プログラムの解説 その8

今回はバトル開始後のカメラコントロールについて説明します。

バトル開始後のカメラの位置は、「BP_GlobalCamera」のTickに繋がったノードで、全てを処理しています。

まずは最初のブランチで変数”Start Camera For Battle”の値を確認しており、バトル開始後は、True側の処理を実施します。

その後は、ノード「Sequence」によって、処理が2つに別れますが、まずは上側の処理を説明します。

上側の処理はノード「Do Once」に繋がっており、バトル中のカメラの初期位置を設定しています。

まずは、関数「Set View Target with Blend」でこのカメラが写している画像に切り替えた後、カメラの位置を決定するのに、各キャラクターの位置を参照する必要があるため、各PlayerControllerからPawn型の変数”P01″と”P02″を参照して、「BP_GlobalCamera」でも使えるようにしています。

次にSpringArmの初期値を設定しています。

次にDefault Scene Rootの初期値を設定しています。

最後に、BP_GlobalCameraの向きを関数「SetActorRotation」を使用して指定しますが、向きの値は、変数”Default Rotator”を参照しています。

変数”Default Rotator” の値の決め方については後ほど説明します。

それでは、先程のノード「Sequence」の処理に戻り、今度は下側の処理を説明します。

下側の処理では、「BP_Common_Controller」の変数”Game-set”を参照して、ゲーム終了後の処理であるか確認しており、ここではFalse側の処理を実施します。

False側での処理は次に、 Player01の「BP_Common_Controller」の変数”SP Camera”を参照して、SPゲージを使用した必殺技を使用しているか確認しており、ここではFalseとなります。

次は、Player02の「BP_Common_Controller」の変数”SP Camera”を参照して、SPゲージを使用した必殺技を使用しているか確認しており、ここでもFalseとなります。

その後は、関数「Set ActorLocation」で「BP_GlobalCamera」の位置を指定するノードに繋がっており、具体的な位置の指定方法をこれから説明します。

カメラの位置は、基本的に2体のキャラクターの中央を画面の中心へ収めるように指定しており、このプロジェクトではキャラクターの前後方向の移動はY軸、高さ方向はZ軸、奥行き方向はX軸の値で指定します。

具体的に位置の算出方法については、2体のキャラクターの位置を関数「GetActorLocation」にて取得し、ノード「Break Vector」でX,Y,Z座標に分解します。

ここで、 2体のキャラクターの中央の値を取得するため、2体のキャラクターのY座標の値を足して2で割っています。

XとZ座標については、初期的にほぼ「0」となっており、ノード「Make Vector」を使用して、計算した X,Y,Z座標を一つにまとめます。※1

さらに、 今度は「BP_GlobalCamera」の位置を関数「GetActorLocation」にて取得し、ノード「Break Vector」でX,Y,Z座標に分解します。

このときのXとZの座標の計算は後ほど説明しますが、Y座標の値は先ほど計算した、2体のキャラクターの中央の値を使用します。

これらを ノード「Make Vector」を使用して、X,Y,Z座標を一つにまとめます。※2

※2の値をスタート地点、※1の値をターゲットとして関数「Find Look at Rotation」を使用することで、2体のキャラクターの中央を向く角度を指定することができ、変数”Default Rotator”へ代入することで、BP_GlobalCameraの初期的な向きを設定することができます 。

それではここから、「BP_GlobalCamera」のXとZの座標の計算を説明します。

X座標はキャラクター間の距離に応じて変化させており、キャラクター同士が近づけば、一定の値までズームイン、離れればズームアウトする設定となっています。

そのために、関数「Select Float」を使用しており、Pick_Aで設定した条件がTrueであればAの値、Falseであれば、Bの値を採用するようになっており、キャラクター間の距離を計算した値が300以上は、計算値をそのまま採用し、300未満であれば、300の値を固定で指定します。

Z座標も同様に、関数「Select Float」を使用しますが、さらに関数「Clamp」を使用し、上限と下限を設定後、オフセットの値をプラスしています。

さらに、「BP_GlobalCamera」のY座標については、2体のキャラクターの中央の値を使用していますが、関数「Clamp」を使用して、上限と下限を設定することで、カメラが端に行きすぎないように制限しています。

これらの値を 関数「Set ActorLocation」 を使って、キャラクターの移動に追従してカメラを移動させています。

これでカメラの初期位置とキャラクターの移動によるカメラの追従について説明しましたので、次はPlayerがSPゲージを使用した必殺技を使ったときのカメラ制御について説明します。

まずは、関数「GetActorTransform」を使用してキャラクターの位置と回転角度とスケールの情報を取得します。

その後、ノード「Break Transform」や「Break Vector」を使用してX,Y,Zの座標へ分解して、必殺技専用のカメラ位置を現在のキャラクターの位置を基準として、値を設定し、ノード「Make Transform」や「Make Vector」を使用して各座標の値をまとめます。

その後、まとめた値を「BP_Common_Controller」の変数”SP Camera” がTrueになった先のノードにある関数「SetActorTransform」を使用して、カメラを移動させています。

この時のカメラの位置をキャラクター毎に設定できるよう、 「BP_Common_Controller」の変数”P01 Char Num” を参照したSwitchノードを使用しています。

Player02も同様の処理を行っています。

次に、「BP_Common_Controller」の変数”Game-set”がTrueになった場合の説明をします。

変数”Game-set”がTrueになった場合は、「BP_Common_Controller」の変数”Kind of Gameset”を参照したSwitchノードを使用して、”1″であれば引き分け、”2″であればPlayer01の勝利、”3″であれば、Player02の勝利となり、 関数「GetActorTransform」を使用したキャラクターの位置を基準にカメラの位置を設定して、 関数「SetActorTransform」で、カメラを移動させています。

説明は以上となります。

次回はバトル中のポーズメニューを説明します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください