[UE4]BPノードのコンパイルオプション「デベロップメントオンリー」の挙動について

![2019-09-24_15h11_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/9b197b6b-8891-48e7-9270-2f2b934e1c50.png)
PrintStringや、右クリックからのコンパイルオプションでの「デベロップメントオンリー」なノードで除外した際のフローについて調べました。

個別の検証を書いていますが、挙動の結果のみ必要な方は「まとめ」項へ→
間違ってたらごめんなさい。

UE4.22.3で検証


# はじめに
右クリックからのコンパイルオプション操作をするには実験的機能を有効化する必要があります。
![2019-09-24_15h06_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b92b373e-6a45-894a-c654-b9bdca12273d.png)
エディターの環境設定の「ブループリントエディタ」→「Allow Explicit Impure Node Disabling」
をONにすると冒頭のコンパイルオプション設定が行えるようになります。

# 「デベロップメントオンリー」の条件
![2019-09-24_15h52_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b7c646d3-1139-2a1a-dfbe-e9646c44c236.png)
<font Color="Red">**パッケージを作る際の「Development」設定ではありません！**</font>
何なら出荷（Shipping）のパッケージでも除外されず動作しました。（4.22.3。何故……

![2019-09-24_16h07_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/805781cd-13ac-b05e-d505-5a5b8ad295fc.png)
プロジェクト設定の「Cooker」→「Compile Blueprints in Development Mode」
がONだと、「デベロップメントオンリー」なノードが実行され、
OFFだと、「デベロップメントオンリー」なノードが除外されます。
またエディター起動の際はどちらでも実行されます。

configファイル的には、DefaultEngine.iniの下記になります。

    [/Script/UnrealEd.CookerSettings]
    bCompileBlueprintsInDevelopmentMode=False

# 除外された後のノードの処理について
探っていきます
## 関数ノード
- SetActor*等や、デフォルトでデベロップメントオンリーなPrintStringのノード類  
![2019-09-24_15h16_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c2a2fa0f-bf9c-07ff-6768-f1a24cf87d1a.png)  
そのノードのみスキップされて、後の実行ピンへと処理が流れていきます。
- CastやAsyncLoad等のノード類  
![2019-09-24_16h15_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/9c502488-cb4a-a7f7-bada-be7b9b7f48e8.png)  
そのノード以降処理が行われなくなります

## マクロ
- BranchやSequenceノード  
![2019-09-24_16h17_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/08a7c6b1-e286-2640-d38c-50cc3d80c5b4.png)  
そのノード以降処理が行われなくなります

### 自作
自作マクロでもうちょっと条件絞ってみます。

- 実行をスルーするだけのマクロ  
![2019-09-24_16h19_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/85a8e237-bd14-e738-5e61-89d7b1ce49c6.png)  
そのノードのみスキップされて、後の実行ピンへと処理が流れていきます。
- Inputに実行ピンが２つあるマクロ  
![2019-09-24_16h21_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/d8e186a8-acaa-600a-13f6-0e26904fab98.png)  
そのノード以降処理が行われなくなります
- Outputに実行ピンが２つあるマクロ  
![2019-09-24_16h23_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/0f365eba-95ed-8bdb-356b-afcd10206381.png)  
そのノード以降処理が行われなくなります

## 挙動
挙動的に、Input/Outputどちらかの実行ピンが複数有ると以後の処理をカットするようです。
逆に1つずつだとスキップして以後の処理へ移るようです。おそらく。
![2019-09-24_16h37_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/3a68ec91-564e-07b9-3336-143a07685f85.png)
「デベロップメントオンリー」ではなく、「無効（コンパイルしないで）」にした時の
実行ピンの色の付き具合がそのまま処理の流れで合っていそうです。
（上の緑枠は実行ピンが明るく実行される。下の水枠は実行ピンが暗くなってて実行されない）


# まとめ
- <font Color="Red">**ノード右クリックのコンパイルオプション「デベロップメントオンリー」は「Development」パッケージ設定ではないです！**</font>  
    - プロジェクト設定の「Compile Blueprints in Development Mode」次第です
    - エディター起動だとどちらでも実行されます
- 関数でもマクロでも、Input/Outputの両方の実行ピンが1つ以下だとそのノードのみをスキップ。  
2つ以上あると以後のノード処理を無効化。  

のようです。
C++の[MetaのDevelopmentOnly](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/Reference/Metadata/index.html)は未検証です。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/49e9731a-c12a-2688-82df-53c96d4ce3ff.png)
自分は挙動に余り自信がなかったので、C++で上のようなノード作って動的に分岐してたりしていました。
UObjectの無駄使いですが……