[UE4]Spawn/SubLevel操作時のBeginPlay/EndPlay/Destroyedについて

引っかかったのでActorの発生/破棄のイベントについて挙動を調べてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unload Stream Levelした時ってActor::Destroy来ないの……<br>EndPlay(Remove From World)しか来ないの……</p>&mdash; com04 (@com04) <a href="https://twitter.com/com04/status/1167706920410480640?ref_src=twsrc%5Etfw">August 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

UE4.23.0にて確認

# はじめに
![2019-09-08_17h21_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/03fcddba-bbb7-4e2b-4814-bf54e84ca7d9.png)
Actorの発生/破棄のイベント

- **BeginPlay**: レベルにActorが発生したときに呼ばれる
- **EndPlay**: レベルからActorが取り除かれた時に呼ばれる
- **Destroyed**: Actorが破棄された時に呼ばれる

![2019-09-08_17h39_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/9be6b129-7e7c-f4e6-bae4-d835d721f5b8.png)
操作

- **Load/Unload StreamLevel**: サブレベルを読み込む
- **Should Be Visible**: ロードしたサブレベルのActorを表示する。（正確にはWorldにActorを追加する）
- **Open Level**: レベルを移動する
- **Spawn/Destroy Actor**: Actorを生成/破棄する


# 結果

## サブレベルに配置したActor
![2019-09-08_18h16_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/4ac442f5-791e-3985-c58d-3e9957972dee.png)
サブレベル上に配置しているActorを、サブレベル操作行った場合

操作手順によるイベント処理

- 1.<font color="OrangeRed">**Load Stream Level**</font> : 何も呼ばれない（この時点ではActorはWorldに登録されていない）
    - → 2.<font color="DarkRed">**Should Be Vislble: ON**</font> : <font color="MediumBlue">BeginPlay</font>が呼ばれる
        - → 3.<font color="DarkRed">**Should Be Vislble: OFF**</font> : <font color="DarkViolet">EndPlay-RemoveFromWorld</font>が呼ばれる（保持している変数はクリアされない）
            - → 4.<font color="DarkRed">**Should Be Vislble: ON**</font> : <font color="MediumBlue">BeginPlay</font>が呼ばれる（変数が残ってる）
        - → 3.<font color="OrangeRed">**Unload Stream Level**</font> : <font color="DarkViolet">EndPlay-RemoveFromWorld</font>が呼ばれる
        - → 3.<font color="DeepPink">**OpenLevel**</font> : <font color="Purple">EndPlay-LevelTransition</font>が呼ばれる
    - → 2.<font color="OrangeRed">**Unload Stream Level**</font> : 何も呼ばれない
    - → 2.<font color="DeepPink">**OpenLevel**</font> : 何も呼ばれない

||LoadStreamLevel|UnloadStreamLevel|ShouldBeVisible-ON|ShouldBeVisible-OFF|Level移動|
|:--|:--|:--|:--|:--|:--|
|BeginPlay|||○|||
|EndPlay||（ShouldBeVisible-ONされている場合）○:RemoveFromWorld||○:RemoveFromWorld（変数はクリアされない）|○:LevelTransition|
|Destroyed||||||

- **サブレベル操作ではDestroyedが呼ばれません**
- LoadしたサブレベルをShould Be VisibleでON → OFF → ONにした場合、BeginPlayが再度呼ばれます  
  - 内部変数は保持されたままです
  - UnloadStreamLevelした場合は変数はクリアされます

## Spawnした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/45129be0-a583-8642-9e1f-74f18dd6eb59.png)
動的に生成します

操作手順によるイベント処理

- 1.<font color="OrangeRed">**Spawn Actor**</font> : <font color="MediumBlue">BeginPlay</font>が呼ばれる
    - → 2.<font color="OrangeRed">**Destroy Actor**</font> : <font color="DarkViolet">EndPlay-Destroyed</font> → <font color="Magenta">Destroyed</font>が呼ばれる
    - → 2.<font color="DeepPink">**OpenLevel**</font> : <font color="Purple">EndPlay-LevelTransition</font>が呼ばれる

||SpawnActor|DestroyActor|Level移動|
|:--|:--|:--|:--|
|BeginPlay|○|||
|EndPlay||○:Destroyed|○:LevelTransition|
|Destroyed||○||

- Level移動して消された場合はDestroyedイベントは呼ばれません