Choose your operating system:
Windows
macOS
Linux
ゲームとレベルを構築し始めると、シーン内の個々のアクタを見つけることが難しく感じるかもしれません。レベルに設定されている構成要素やジオメトリから NPC、敵、インタラクション可能なオブジェクトやピックアップに至るまで、シーン内のアクタが数百に上ることは珍しくありません。これらの中からひとつのアクタを探し出すのは、ことわざでいう「干し草の山の中にある一本の針を見つける (つまり無駄骨を折る) 」ようなものです。
ただし、 ワールド アウトライナー を使って、シーン内のアクタの検索幅を狭めることはできます (以下の図参照)。
上図では、レベル内に配置されたすべてのアクタがワールド アウトライナー (右) に表示されます。ワールド アウトライナー内のアクタを 1 つクリックすると、レベル ビューポート内でも強調表示されます。 Actor (アクタ) または Type (種類) のヘッダをクリックすれば、 ワールド アウトライナー をアクタ名またはアクタの種類でソートすることができます (Type Box の下向き矢印をクリックすると、サブ カテゴリを種類から別のフィルタへ変更することができます)。
ワールド アウトライナーでアクタを選択した状態で、レベル ビューポート内をナビゲート中に F キーを押すと、選択中のアクタが フォーカス できる位置にカメラを移動します。
シーン内でのアクタの配置については、「 ワールド アウトライナー 」を参照してください。
エディタでのアクタ検索にはワールド アウトライナー使うことができますが、ブループリントでアクタを見つけて修正できるようにするにはどうすれば良いでしょうか? 以下のガイドでは、必要に応じてアクセスおよび修正できる様々な基準でシーン内のアクタ検索を行う方法を紹介します。
実装ガイド
このページでは、 Get All Actors of Class ノードを使ってレベル内でアクタを検索する方法を説明します。このノードは呼び出されると、特定のクラスのレベル内のすべてのアクタを取得して、それらを配列 (変数のコレクション) に配置します。その配列から、好みのフィルタ基準に合わせて全てのアクタまたは個別にアクタを取り出すことができます。アクタの種類および目的に合わせた方法で、アクタのプロパティにアクセスしたり修正することが可能になります。
クラスのアクタを全て取得する
この例では、 Blueprint サードパーソン テンプレート (スターター コンテンツあり) を使用します。
-
コンテンツ ブラウザ の「 Game/Blueprints 」フォルダから 3 つの Blueprint_Effect_Fire アセットをドラッグします。
これらを好きな場所に置きます。検索を試すために置いてみます。
-
コンテンツ ブラウザ の「 Game/Blueprints 」フォルダで MyCharacter アセットを開きます。
-
Blueprint Editor ウィンドウ のグラフで、 右クリック して F Key Event を 追加します。
F を押すと、シーン内のアクタの検索が始まります。
-
F Key Event の Pressed ピンを引き出して、 Get All Actors Of Class ノードを追加します。
名前の通り、このノードは指定したクラスの全てのアクタを取得しようとします。
-
Get All Actors of Class ノードで、 Actor Class ドロップダウンをクリックし、 Blueprint_Effect_Fire クラスを追加します。
-
Out Actors を引き出して ForEachLoop ノードを追加します。
Out Actors は (指定されたクラスの) すべてのアクタの 配列 で、その「それぞれに対して」何かをすることができます。
-
ForEachLoop ノードの Array Element を引き出して P_Fire と Fire Audio を追加します。
-
グラフ内で 右クリック して Deactivate ノードを追加したら、 Fire と Audio のピンを Target に接続します。
画像をクリックしてフルサイズで表示
ここで、プレイヤーが F を押すと、レベル内の炎のエフェクトのすべてのインスタンスを取得し、それらを非アクティブにします。
-
[Compile] ボタンをクリックし、ブループリントを終了し、 [Play] をクリックしてエディタで再生します。
F キーを押すと、レベル内に置いた全ての炎のインスタンスを非アクティブにすることができます。
この方法で、ある特定のクラスの全てのアクタを見つけ出して、何かしら影響を与えることができます。それでは、ある特定のクラスの全てのアクタを見つけ出して、さらにそのクラス内の特定のアクタ群またはアクタを見つけて、すべてのアクタではなく、それらのアクタだけ修正する場合はどうでしょうか?次のセクションでは、結果として得た配列にフィルタを適用して、全てではなく希望する対象だけを取得する方法を説明します。
特定のアクタを取得する
前のセクションで、 Get All Actors of Class ノードを使うと、指定したクラスのアクタの配列が作成されることを理解できたと思います。このセクションでは、様々な基準に合わせて得た配列結果にフィルタを適用して、その配列から特定の複数のアクタを取得、あるいはアクタを 1 つだけ取得する方法を紹介します。
まずひとつめは、アクタで タグ を使う方法です。
-
前のセクションのサンプルをそのまま使用して、レベル内の炎のエフェクトを 1 つ選択します。
-
[Details] パネルの [Tags] セクションで、プラス記号をクリックしてアクタにタグを追加します。
-
タグ用に「 Target 」などテキストを 0 フィールドに入力します。
-
MyCharacter ブループリント内で、 ForEachLoop の Array Element ピンを引き出して Get Tags ノードを追加します。
-
Tags ピンを引き出して Get ノードを追加します。
ここで、 (上のプロセスで Target に設定した) Index 0 でタグを「Get」します。
-
グラフ内を 右クリック して、 Branch ノードを追加します。
-
Branch の Condition を引き出して Actor Has Tag ノードを追加します。
-
Get ノードの出力ピンを Actor Has Tag ノードの Tag ピンに接続します。
-
ForEachLoop ピンの Array Element ピンを Actor Has Tag ノードの Target ピンに接続します。
-
ForEachLoop ピンの Array Element ピンを引き出して P_Fire と Fire Audio を取得して、 Deactivate ノードへ接続します。
画像をクリックしてフルサイズで表示
指定されたクラスのすべてのアクタを収集し、それらを配列内に置き、それぞれのアクタに指定したタグが付いているか確認し、タグがついているアクタのみを非アクティブにするようにしました。
フィルタを適用する別の例です。
画像をクリックしてフルサイズで表示
上の例では、ブループリントの特定のクラスではなく
Emitter
クラスのすべてのアクタを取得しました (レベル内に、煙、炎、風、雨、霧など、複数のエミッタが存在し、これらを全部オフにしたい場合に使用できます)。
Emitter
オブジェクトに
キャスティング
を行ってから、 Emitter がアクティブかを確認し、アクティブな場合は非アクティブにします。
ForEachLoop の後のオブジェクトの場合は、すべてに キャスト する必要はありません。次の例を見てみましょう。
画像をクリックしてフルサイズで表示
クラス TriggerBox のレベル内のすべてのアクタを取得し、それらのコリジョンを無効にします (レベル内の全てのトリガーをオフにします)。アクセスするのは TriggerBox のコンポーネントではなく TriggerBox Actor そのものなので、 TriggerBox に対してキャストする 必要はありません。アクタで構成されるコンポーネントへアクセスしたい場合は、 Cast To ノードを使います。