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

今回は、 セレクトキャラクターの処理について説明します。

セレクトキャラクターでは、Widgetブループリントだけではなく、PlayerControllerであるBP_Common_Controllerやカメラを制御するBP_GlobalCamera、CharacterブループリントのBP_Char01の導入部分も説明することになるため、長文となります。

前回の記事で説明した、関数「Select Stage」の最後の処理でカスタムイベント「Begin to Select Character」を処理しており、まずは、このカスタムイベントから説明していきます。

「Begin to Select Character 」 の処理を開始してから1.0秒後にセレクトモードとセレクトステージで使用していた背景を 非表示(Hidden)に変更し、 コントローラの入力状態を管理している変数を初期化した後、変数”Select Character ”にTrueを代入することで、Tick側のセレクトキャラクター の処理を可能にしています。

その後、画面を黒くしたアニメーションを逆再生して画面を見えるようにするのと同時に、セレクトキャラクターのタイトル画像やキャラクターの選択肢を表示するアニメーションを再生します。

セレクトキャラクターのタイトル画像やキャラクターの選択肢を表示するアニメーションの設定は下図のようになっています。

セレクトキャラクター は8つの選択肢から選ぶようになっていますが、前回同様、「Uniform Grid Panel」と「Check Box」 を使用して、画像を水平に並べています。

その他は、タイトル画像やVSマークの画像、キャラクター名称の画像で構成されており、TranslationやColor and Opacity、Scaleなどのアニメーション効果を使用して表示させています。

ここで、背景画像が指定されていないことがわかると思います。

いままでは、Widgetブループリントのデザイナー画面で指定した画像を背景としてきましたが、ここではキャラクターをスポーンして表示する必要があるため、背景はあらかじめロードしていた、レベルファイル「Menu_Stage」内で用意しているスタティックメッシュが使用されています。

その後、Player01がキャラクターを選択していることを意味する変数”Player01″にTrueを代入後の0.2秒後にセレクトキャラクターのタイトルコールの音声を再生し、Player01のコントローラ入力を許可しています。

次にTickに繋がっている、変数”Select Character”がTrueになった場合の処理を説明します。

変数”Select Character”がTrueになると、 Player01 がキャラクター選択の順番であるかを、変数”Player01″を使って確認しており、Trueであれば、関数「Select Character」の処理を開始します。

変数”Player01″ がFalseだった場合は、1.0秒後にセレクトモードで選択したモードに応じて、 Player01 または、Player02の入力を許可しています。

キャラクター選択の順番がPlayer02であってもPlayer01による入力を許可していますが、不要であれば、変数”Input Possible For P01″を削除すれば、 Player02 の入力のみに限定することが可能になります。

今回はこの処理を、「Do Once」というノードで処理しており、これはTickが毎フレーム処理しているノードに対し、1度だけ処理するノードです。

「Do Once」ノードにある”Reset” へ処理が到達すると再度、 1度だけ処理 ができるようになります。

これらの処理と同時に、 並行処理ができるノード「Sequence」を使用して、関数 「Select Character」の処理も開始します。

それでは、 関数 「Select Character」の処理 を説明します。

前回と同様に、どの選択肢がアクティブなのか指定するための青枠の画像が設定されている「Check Box」の”Onfocus Box″ から行と列の情報を取得できる「Slot」を参照し、「Cast to UniformGridSlot」を使用して「Uniform Grid Panel」の列と行を制御するスロットとして指定します。

それから、「Set Column」を使用して列を指定しますが、どの列を指定するのかは、整数型の変数”Column”の値で指定します。

変数”Column” の初期値は「0」であるため、青枠は一番左に位置した状態で表示されます。

次に”Input Value H”を参照したSwitchノードを使用して、横方向のキー入力に応じた処理を行います。

次に、最初はPlayer01がキャラクター選択の順番となるため、変数”Player01″がTrueとなり、キャラクター名称の画像をセットしています。

その後、Player01のPlayerControllerで定義した変数”P01 Char Num”に「1」を代入して1番目のキャラクターを選択している状態とし、カスタムイベント「Select Character P01」を処理開始後に、Enterキーの入力待機状態となります。

それでは、BP_Common_Controllerで定義しているカスタムイベント「Select Character P01」 を説明します。

最初にマクロ「Controller ID Single」でどちらのPlayerControllerであるか確認しており、Player01の PlayerController であれば、処理を継続します。

また、このカスタムイベントはWidgetブループリント側のTickに繋がっており、毎フレーム呼び出されているため、その後の処理を一度だけにするよう「Do Once」ノードを使用しています。

さらに再度処理できるようにするためのリセット処理を、変数”P01 Char Num”と”Temp P01 Char Num”の値が違う場合に実行するようにしています。

これは方向キー入力によってアクティブな選択肢が動く度に、リセット処理されること意味しています。

その後、Switchノードを使用して、変数”P01 Char Num” の値に応じた、処理を行っており、変数 “Temp P01 Char Num” に「1」を代入しています。

それから、初期に表示するキャラクターか判断する変数”P01 initial Char Select”の確認を行っていますが、これは結局使用しておらず、常にFalseの値で処理されています。

そこから、P01のCharacterブループリントが有効か確認していますが、初期的にはまだ、P01にCharacterブループリントは設定されていないため、Falseとなり、Characterブループリントの「BP_Char01」がスポーンされています。

その後、 Characterブループリント型の変数”P01″に「BP_Char_01」を代入後、他のキャラクター選択された際に、スポーンしたキャラクタを消す必要があるため、Characterブループリント型の変数”P01 Destroy Actor”にも「BP_Char01」を代入して、消す準備を行います。

また、アクティブになっている選択肢が移動した場合は、次のような処理となりますが、今回はキャラクターを1体しか実装していないため、変数”P01″が有効であることを確認してから、現在表示しているキャラクターを関数「DestroyActor」を使用して消しています。

次に、Characterブループリントの「BP_Char01」がスポーンされた時に、変数”P01 Initial Position”を使用して、スポーンしている位置を指定しているため、この指定する方法を説明します。

以前ゲームが実行されるとPlayer01のPlayerControllerが自動的に生成されることは、説明しましたが、その際に、「BP_Common_Controller」のイベントである「BeginPlay」が実行されており、そこで初期的な位置を指定しています。

それでは、「BP_Common_Controller」のイベント「BeginPlay」の処理を説明します。

イベント「BeginPlay」の処理が開始されるとまずは、関数「Disable Input」を使用して、コントローラによる入力を不可にしています。

これは、入力許可のタイミングをWidgetブループリントで制御するためです。

次にPlayer01のPlayerControllerであるか確認を行い、Trueであれば、フレームレートを最大60fpsにするコマンドを実行しています。

その後、関数「Set Intial Position」でPlayer01とPlayer02とカメラの初期位置を設定し、「BP_GlobalCamera」をスポーンした後、マウスのカーソルとクリックをオフにしています。

それでは、関数「Set Initial Position」を説明します。

まずは、カメラの初期位置を設定しており、 設定値については、X.Y.Zの位置と回転の値を設定しています。

それから、カメラの位置を基準としてPlayer01のキャラクターの位置を決定しています。

さらに、Player01の位置を基準としてPlayer02のキャラクターの位置も設定しています。

先程、「BP_GlobalCamera」をスポーンしたので、「BP_GlobalCamera」の初期設定とイベント「BeginPlay」の説明をします。

「BP_GlobalCamera」の構成は以下のようになっており、DefaultSceenRootの子として、SpringArmを設定し、さらにその子として、Cameraを設定しています。

SpringArmの初期値は以下のようになっていますが、これはキャラクターセレクト時のみ、この値を使用し、バトル中は動的に制御することになります。

Camera の初期値については、Projection ModeとField Of Viewの設定が必要で、まず Projection Modeについては、Perspectiveを使用し、3次元的に表現するモードとなります。

Field Of Viewの視野角については、今回は45度としていますが、値が大きくなるほど、広い範囲を画面に収めようとして、画面端付近の映像が歪むので好みに応じて値を設定してください。

それでは、「BP_GlobalCamera」のイベント「BeginPlay」について説明します。

ここでは、画面に映し出す映像をこのカメラが移している映像に切り替えるために、関数「Set View Target with Blend」を使用しており、Targetとして、PlayerControllerとNew View Targetとして、「BP_GlobalCamera」自身を指定し、切り替え時間を0秒で指定し、直ぐに切り替える設定としています。

これで「BP_GlobalCamera」と「BP_Char01」の位置が決まりましたので、今度は「BP_Char01」のイベント「BeginPlay」について説明します。

最初のブランチで、Player01のPlayerControllerで定義している変数”Select Char of P02″の値を確認していますが、これは、バトル前のPlayer02用のスポーンか確認しているため、ここではFalseとなります。

その後、関数「GetActorLocation」で自身の位置を取得しますが、これは先程関数「 Set Initial Position」で設定した値を使用することになり、Yの値に応じて、Player01用のキャラクターであるか確認しています。

その後は、関数「Play Animation」を使用して、キャラクター選択前専用のアニメーションをループ再生しています。

これでキャラクターセレクトで必要なブループリントの初期設定が完了したので、Widgetブループリントの説明に戻ります。

Widgetブループリントの関数「Select Character」でPlayer01のキャラクターを選択し、Enterキーを押したあとの処理となります。

ここでは、バトル中にHPバーの下に表示されるキャラクター名称の画像やHPバーの横に表示されるキャラクター画像を設定しており、それからEnterキーの入力リセット処理と変数”P01 Anim For Selected”をTrueに設定しています。

変数”P01 Anim For Selected” は、「BP_Char01」のTickに繋がった処理で、Player01のPlayerControllerで定義した変数”Widget Ref”が有効である場合、そこから先の処理で参照されており、Trueであれば、キャラクター選択後専用のアニメーションを再生します。

再びWidgetブループリントの戻り、その後、変数”Player01″の値をFalseにして、Player01のキャラクター選択の処理を完了し、変数”Input Value H”を「0」にリセットします。

さらに、変数”Input Possible For P01″の値をFalseにして、Player01の入力を不可にして、Player02用のキャラクター選択アニメーションを再生します。

これは、Player02用キャラクターの名称を表示する画像を画面外から表示しています。

それでは、ここからPlayer02のキャラクター選択の処理を説明します。

下図に表示しているように、先程は変数”Player01″がTrueの場合の処理をしましたが、ここではFalse側の処理を実施し、Enterキーの入力待ちとなるまでの処理は、Player01とほぼ同等で、使用している変数が違うだけです。

Enterキーが入力されたあとの処理は、Player01と同様にバトル中にで使用する画像の設定とキャラクター選択後の専用アニメーションを再生する変数をTrueにし、セレクトキャラクターの処理を完了するので、変数”Select Character”の値をFalseにしています。

更にその後は、Player01と02の入力を不可にする処理を実施し、関数「Load Battle Stage」の処理開始と入力を管理している変数のリセット処理をマクロで行っています。

それでは、ここからキャラクターセレクト中にBackSpaceキーや☓ボタンが押されたときの処理を説明します。

最初のブランチで、Player01と02のどちらのキャラクターセレクト時にキャンセルされたかを確認するため、変数”Player01″の値を確認しており、まずはFalse側のPlayer02がキャラクター選択時にキャンセルされたときの処理を説明すると、変数”P01 Anim For Selected”と”P02 Anim For Selected”、”Cancel”をFalseにして、リセット処理を行っています。

それから、変数”Input Possible For P01″と”Player01″をTrueにして、Player01の入力許可と選択する順番を戻す処理を実施し、現在表示しているキャラクターを関数「Destroy Actor」にて消しています。

さらに、キャラクター選択時に使用している変数”Temp P01 Char Num”と”Temp P02 Char Num”を「0」にリセットし、Player02のキャラクター名称を表示するアニメーションを逆再生して、画面から見えないようにしています。

次に、Player01がキャラクター選択時にキャンセルした場合の説明をします。

現在表示しているキャラクターを関数「Destroy Actor」にて消した後、変数”Input Possible For P01″と”Cancel”をFalseにして、Player01の入力を不可にするのとキャンセル入力のリセット処理をしています。

さらに、セレクトキャラクターのタイトル画像や選択肢を表示するアニメーションを逆再生してから、 キャラクター選択時に使用している変数”Temp P01 Char Num” のリセット処理と、画面を黒くするアニメーションを再生し、変数”Select Character”をFalseにすることで、セレクトキャラクターの処理を完了させ、カスタムイベント「Back To Select Stage」の処理を開始します。

カスタムイベント「Back To Select Stage」では、処理開始後の0.5秒後に、既に説明したカスタムイベント「Begin to Select Stage」の処理を実施します。

以上で説明は終了です。

次回はCharacterブループリントの「BP_Char01」について解説します。

コメントを残す

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

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