見出し画像

【入門者向け】Unreal Learning Kit: Games のBPを簡単解読

解読します

こんにちは。

マーケットプレイスでいつのまにやら「Unreal Learning Kit: Games」なるものがダウンロード可能なことを知りました。

画像1

どうやらUE4の教材として使われる(使われている)もののようです。

画像2

見た目良い感じ!

画像3

こんなアセットを自由に使っていいの!? とびっくりします。

しかも学習用のブループリントもセットなようでワクワク。
見てみました。

画像4

…うーん、そんなに多くはないですね!

もしかしたら教材動画の中で増やしていくのかも?

大きく分けてこの3つがあります。

- キャラクター(BP_LearningKit_PlayerCharacter)
- 獲得可能なアイテム(Collectable_Pickup_BP)
- インタラクション可能なレバー(Lever_BP)

風を表現するナイアガラの設定されたアクタ(BP_WindSystem)を入れれば4種でしょうか。ひととおり見てみましたが、入門程度初心者以下くらいの難易度で、スタートアップに使うには若干難易度が高そうな雰囲気です。ある程度基礎を抑えた人ならすんなり内容が理解できるかなと。たぶん。

すこし紐解いてみます。
まだ触ってない方の参考になれば幸いです!


BP_LearningKit_PlayerCharacter(キャラクター)

画像5

こいつですね。
世界観がよくわかりませんが、ファンタジーな冒険者風です。

TPSテンプレートにある動きに加えて、以下のような機能が入っています。

- ジャンプと、ジャンプボタンからの飛行(スペースキーの押す回数)
- しゃがみ切り替え(左Ctrl)
- スニーク(左Shift)
- 2種類のインタラクション(左クリック、右クリック)

ちなみにアクションのコマンドはプロジェクト設定の「インプット」から確認できます。

画像6


コンポーネント

コンポーネントを見てみます。

画像7

テンプレとして使えるようになっていますね。
カメラのFOVが105度になってるのは好みかな?
使用していない「Scene」コンポーネントは謎です。なんだこれ。

ではこのアセット独自の部分を見ていきます。

Begin Play

画像8

BeginPlayでは、アニメーションBP(後述)の参照変数を作成して、キャラクターの移動速度(Character Movement のMax Walk Speed)を、設定していますね。

しゃがみ切り替え

画像9

しゃがみ切り替えの処理です。キーボードのときは上の処理を使います。
キーを押している間「Crouch」処理が実行され、「Is Crouching」フラグがONになります。離すとOFF。フラグは別の場所でCrouch中に他の動作を実行させないために使います。

単純なものですがCrouchは、CharacterMovementでCrouchをONにしておく必要があります。流用するときはご注意を。

画像10

プレイすると気づきますが、しゃがみ時のカメラ挙動がガクガクしますね~…。カメラはCrouchの影響を受けない処理を作ると良いかもしれません。
あるいは、アーム部分の詳細から「ラグ」をONにすると少し軽減されるのでおすすめです。

画像11


スニーク

画像12

Sneak…とはいうものの、実際にはとくに何もありませんでした。
アニメーションの変化もないようです。押している間だけWalkSpeedが遅くなるだけですね。

なにかここに足していくと良いかもしれません。
個人的にはしゃがみとスニークは一緒でいいような…?


ジャンプ

画像13

こちらがジャンプの処理。

インプット最初のブランチでは「Can Interact」というマクロでジャンプ可能かを判断しています。

画像14

Can Interact マクロ

画像15

Crouch時にONになるフラグでしゃがんでいないか、「Is Interact 01」「Is Interact02」でインタラクト中でないか(アニメーションBP)、アニメーションBP自体が存在するか(Is Valid)をまとめて確認して「Is Not Busy」として返していますね。

(変数名がわかりづらくて気になりますが)新たなアクションを追加したときは、このマクロに追加して行くと良いでしょう。


続けて「Do N」でジャンプボタンを押した回数によって処理を分岐してます。「Do N」は、しばしば多段ジャンプを作るときに使用しますね。ジャンプを押した数をカウントしておき、1回目はジャンプ、2回目は「Fly」イベントでキャラを飛行状態に、3回目でキャラの状態をFalling(落下)状態に変更するようにしています。

Fly イベント

ジャンプ中に実行される「Fly」イベントでは、先程のジャンプイベント同様フラグチェックを行い、「Launch Character」でキャラクターを飛ばします。

「Launch Character」はJump以外の方法でキャラを浮かせたいとき、あるいはJumpの実行中にさらに飛ばしたいときなどに有用ですね。

Launch する力(Velocity)には、指定の前方&上方に進む力(Forward Vector)を与えています。「XY Override」「Z Override」にチェックが入っていないので、移動の力に足されます。その後に若干の「Delay」をおいて移動モードを「Flying」に変更。

画像16


実行してわかりますが、「Do N」をリセットするインターフェースイベント「Anim BP Resset Jump」を呼び出す処理が、アニメーションBPの「ステートブレンド完了イベント」で呼び出されるようになっています。待機アニメーション(Idle)のステートブレンドが終わったときに通知される仕組みですね。

画像17

画像18

なので、ジャンプ~着地後即座にジャンプしたらリセットされていないことがあります。うーん。

画像19

画像では変な浮き方してますね。空中歩き風……個人的にはめちゃくちゃ違和感なのですがどうなんだろうこれ?

とりあえず違和感なく動作させるため、着地時などには即座に「Do N」がリセットさせるようにしてみました。

画像20

触っていると、「落下着地に失敗して崖から落下したときなどにFlyで回避したい」などいろいろ気になる部分が出てきますが、こういった部分を直していくだけでも上達できるかもしれませんね!
もっと調整したいですが、ひとまずこのくらいに。


余談ですが、アニメーションステートでのイベント通知や、アニメーション中の通知呼び出しは検索に引っかからないので非常~にわかりづらいなあと思います。管理しづらい!
特別な検索方法あるのかな? みなさんどこかにドキュメントで管理していたりするんでしょうか?


インタラクト

インタラクトは2種類存在します。

画像21

画像22

現状、左クリックからのインタラクトに紐付いているアクターはないので、右クリックからのインタラクトイベントを見てみましょう(Interact Alt)

インタラクトの処理は、以下のような流れになっています。

インタラクトのインプット実行し、キャラ移動を不可能に。
→ インタラクトアニメーション実行(キーを離すまで実行)
→ アニメーション実行中に対象アクタへのインタラクトする通知を呼び出す
→ 対象アクタのタイムラインを実行してインタラクト演出を実行
→ キーを離すとStop処理を実行&キャラ移動可能に

処理の最初では「Can Interact」マクロで各動作を実行していないかとMovement ModeがWalking状態かを確認します。そして「Stop Player Movement」マクロでプレイヤーの動きを即座に止める処理を実行。これにより移動ができなくなります。

画像23

この流れは非常によく使うので、覚えておくといいパターンですね。

そしてアニメーションBP上の「Interact 02」フラグをTrueに。

画像24

これによりインタラクトのアニメーションが実行されます。

画像25

アニメーションが実行されたら15フレームで「InteractAltNow」を通知します。

画像26

画像27

これによって、キャラクターの「Anim BP Interact Alt Start」イベントが呼ばれます。

画像28

このイベントでは「Interaction Capsule」コンポーネントにオーバーラップしているすべてのアクタに対して「Interact Alt Start」を実行する処理が呼ばれます。

画像29

オーバーラップしていれば全部反応してしまいますので、レベルデザイン時には範囲がかぶらないように注意が必要です。


インタラクトするアクタ(Lever_BP)

画像30

インタラクトするアクタ(レバー)の処理はこちら。
レバーの上下なのでタイムラインでハンドルを動かしています。
こちらもポピュラーなつくり。

レバーが戻るときはタイムラインのレートを上げたり、インタラクト完了の処理をタイムラインの「Activate」で呼び出す部分など微妙に細やかに作っているな~と感じます。

ただ、意図的と思われますが、アクティベートする前にキーを離してしまうと「Interact Alt Stop」が呼ばれてしまいレバーが元の位置に戻るようになっているのが気になります。一度動作させたら完了まで動かせなくても良いんじゃないかなぁと。自由度が高いということでしょうか。

さて、キーを離すと呼ばれる「Inteact Alt Stop」のあとは、アニメーションBPの「Is Interact 02」をFalseにする処理も呼ばれます。

画像31

これでインタラクトアニメーションの終了アニメが呼ばれます。

画像32

またステート離脱イベントとして「Done Alt Interacting」が通知されます。

画像33

画像34

これによりキャラクター側の「Start Player Movement」マクロが呼ばれてキャラクターは移動可能になるという仕組みです。

画像35

画像36


Celebrate エモート

所謂「喜びエモーション」の実行。とくに難しいところはありませんね。

画像37

画像38

イベントグラフ上のコメントにも書かれていますが、このままでは直接的すぎるというか、あまり使い物になりません。



Master_Pickup_BP(ピックアップするアクタ)

画像39

プレイヤーキャラクターが触れることで取得する機能を持つアクタです。
このMaster~を親にして「Collectable_Pickup_BP」を作成しています。

コンポーネント

画像40

とてもプレーンな状態です。拾うアクタについて勉強したい方は参考にできそうですね。個人的にはStaticMeshをNoCollision設定にしたり、使わないプロパティをばしばし切りたくなりましたが、使うぶんには問題なさそう。


On Component Begin Overlap(Sphere)

オーバラップしたときの処理です。

画像41

まず触れたアクタが「Player Character」かどうかをブランチで比較、デバッグメッセージを表示して「PickupAble」変数がTrueなら拾ったことにして「Destroy Actor」を実行して削除しています。

なにもなければ即座にDestroyしても良いですが、このアクタ付随の演出を実行してから削除することもありそう。オーバラップ時は判定と表示を消しておくだけでも良いかもしれませんね(Destroyイベントは別イベントにして呼び出す)

ちなみに子アクタ「Collectable_Pickup_BP」「PowerUp_Pickup_BP_Child」ではとくに追加処理はありませんでした。


PlayerButton_BP

画像42

プレイヤーがその上にオーバラップしたとき、ボタンが凹んで光る処理が入っています。

画像43


コンポーネント

画像44

ボタン部分と台座部分に分かれており、検知するコリジョンがボタン部分の子になっています。


Construction Script

画像45

コンストラクションスクリプトでは初期化関連が設定されています。汎用性も高そう。

まずボタンの色を変更するためのDynamic Material Instanceの参照作成と、ボタンカラーの設定。

画像46

続けてボタンがActivateされていれば(使用可能なら)コリジョンをONにする処理をしています。

画像47

最後にButton ActivatedがTrueか(押下済みか)で分岐して、ボタン部分のメッシュ相対位置を設定し、マテリアルインスタンスでボタンの発光具合を設定しています。

画像48


On Component Begin Overlap(End Oeverlap)

キャラクターがオーバラップしたとき(あるいは離れたとき)の処理です。

画像49

オーバラップしたときに「Button Pressed」「Button Released」が実行される仕組み。

Button Pressed (Released)イベント

画像50

ボタン部分の座標変更と発光をタイムライン制御しています。
非常に汎用性の高いつくり。
その他に、押した後にどんな処理をするかを記述するための「Activate」「Deactivate」イベントがありますが、これはタイムラインのFinishedピンあたりに配置するのが一般的かもしれません。

画像51

アセットにはドアなどがありますので、すでにある処理を参考に連動させる機能などを作成すれば勉強になりそうですね!

たとえばドアのBPを作成して開く処理をつくり

画像52

画像53

ボタン側に、参照変数を作成してレベル上で指定。
Pressedをボタンのタイムライン終了後に呼び出します(Finished後には念のため「タイムラインが通常再生であれば」の分岐が挟まっています)

画像56

画像55

画像54

ベーシックなものですがあっという間に作成できました。
良いテンプレですね!

画像57


終わりに

解読はこれで以上です。

その他プロジェクトには、リネームやLODに関する処理が入ったブループリントユーティリティが入っていますが、こちらはそのままにしておくとコンパイルエラーが出る場合もありますので、使用しない場合は削除するか、プラグイン側で「Editor Scripting Utilities」をONにしておくことをおすすめします。

画像58

画像59

ブループリント以外では、マテリアル周りやナイアガラを使った雲や風の演出などもなかなか役に立ちそうです。社内用教材に転用しようかなぁとか思うくらいに見た目が良いですし、とりあえずアクションアドベンチャーの雛形を!というときにも活躍しそうです。個人的にはアセットを使ってミニゲームつくりたくなってきました。

では!

この記事が気に入ったらサポートをしてみませんか?