【入門者向け】Unreal Learning Kit: Games のBPを簡単解読
解読します
こんにちは。
マーケットプレイスでいつのまにやら「Unreal Learning Kit: Games」なるものがダウンロード可能なことを知りました。
どうやらUE4の教材として使われる(使われている)もののようです。
見た目良い感じ!
こんなアセットを自由に使っていいの!? とびっくりします。
しかも学習用のブループリントもセットなようでワクワク。
見てみました。
…うーん、そんなに多くはないですね!
もしかしたら教材動画の中で増やしていくのかも?
大きく分けてこの3つがあります。
- キャラクター(BP_LearningKit_PlayerCharacter)
- 獲得可能なアイテム(Collectable_Pickup_BP)
- インタラクション可能なレバー(Lever_BP)
風を表現するナイアガラの設定されたアクタ(BP_WindSystem)を入れれば4種でしょうか。ひととおり見てみましたが、入門程度初心者以下くらいの難易度で、スタートアップに使うには若干難易度が高そうな雰囲気です。ある程度基礎を抑えた人ならすんなり内容が理解できるかなと。たぶん。
すこし紐解いてみます。
まだ触ってない方の参考になれば幸いです!
BP_LearningKit_PlayerCharacter(キャラクター)
こいつですね。
世界観がよくわかりませんが、ファンタジーな冒険者風です。
TPSテンプレートにある動きに加えて、以下のような機能が入っています。
- ジャンプと、ジャンプボタンからの飛行(スペースキーの押す回数)
- しゃがみ切り替え(左Ctrl)
- スニーク(左Shift)
- 2種類のインタラクション(左クリック、右クリック)
ちなみにアクションのコマンドはプロジェクト設定の「インプット」から確認できます。
コンポーネント
コンポーネントを見てみます。
テンプレとして使えるようになっていますね。
カメラのFOVが105度になってるのは好みかな?
使用していない「Scene」コンポーネントは謎です。なんだこれ。
ではこのアセット独自の部分を見ていきます。
Begin Play
BeginPlayでは、アニメーションBP(後述)の参照変数を作成して、キャラクターの移動速度(Character Movement のMax Walk Speed)を、設定していますね。
しゃがみ切り替え
しゃがみ切り替えの処理です。キーボードのときは上の処理を使います。
キーを押している間「Crouch」処理が実行され、「Is Crouching」フラグがONになります。離すとOFF。フラグは別の場所でCrouch中に他の動作を実行させないために使います。
単純なものですがCrouchは、CharacterMovementでCrouchをONにしておく必要があります。流用するときはご注意を。
プレイすると気づきますが、しゃがみ時のカメラ挙動がガクガクしますね~…。カメラはCrouchの影響を受けない処理を作ると良いかもしれません。
あるいは、アーム部分の詳細から「ラグ」をONにすると少し軽減されるのでおすすめです。
スニーク
Sneak…とはいうものの、実際にはとくに何もありませんでした。
アニメーションの変化もないようです。押している間だけWalkSpeedが遅くなるだけですね。
なにかここに足していくと良いかもしれません。
個人的にはしゃがみとスニークは一緒でいいような…?
ジャンプ
こちらがジャンプの処理。
インプット最初のブランチでは「Can Interact」というマクロでジャンプ可能かを判断しています。
Can Interact マクロ
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」に変更。
実行してわかりますが、「Do N」をリセットするインターフェースイベント「Anim BP Resset Jump」を呼び出す処理が、アニメーションBPの「ステートブレンド完了イベント」で呼び出されるようになっています。待機アニメーション(Idle)のステートブレンドが終わったときに通知される仕組みですね。
なので、ジャンプ~着地後即座にジャンプしたらリセットされていないことがあります。うーん。
画像では変な浮き方してますね。空中歩き風……個人的にはめちゃくちゃ違和感なのですがどうなんだろうこれ?
とりあえず違和感なく動作させるため、着地時などには即座に「Do N」がリセットさせるようにしてみました。
触っていると、「落下着地に失敗して崖から落下したときなどにFlyで回避したい」などいろいろ気になる部分が出てきますが、こういった部分を直していくだけでも上達できるかもしれませんね!
もっと調整したいですが、ひとまずこのくらいに。
余談ですが、アニメーションステートでのイベント通知や、アニメーション中の通知呼び出しは検索に引っかからないので非常~にわかりづらいなあと思います。管理しづらい!
特別な検索方法あるのかな? みなさんどこかにドキュメントで管理していたりするんでしょうか?
インタラクト
インタラクトは2種類存在します。
現状、左クリックからのインタラクトに紐付いているアクターはないので、右クリックからのインタラクトイベントを見てみましょう(Interact Alt)
インタラクトの処理は、以下のような流れになっています。
インタラクトのインプット実行し、キャラ移動を不可能に。
→ インタラクトアニメーション実行(キーを離すまで実行)
→ アニメーション実行中に対象アクタへのインタラクトする通知を呼び出す
→ 対象アクタのタイムラインを実行してインタラクト演出を実行
→ キーを離すとStop処理を実行&キャラ移動可能に
処理の最初では「Can Interact」マクロで各動作を実行していないかとMovement ModeがWalking状態かを確認します。そして「Stop Player Movement」マクロでプレイヤーの動きを即座に止める処理を実行。これにより移動ができなくなります。
この流れは非常によく使うので、覚えておくといいパターンですね。
そしてアニメーションBP上の「Interact 02」フラグをTrueに。
これによりインタラクトのアニメーションが実行されます。
アニメーションが実行されたら15フレームで「InteractAltNow」を通知します。
これによって、キャラクターの「Anim BP Interact Alt Start」イベントが呼ばれます。
このイベントでは「Interaction Capsule」コンポーネントにオーバーラップしているすべてのアクタに対して「Interact Alt Start」を実行する処理が呼ばれます。
オーバーラップしていれば全部反応してしまいますので、レベルデザイン時には範囲がかぶらないように注意が必要です。
インタラクトするアクタ(Lever_BP)
インタラクトするアクタ(レバー)の処理はこちら。
レバーの上下なのでタイムラインでハンドルを動かしています。
こちらもポピュラーなつくり。
レバーが戻るときはタイムラインのレートを上げたり、インタラクト完了の処理をタイムラインの「Activate」で呼び出す部分など微妙に細やかに作っているな~と感じます。
ただ、意図的と思われますが、アクティベートする前にキーを離してしまうと「Interact Alt Stop」が呼ばれてしまいレバーが元の位置に戻るようになっているのが気になります。一度動作させたら完了まで動かせなくても良いんじゃないかなぁと。自由度が高いということでしょうか。
さて、キーを離すと呼ばれる「Inteact Alt Stop」のあとは、アニメーションBPの「Is Interact 02」をFalseにする処理も呼ばれます。
これでインタラクトアニメーションの終了アニメが呼ばれます。
またステート離脱イベントとして「Done Alt Interacting」が通知されます。
これによりキャラクター側の「Start Player Movement」マクロが呼ばれてキャラクターは移動可能になるという仕組みです。
Celebrate エモート
所謂「喜びエモーション」の実行。とくに難しいところはありませんね。
イベントグラフ上のコメントにも書かれていますが、このままでは直接的すぎるというか、あまり使い物になりません。
Master_Pickup_BP(ピックアップするアクタ)
プレイヤーキャラクターが触れることで取得する機能を持つアクタです。
このMaster~を親にして「Collectable_Pickup_BP」を作成しています。
コンポーネント
とてもプレーンな状態です。拾うアクタについて勉強したい方は参考にできそうですね。個人的にはStaticMeshをNoCollision設定にしたり、使わないプロパティをばしばし切りたくなりましたが、使うぶんには問題なさそう。
On Component Begin Overlap(Sphere)
オーバラップしたときの処理です。
まず触れたアクタが「Player Character」かどうかをブランチで比較、デバッグメッセージを表示して「PickupAble」変数がTrueなら拾ったことにして「Destroy Actor」を実行して削除しています。
なにもなければ即座にDestroyしても良いですが、このアクタ付随の演出を実行してから削除することもありそう。オーバラップ時は判定と表示を消しておくだけでも良いかもしれませんね(Destroyイベントは別イベントにして呼び出す)
ちなみに子アクタ「Collectable_Pickup_BP」「PowerUp_Pickup_BP_Child」ではとくに追加処理はありませんでした。
PlayerButton_BP
プレイヤーがその上にオーバラップしたとき、ボタンが凹んで光る処理が入っています。
コンポーネント
ボタン部分と台座部分に分かれており、検知するコリジョンがボタン部分の子になっています。
Construction Script
コンストラクションスクリプトでは初期化関連が設定されています。汎用性も高そう。
まずボタンの色を変更するためのDynamic Material Instanceの参照作成と、ボタンカラーの設定。
続けてボタンがActivateされていれば(使用可能なら)コリジョンをONにする処理をしています。
最後にButton ActivatedがTrueか(押下済みか)で分岐して、ボタン部分のメッシュ相対位置を設定し、マテリアルインスタンスでボタンの発光具合を設定しています。
On Component Begin Overlap(End Oeverlap)
キャラクターがオーバラップしたとき(あるいは離れたとき)の処理です。
オーバラップしたときに「Button Pressed」「Button Released」が実行される仕組み。
Button Pressed (Released)イベント
ボタン部分の座標変更と発光をタイムライン制御しています。
非常に汎用性の高いつくり。
その他に、押した後にどんな処理をするかを記述するための「Activate」「Deactivate」イベントがありますが、これはタイムラインのFinishedピンあたりに配置するのが一般的かもしれません。
アセットにはドアなどがありますので、すでにある処理を参考に連動させる機能などを作成すれば勉強になりそうですね!
たとえばドアのBPを作成して開く処理をつくり
ボタン側に、参照変数を作成してレベル上で指定。
Pressedをボタンのタイムライン終了後に呼び出します(Finished後には念のため「タイムラインが通常再生であれば」の分岐が挟まっています)
ベーシックなものですがあっという間に作成できました。
良いテンプレですね!
終わりに
解読はこれで以上です。
その他プロジェクトには、リネームやLODに関する処理が入ったブループリントユーティリティが入っていますが、こちらはそのままにしておくとコンパイルエラーが出る場合もありますので、使用しない場合は削除するか、プラグイン側で「Editor Scripting Utilities」をONにしておくことをおすすめします。
ブループリント以外では、マテリアル周りやナイアガラを使った雲や風の演出などもなかなか役に立ちそうです。社内用教材に転用しようかなぁとか思うくらいに見た目が良いですし、とりあえずアクションアドベンチャーの雛形を!というときにも活躍しそうです。個人的にはアセットを使ってミニゲームつくりたくなってきました。
では!
この記事が気に入ったらサポートをしてみませんか?