とあるゲームプログラマの挑戦と敗北の歴史

UE4とプログラミングとmayaとpythonとhtmlとマラソンを中心に情報を発信する元「技術ブログを目指すブログ」から再始動した毎日の日々を発信するブログです。

UE4:オンラインラーニング(ブループリントによるツインスティック シューター)

UE4オンラインラーニング
ブループリントによるツインスティック シューター
を受講した際のおぼえ書きです。

https://learn.unrealengine.com/course/2855684


スカイライトのキューブマップ指定
・ライトの SourceType を SLSSpecifiedCubemap に変更
・一例として Cubemap を HDRI_Epic_Courtyard_Daylight に変更
するとキューブマップを指定することできます。
f:id:toncrimentan_w:20210309183442p:plain
ちなみにキューブマップを開くと
こんな風なepic本社だったりします。
f:id:toncrimentan_w:20210309183522p:plain



動的にシーンの輝度調整を無効にする方法
・ポストプロセスボリュームを配置
・レンズ>Exposure の
 最小輝度、最大輝度を1.0にすることにより
シーンの明るさが動的でないようにできます。
f:id:toncrimentan_w:20210309183736p:plain



このコースでは Actor Pawn Character のに関して解説がなされており。
利用された図が非常にわかりやすいです。
Actor      - ワールド配置物
 + Pawn    - 操作可能なもの
  + Character - 歩行可能なもの、MovementComponentを持っています。
Component   - Actorの部品
Controller    - PlayerController AIController があり Pawnクラスが持っています
GemeMode   - ゲームのルールです。
f:id:toncrimentan_w:20210309183905p:plain
※動画からパクった図



親クラスの変数の表示方法
・目のマークをクリックし
・継承した変数を表示にチェックを入れることで
親クラス(コースではBaseCharacter)の変数を表示することができます。
f:id:toncrimentan_w:20210309184445p:plain



SpringArmコンポーネント
SpringArmコンポーネントはカメラを子階層に追加することで、
カメラまでの相対的な距離を指定するコンポーネントです。
・DoCollisionTestのチェックを外すことでコリジョンテストを無効にできます。
・InheritPitch Yaw Roll のチェックを外すことで回転を無効にできます。
f:id:toncrimentan_w:20210309184707p:plain
使用例として、こんな感じに親子階層を作って利用します。
f:id:toncrimentan_w:20210309185052p:plain



ProjectileMovementコンポーネント
アクターを発射物としてあつかうための専用コンポーネントです。
IntialSpeedに速度を入力することができます。
こういった簡単な処理は、ついつい自前で製作してしまいそうになりますが、
すでに出来上がっているものがあるのでこちらを利用しましょう。

f:id:toncrimentan_w:20210309185449p:plain



タグ付けにる判別
プレイヤーが銃などを利用し攻撃した時の
発射物が接触したものがエネミーなのかどうかを判別することがあります。
その際、方法のひとつとして ActorTag を利用し判別することができます。

設定方法)
・クラスのデフォルトを選択
・Tagにタグ名を記述(ここではfriendlyとしています。)
f:id:toncrimentan_w:20210309190048p:plain

判別方法)
・ActorHasTagノードを利用することで
 接触物のアクタータグを判別することができます。
f:id:toncrimentan_w:20210309190103p:plain



プレイヤーの死亡と再生成の仕方
事前にGameModeクラスに
新しいプレイヤーの生成処理 & 操作キャラのバトンタッチ処理
を作っておく必要があります。
バトンタッチは Possessノードを利用します。

そしてPlayerクラスでは死亡した際に
GameModeクラスに制作した 再生成&バトンタッチ処理 を呼び出すようにし、
自身をDestroyすることでプレイヤーの死亡とリスポーン処理を実現できます。
f:id:toncrimentan_w:20210309190557p:plain
※ここで重要なのはゲームのルールに関する処理は
 GameMode に書くべきということです。
 こういった処理はついついレベルBPに書いてしまいがちです。
 実際、私はそうしてしまっていることがよくありました。
 本コースではGameModeに実装する方向で解説されています。
 (エネミー生成のトリガー処理などもGameModeに書くべきです。)



ボックスボリューム内のランダムな座標の取得方法
画像のようにRandomPointInBoundingBoxノードを利用すると
ボリューム内のランダムな位置を楽に取得することができます。
f:id:toncrimentan_w:20210309191330p:plain



アクターを一定時間後破棄する方法
発射物を一定時間後に自動削除したい場合などに利用します。
・クラスのデフォルトを選択
・アクタ>InitalLifeSpawn
 に書きされるまでの時間を指定することで自動的に破棄することができます。
簡単な処理なので意外と自分で作ってしまいそうなところですが、
こういった機能は最初から存在するため利用した方がよいです。
f:id:toncrimentan_w:20210309191440p:plain



ブレンドスペース
ブレンドペースは複数のアニメーションを
値に応じてブレンドする機能です。

軸の設定方法)
アセット詳細タブの
水平軸の Name Minimum Maximum の値
垂直軸の Name Minimum Maximum の値
をそれぞれ入力することで
ブレンドする際のグラフの軸を指定することができます。
f:id:toncrimentan_w:20210310005415p:plain

グラフの設定方法)
あとはアセットタブから
グラフ上のポイントごとのモーションを配置していきます。
f:id:toncrimentan_w:20210310005526p:plain




移動方向とキャラの向きの差分の取り方
・GetVerocityノードを取得しRotationFromXVectorで移動向きを取得
・GetControlRotationからポーン自身の向きを取得
・Deltaノードを利用
 すると2角度間の差分を取得することができます。
GetControlRotationで自身の向きを取得できるのは発見でした。
f:id:toncrimentan_w:20210310010044p:plain



複数の死亡モーションからランダムなものを再生
整数値でのブレンドポーズノードを利用すれば
アニメーションBPで複数のモーションから
ランダムなものを一つ再生することができます。
f:id:toncrimentan_w:20210310010149p:plain
※ピンが足りないときは
右クリック>ブレンドピンを追加
でピンを増やすことができます。



ソケットの追加方法
ケルトンに対し、武器などをアタッチする際の追加ポイントを
をソケットといい、自由に追加することができます。
・アニメーションシーケンスを開く
・スケルトンタブを選択し
・適当なボーンを右クリック
・ソケットを追加を選択
するとアタッチポイントを追加することができます。
f:id:toncrimentan_w:20210310011517p:plain


プレビューアセットの指定
さらにデバッグで武器をアタッチさせ確認することができます。
装備中のイメージを確認しやすいので
もしイメージと違ったら、ソケット位置を調整することができます。
・ソケット右クリック
・プレビューアセットを追加を選択
・確認したいアセットをリストから選択する
f:id:toncrimentan_w:20210310011534p:plain
イメージとちがったらソケット位置を調整しましょう
f:id:toncrimentan_w:20210310011556p:plain


プレビューして問題ないようなら
ゲーム中ではAttachActorToComponentノードを利用しアタッチします。
f:id:toncrimentan_w:20210310011704p:plain



アニメーションBPの子ブループリント
アニメーションBPを全キャラ分、
たとえば、人型、剣士人型、武道家人型、魔法使い人型と
共通する部分もあるのに、全部作らなくてはならないのかというと
そうではなく、
アニメーションBPも子ブループリントを作ることができ、
違う部分をオーバーライドすることで量産することができます。

・子ブループリントをひらく
・アニメーションBPを右クリック
・子ブループリントクラスをを作成を選択
でキャラのABPをもとにした
エネミーのABPを作成することができます。
f:id:toncrimentan_w:20210310013039p:plain

・子ブループリントをひらく
・アセットオーバーライドタブを選択
・差分になる部分の上書き値を設定
この手順で子ブループリントの差分の部分を指定できます。
※この機能は正直しりませんでした。
 てっきり全部根性で作るのかと思っていました。

f:id:toncrimentan_w:20210310013057p:plain



入力を無効化する方法
方法はいくつかありますが、このコースでは
プレイヤーはDisableInputノードを利用し入力を無効化し
エネミーはDetachFromControllerPendingDestroyノードを利用し
コントローラを破棄することで移動を無効化しています。

プレイヤー操作無効化)
f:id:toncrimentan_w:20210310013539p:plain
エネミーの移動無効化)
f:id:toncrimentan_w:20210310013602p:plain



フィル指定
ヴィジェットBPのフィル指定にチェックをいれると
のこる領域を埋め尽くすように配置できます。
f:id:toncrimentan_w:20210310120502p:plain



パッケージTIPS
プロジェクト設定>パッケージ化>圧縮およびクック済みのパッケージを作成
にチェックを入れることでファイルサイズが小さくなります。
プロジェクト設定>パッケージ化>パッケージ化されたビルドに含めるマップのリスト
にパッケージ対象のレベル一覧を作成することができます。
f:id:toncrimentan_w:20210310120643p:plain
f:id:toncrimentan_w:20210310120656p:plain
パッケージは周知のとおり
メニューバーのファイル>プロジェクトをパッケージ化
から作成します。
f:id:toncrimentan_w:20210310121005p:plain



出来たやつ)
youtu.be



このコースでは空のレベルから作成し
最速でシンプルなシューターゲームを作るまでの手順を解説しています。
内容は幅広くC++についての解説も入っているほどです。
講師のテンションが高いです!!

自動輝度調整の無効化、アクタとポーンの関連性、タグ付けにる判別、
ProjectileMovement、操作キャラの変更、ブレンドスペース、アタッチ、
アニメーションBPの子BPの作り方、入力の無効化、ヴィジェットBP
など非常に幅広く学ぶことができます。

ゲームのルールをレベルBPではなくゲームモードに実装しているところは
これまでの私が作ってきた部分を見直す重要な情報と思えました。
またアニメーションBPを継承して使用する方法など
あたしい発見もありました。