[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); }
以上より、
EnabledState
がENodeEnabledState::Disabled
であるbUserSetEnabledState
がfalse
である
という 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 は EnabledState
が ENodeEnabledState::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 でしましまが描画されないのは、bUserSetEnabledState
が false
であることに依るものとわかります。
この他にも、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選』 です。
-
例えば、作成しようとした Node が既に配置済だった場合、配置済 Node が Disable の場合はフォーカスが合うだけですが、Ghost Node の場合は Ghost Node が削除されて新規 Node が作成されます。
Editor/BlueprintGraph/Private/BlueprintEventNodeSpawner.cpp
のUEdGraphNode UBlueprintEventNodeSpawner::Invoke
を参照。 ↩