
はじめに
アドグローブ ゲーム事業部の背景アーティスト、Sです。私のブログ記事をご覧いただき、ありがとうございます!
先日は、UE5 ゲームのアーティスト向けのプロトタイピングとしてマテリアル関数やBlueprint(BP)でスカラーパラメータを制御する方法 をご紹介しました。
今回のブログでは前回に引き続きアーティスト向けのプロトタイピングとして、タグ(Tags)や実用的なシーンをご紹介します。
ぜひ活用していただけると嬉しいです。
タグ - Tags
シーン内の一つのアクターだけを個別に変更したい場合はどうすればいいのでしょうか?そんなときは、タグを使用します。
私の知る限り、ほとんどのシーンアクターはタグを持っています。このタグを使用して、一つのアクターの詳細パネルの設定をBPやスクリプトで制御できますし、その上で機能性も向上します。
以下の画像でBPではなく、ランダムMFを使用したStaticMeshをいくつか配置しました。詳細パネルで「タグ」と書くと、Component TagsとアクタTagが表示されます。まずは、アクタTagにタグ名を割り当てましょう。

タグの使用するスケーラーパラメータ
もう一度、レベルBPに戻ります。BPの中で、「Get All Actors of Class」を「Get All Actors of Class with Tag」に変更して、接続を確認します。シーンにStaticMeshを配置したので、「Class」を「スタティックメッシュ」に変更します。


前回、シーンに配置したスタティックメッシュに設定したタグを「Get All Actors of Class with Tag」のタグ名にコピペします。 (大文字と小文字が区別されるので、注意してください)
結果を確認しましょう。Let's Play!

タグを使った制御の例をもう少し見てみましょう。
タグの使用するコリジョン制御 - Collision Control using tags
アーティストやデザイナーがコリジョンを変更したいと考えることも多いでしょう。
まず、レベルBPに戻りましょう。「For Each」ノードから「Set Collision Enabled (StaticMesh Component)」を接続します。そのノードでNew Type値をNo Collisionに選び、入力ピンが接続されていることを確認します。
これで、設定したホットキーを押すと、前回タグで準備されたキューブのコリジョンが変化するはずです。プレイして確認してみましょう。

ビューポートで全てのキューブにコリジョンが設定されていることを確認します。


はい、うまくいきましたね!
メートリクス制御 - Matrix control
他によく使われる詳細パネルの変更例は、アクターを移動することです。これをタグに制御実装しましょう。
まず、キューブたちをムーバブルに設定します。

レベルBPに戻ります。アクターを移動させるため、現在の位置を知る必要があります。
「For Loop」から「Get World Location」ノードを選択し、使いやすさのために構造体を分割します。自動作成された「Staticmesh Component」ノードに「Set Relative Position」ノードを接続し、先ほどと同様に、ベクトルを構造体に分割します。



[Set Collision] の出力から [Set Relative Location] に接続し、図のように、X と Y の値をそのまま接続します。Return Value Z に Add ノード [+] を繋げて 100 の値を入力し、New Location Zに接続します。

全部うまくいったら、プレー中にホットキーを押すたびに、タグ付けされたアクターの色が変わり、100cm上がるはずです。プレイして確認しましょう。

ここまで出来たことから、可能性を感じていただけたでしょうか。
必要なノードの名前を探すのは難しいかもしれませんが、オンラインにドキュメントがあるので活用していきましょう。また、より技術的な助けが必要でしたら必要に応じてデザイナーやエンジニアにアドバイスを求めましょう。
これらの例が皆さんの挑戦の助けになることを願っています!
実用的なシーン
ここからは、学んだことをさらに一歩進めて [マテリアル パラメータ コレクション] と呼ばれる Unreal Engine 機能を使用してシーンを構築してみましょう。この機能は、これまで使用してきたさまざまなアクターとノードの通信を組み合わせるのに最適な方法となっています!
BPに圧倒されている場合、タスクを段階的に進めるのがおすすめです。MM、MF、Light Function、BPロジック作業が終わったら、それらを統合したくなるかもしれません。その際には、マテリアル パラメータ コレクションを使用すると便利です。
それを実現するには、マテリアル パラメータ コレクションを使用します。
単純なシーンを作ってみましょう。ボックスと StartersContent のメッシュを使って部屋を作成しました。
避難誘導灯は無料アセットサイトから取得し、ThirdPerson プレイヤーとスポットライトも配置しました。シーンが完成したら、プレイしてコリジョンを確認しましょう。必要に応じて、メッシュやコリジョンを調整してください。
この小さなシーンの目標は、1つのスイッチでライトをオフにし、ドアの上のライトの色を切り替え、ドアを開くことです。

マテリアル パラメータ コレクション
マテリアル パラメータ コレクション シーンの設定が完了したら、コンテンツブラウザで「Material Parameter Collection」アクターを作成し、適切な名前を割り当てます。以後、「MPC」と呼びます。

初めてMPCを開くと、あまり印象的に感じないかもしれませんが、実際は非常に強力なアクターです。
以下の画像のように、最初のスカラー・パラメーターを追加します。
(MMで作成したスカラー・パラメーターと同様に、このパラメーター名は大文字と小文字が区別されます)

MPCをMMに接続するには、[CollectionParameter] ノードを追加し、2つのカラーLerpのAlphaに接続します。
[CollectionParameter] 内のParameterNameが、事前に作成されたものに設定されていることを確かめます。 MMを適用し保存したら、MIを作成し、シーン内の任意のオブジェクトにMIを割り当てます。その後、テストを実行し、MPCのスカラー値を1に設定します。

完璧です!続けて、次の機能にいってみましょう。
LightFunctionの制御
照明のオン・オフを切り替える状態を作成しましょう。
Lightをオン・オフする最も簡単な方法は、Light Functionドメインを使用して新しいマテリアルを作成し、シーン内に配置されたスポットライトに割り当てることです。 事前に準備した[Collection Parameter]を追加し、以下の図のように接続します。最後に、作成したマテリアルをシーン内のスポットライトに割り当てます。

前のカラー・スイッチ・マテリアルと同じロジックを使用するため、MPCを開き、スイッチの値を変更してSpotlightをオン・オフできます。このとき、スイッチの値「1」がLightをオフにするため、少し混乱する可能性があるのでご注意ください。


すべてがうまくいけば、この1つのパラメーターで、シーン内の2つの異なる要素の状態を制御できるようになります。
次のステップとして、プレイ中にMPCパラメーターを制御できるようにする設定を行います。まず、レベルのBPを開き、クラスデフォルトパネルを表示します。その中で、入力の「AutoReceiveInput」がPlayer1に設定されていることを確認してください。

「キーボード」ノードを作成します。
Pressedの出力から「Set Scalar Parameter Value」というノードに接続し、Collectionの入力には事前に作成したMPCを設定します。「Set Scalar Parameter Value」ノードを複製し、値を1に設定します。
以下の画像のように、スカラー・ノードとキーボード・ノードの間に「FlipFlop」というノードを接続します。この「FlipFlop」ノードを使うことで、キーボードのキーが押されるたびに、2つのパラメーター値を切り替えることができます。

ドアの制御
では、ドア用のBPを作成しましょう。 まず、アクター系の新しいブループリントを作成します。その中で、StaticMeshを追加し、ドアメッシュを割り当てます。追加したStaticMeshをEvent Graphにドラッグし、StaticMeshから「Get World Rotation」ノードを接続して、ドアの初期位置を取得します。
次に「BeginPlay」イベントノードから「Timeline」ノードを接続します。この「Timeline」ノードは、プロトタイプの機能を作成する際に非常に便利です!一緒に試してみましょう。

タイムラインノードをダブルクリックすると、その編集画面が開きます。
「+トラック」ボタンをクリックしてFloat Trackを追加し、適切な名前を割り当てましょう。 タイムラインの長さはデフォルトで5に設定されていますが、必要に応じて変更することが可能です。このドアの例では、50に設定するのが適切です。 タイムライン内の任意の場所を右クリックしてキーを2つ追加します。1つ目のキーでは、タイムと値をともに0に設定してください。2つ目のキーについては、タイムをトラックの長さ(50)に、値を1に設定します。

イベントグラフに戻り、タイムラインノードから「Set Relative Rotation」ノードを接続します。
この際、「Default Scene Root」コンポーネントではなく、StaticMeshコンポーネントを使用していることを確認してください。

ドアの回転値を時間の経過に応じて徐々に更新するために、タイムラインのトラックを使用します。
次に、「Lerp (Rotator)」ノードを追加し、タイムラインのトラックをAlphaピンに接続します。
「Get World Rotation」の出力をAピンに接続し、Bピンには適切な値を設定します。(私の場合は「0, 0, 80」を使用しました。)その後、「Lerp」の結果を「Set Relative Rotation」ノードに接続します。

時間と共に変化するトラック値を使って回転値をドアに適用することで、スムーズなドアの動きを実現できましたね。
次のステップは実際に動作を確認することです。これまでの作業がしっかり動けば、完成ももうすぐです!
プレイして試してみてください!

問題がなければ、以前作成したマテリアルやライトスイッチと同様に、このドアBPもレベルBPに接続しましょう。
まず、ドアのBPに戻ります。このBPをレベルBPで制御するために、「BeginPlay」イベントをカスタムイベントに置き換える必要があります。
右クリックして「Custom Event」ノードを追加し、適切な名前を割り当ててから、タイムラインの入力に接続します。

コンパイルして保存すれば、このBPは一旦完了です。
次に、レベルBPを再び開きます。以前使用した「Get (All) Actor of Class」ノードを利用して、シーン内に配置されたドアBPの情報を取得することができます。
しかし、単純なプロトタイプでは「Actor of Class」ノードを使用するだけで充分かもしれません。
※その場合、影響を受けるアクタは最初に配置されたアクタである点に注意してください。
次に、「Actor of Class」ノードをドアBPに変更し、「Scalar Parameter」ノードの出力に接続します。
「Get Actor of Class」のReturn Valueから、事前に作成したカスタムイベントを呼び出して接続します。

プレイして結果を確認しましょう!

最後に、もう一度ドアのBPに戻りましょう。ドアを閉じられるようにするため、新しいイベントを作成する必要があります。
カスタムノードを作成し、適切な名前を割り当てたうえで、タイムラインの「Reverse」に接続してください。

この記事を書いている時点では、私自身まだBPを学んでいる最中だったため、リバースシステムがうまく機能せず、原因を特定するのに少し時間がかかりました。
結果として、BPのロジックは完璧な「0, 0, 0」に達したとき、回転をどの値に戻すべきかを認識できていなことが原因のようでした。
対策のため、Rotator AのZ軸値を「0.0001」に設定してください。

次に、「Get Actor of Class」をコピー&ペーストし、「閉じる」のカスタムイベントを作成して接続します。
最後に、もう一度プレイして結果を確認しましょう。
うまくいきましたね!

プロトタイピング初心者の私にお付き合いいただき、ありがとうございます。
今回ご紹介したこと以外にも、UE5が提供するさまざまなアクターを連携させるために学んだ小さな機能がたくさんあります。それらについては、次回のブログ執筆時にご紹介したいと思います。
まとめ
背景アーティストとして、なぜ技術的なことを学ぼうとするのかをよく聞かれます。
確かに、私以外にもこれらの業務を専門に行う適任者がいるかもしれませんが、私にとってこれらのスキルを習得する重要な理由が2つあります。
1つ目は、技術面に長けた同僚の負担を軽減するためです。私たちアーティストは、システムやワークフローが実際に機能するのか、クライアントのニーズに合っているのか、評価されるものなのか、確信が持てない状況によく直面します。そのような場合、技術者に助けを求める前に、自分たちで試すことができれば時間の節約になります。
2つ目は、プレゼンテーションの質を向上させるためです。パワーポイントで美しい資料を作成することも可能ですが、上司やクライアントにゲームや機能の動作を示す動画を制作することもできます。私は、プレイ可能なデモや実際の機能をプレイして反応を見せることが、録画した動画よりもインパクトがあり、チームの能力をより効果的に示せると考えています。これは西洋的な考え方で仕事をしてきた影響かもしれませんが、私にとっては価値ある習慣となっています。
以上、お読みいただきありがとうございました。
この記事で紹介したテクニックが、皆さんの開発に少しでも役立てば嬉しいです。ありがとうございました!