[UE4] Event Graph に最初からある半透明の BeginPlay アレ何なの?

(UE 4.18.1)

この記事は、Unreal Engine 4 (UE4) Advent Calendar 2017 の 10 日目の記事です。

「Blog にはある程度まとまった内容の記事を書こう」と思っていたら億劫になって更新しなくなってしまったので、これからは短めの記事を頻度高めで書いていきたいと思います…。

今回はコレ (↓) について書いていきます。

お名前は何ていうの?

『Ghost Node』 と呼ぶようです。無駄にカッコイイ。

どういう Node が Ghost Node なの?

Node を Ghost Node に変換するメソッド UEdGraphNode::MakeAutomaticallyPlacedGhostNode の中身は以下のとおりです。

(Runtime/Engine/Private/EdGraph/EdGraphNode.cpp)

void UEdGraphNode::MakeAutomaticallyPlacedGhostNode()
{
 EnabledState = ENodeEnabledState::Disabled;
 NodeComment = LOCTEXT("DisabledNodeComment", "This node is disabled and will not be called.\nDrag off pins to build functionality.").ToString();
 bUserSetEnabledState = false;
}

また、Node が Ghost Node であれば true を返すメソッド UEdGraphNode::IsAutomaticallyPlacedGhostNode の中身は以下のとおりです。

(Runtime/Engine/Private/EdGraph/EdGraphNode.cpp)

bool UEdGraphNode::IsAutomaticallyPlacedGhostNode() const
{
    return !bUserSetEnabledState && (EnabledState == ENodeEnabledState::Disabled);
}

以上より、

  • EnabledStateENodeEnabledState::Disabled である
  • bUserSetEnabledStatefalse である

という 2 点を両方満たせば、その Node は Ghost Node であると言えるようです。

ENodeEnabledState::Disabled って何なの?

Node には Compile Option というものが存在しており、これによって Node がコンパイル・実行されるかどうかが決まります。内部的には ENodeEnabledState 型のメンバ変数 EnabledState として保持されます。

Compile Option ENodeEnableState 実行の有無
Enable Compile (Always) Enabled 常に実行される
Enable Compile (Development Only) DevelopmentOnly Shipping Build では実行されない
Disable (Do Not Compile) Disabled 常に実行されない

なお、

Editor Preferences → Content Editors → Blueprint Editor → Experimental → Allow Explicit Impure Node Disabling

のチェックをオンにすることで、Inpure Node  (実行ピンが付いているもの) の右クリックメニューにて Compile Option の変更ができるようになります。

Ghost Node は EnabledStateENodeEnabledState::Disabled なので、常にコンパイル・実行されず、無いもの同然として扱われるということです。

Ghost Node には Disabled と書かれたしましまが付いてないけど何故なの?

Compile Option を Disable に設定した Node には “Disabled” と書かれたしましまの Border が付いていますが、Ghost Node には付いていません。

このしましまの Slate を描画する処理は、SGraphNode::UpdateGraphNode の中にある以下の if ブロック内に書かれています。

(Editor/GraphEditor/Private/SGraphNode.cpp)

if ((GraphNode->GetDesiredEnabledState() != ENodeEnabledState::Enabled) && !GraphNode->IsAutomaticallyPlacedGhostNode())

先に挙げた UEdGraphNode::IsAutomaticallyPlacedGhostNode の内容と合わせると、Ghost Node でしましまが描画されないのは、bUserSetEnabledStatefalse であることに依るものとわかります。

この他にも、bUserSetEnabledState の値によって挙動が変化する処理がいくつかあります。1

不要な Node が化けて出てくるんだけど除霊できないの?

EditorPerProjectUseSettings.ini[DefaultEventNodes] セクションで Ghost Node の追加・削除ができます。

例えば、

  • Actor の ActorBeginOverlap はあまり使わないので Ghost Node として出てほしくない
  • Behavior Tree の Task を書く時に、最初から ReceiveExecuteAI が出ていてほしい

という場合は、

《Project Directory》/Config/DefaultEditorPerProjectUserSettings.ini に以下のように記述します。

[DefaultEventNodes]
-Node=(TargetClass=Actor TargetEvent="ReceiveActorBeginOverlap")
+Node=(TargetClass=BTTask_BlueprintBase TargetEvent="ReceiveExecuteAI")

TargetClass には A や U などの接頭辞を除いた Class 名を、TargetEvent には元のメソッド名 (Display Name ではない) を指定する必要があるようです。

まとめ

  • 最初から配置されている半透明の Node は Ghost Node と呼ぶ
  • Ghost Node は基本的に Disable な Node と同じだが、表示や操作時の挙動など異なる点もある
  • デフォルトで配置される Ghost Node は .ini を編集することで追加・削除できる

***

明日は ほげたつ (@HogeTatu) 大先生による 『UE4でゲームを作る時に考えていること2選』 です。


  1. 例えば、作成しようとした Node が既に配置済だった場合、配置済 Node が Disable の場合はフォーカスが合うだけですが、Ghost Node の場合は Ghost Node が削除されて新規 Node が作成されます。Editor/BlueprintGraph/Private/BlueprintEventNodeSpawner.cppUEdGraphNode UBlueprintEventNodeSpawner::Invoke を参照。 

あわせて読みたい