レベルシーケンサにFBXカメラをEditorScriptingでインポートする

この記事は[Unreal Engine 4 (UE4) その2 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ue)の3日目の記事です。


今回は、EditorScriptingについての記事になります。
UnrealEngineのEditorScriptingは、古いバージョンと比べてできる事がかなり増えています。
この記事では、レベルシーケンサへEditorScriptingを使って、カメラをインポートする内容を実際にブループリントのノードも含めて紹介します。

# 検証環境
- Unrealengine 4.27


# サンプルノード
単純にカメラをインポートするなら、以下のブループリントで実現する事は可能です。

![スクリーンショット 2021-11-19 225246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/1cc2a46b-896b-b12a-2c44-988d947385e3.png)

[レベルシーケンサにFBXカメラをEditorScriptingでインポートする](https://blueprintue.com/blueprint/b82j_yr-/)

# ノードの説明

### GetCurrentLevelSequence / RefreshCurrentLevelSequence
GetCurrentLevelSequenceとRefreshCurrentLevelSequenceは、セットで考えた方がいいかもしれません。
GetCurrentLevelSequenceは、現在開いている、レベルシーケンサのインスタンスを取得できます。レベルシーケンサが開かれていない場合は、Nullなので、IsValidで、確認する事をおすすめします。
RefreshCurrentLevelSequenceは、レベルシーケンスエディタを更新します。RefreshCurrentLevelSequenceが実行されない場合は、レベルシーケンスエディタは更新されません。
しかし、レベルシーケンサは編集されている為、Dirtyマークは付きますが、レベルシーケンサは、再度開き直さないと内容が更新されません。


![GetCurrentLevelSequenceAndRefreshCurrentLevelSequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/43c80755-3572-4cbe-10a0-9da8e3e55096.png)

### GetEditorWorld

Worldオブジェクトを取得できます。GetEditorWorldは、非ランタイム用で、ランタイム用には、GetGameWorldというノードがあります。
後にImageLevelSequencerFBXでは、Worldオブジェクトを引数に取る為、使用しています。
Worldオブジェクトについては、[こちらの記事](https://qiita.com/sy_/items/6a2e0625decaff12a782)が分かりやすく説明されていると思います。

![GetEditorWorld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/8d7699b6-f475-3ff2-1bc9-b6dd1ce4898d.png)


### GetBindings

レベルシーケンサに登録されているオブジェクトを取り出す事が出来ます。
アクターをスポーンしても、レベルシーケンサに登録はされません。
レベルシーケンサに、バインドして登録する必要があります。
GetBindingsは、バインドされているオブジェクトを取得する事が出来ます。
バインドされているオブジェクトの取得には、他にも「FindBinfimgById」や「FindBinfimgByName」など、単一オブジェクトを探すノードも実装されています。

![GetBindings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/e6bc5882-b899-b1a6-f753-1b80ee59f397.png)

### ムービーシーンのユーザーインポートFBX設定を構成
FBXカメラのインポート設定をこのオブジェクトで設定できます。
実際には、UMovieSceneUserImportFBXSettingsクラスを作成しています。
UMovieSceneUserImportFBXSettingsは、プロパティがブループリントで公開されていない為、サンプルでもしているようにSetEditorPropertyから行います。
設定パラメータについての詳細は、後ほど説明します。

![ムービーシーンのユーザインポートFBX設定を構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/509f1883-aa33-d109-874e-daa182d2e3d2.png)



### ImageLevelSequencerFBX

ImageLevelSequencerFBXは、実際に、FBXのカメラをインポートします。
引数の内、上の三つは、ノードから必要なオブジェクトを取得します。
InInportFBXSettingsは、後に説明する、UMovieSceneUserImportFBXSettings(カメラインポート設定)を渡します。
UMovieSceneUserImportFBXSettingsを引数に取る為、ImageLevelSequencerFBXは、カメラのインポートにしか使用する事はないと思われます。
InInportFilenameは、インポートするFBXのパスを渡します。このパスは、エクスプローラー上のパスとなります。

![ImageLevelSequencerFBX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/40da2ad2-dd77-a406-443b-7b6e8ce16326.png)


# ムービーシーンのユーザーインポートFBX設定(UMovieSceneUserImportFBXSettings)のパラメータ表

ムービーシーンにカメラをインポートする際のFBX設定の内容となります。
カメラをインポートすると表示される下のダイアログの設定方法です。
このダイアログは、4.27以降にアップデートされており、「フロントXAxisを強制」「シーンユニットを変換」「トランスフォームトラックを変換」の三つの引数が増えました。

![Fbxをインポートウインドウ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/1b64b326-aa0e-7d54-6921-b3392ea1ace9.png)


|プロパティ名  |日本語訳  |変数型  |説明  |
|---|---|---|---|
|bMatchByNameOnly  |名前のみで一致  |bool  |インポートするカメラと名前が同一のカメラに対して、インポートを行うかのフラグです。bCreateCamerasにチェックが入っている場合は、新規作成したカメラにインポートされます。|
|bForceFrontXAxis  |フロントXAxisを強制  |bool  |4.27から追加。こちらは、インポートする際に前面の軸を変えてしまうので、思わぬトラブルになる可能性がありますので、特に理由が無ければチェックを外しておく事をおすすめします。|
|bConvertSceneUnit  |シーンユニットを変換  |bool  |4.27から追加され、そのシーンに合わせた変換が行われます。例えば、Maxから出力したFbxの場合は、2.54倍の変換がされます。  |
|ImportUniformScale  |均一なインポートスケール  |float  |こちらもFbxのスケールの変換に使用されます。特に必要が無ければ、1にしておくのがいいかと思います。|
|bCreateCameras  |カメラの作成  |bool  |インポート時に、CineCameraActorを作成するかどうかのフラグです。同時にショットトラックも作成されます。|
|bReplaceTransformTrack  |トランスフォームトラックを置換  |bool  |4.27から追加。チェックが入っていない場合は、トランスフォームトラックが新規に作成されます。|
|bReduceKeys  |キーを削除  |bool  |CineCaemraActorに、既にキーが入っていた場合に、削除を行うかのフラグです。|
|ReduceKeysTolerance  |キーを削除の許容差  |float  |bReduceKeysの誤差をどこまでキーを削除する場合に、どの範囲まで誤差を許容するかです。|


# UMovieSceneUserImportFBXSettingsを直接作成できるようになった
UMovieSceneUserImportFBXSettingsは、4.26以前では、UCLASSにBlueprintTypeが入っていなかった為、ブループリントから直接インスタンスを作成する事が出来ませんでした。
4.27では、ここが改善されており、ブループリントからのインスタンス化ができるようになりました。

4.26
![UMovieSceneUserImportFBXSettings_426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/f0089092-9a98-f5b3-f4f4-b4352eb22b52.png)

4.27
![UMovieSceneUserImportFBXSettings_427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/963deb10-5a34-a77e-d331-c8138376e854.png)


その為、「クラスからオブジェクトを構成」から、直接UMovieSceneUserImportFBXSettingsを作成する事ができるようになっています。
![クラスからオブジェクトを構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/ed3a8e84-23b5-65bf-2506-62f5f9037700.png)


# ImageLevelSequencerFBXのbCreateCamerasについて注意

bCreateCamerasによって作られるCineCameraActorには、注意点があります。
それは、<font color="red">**レベルにもスポーンされてしまうCineCameraActorが作成される**</font>事です。レベルにインスタンスが作成される為、レベルとレベルシーケンサの二つが正しくなければ、使用できないカメラとなってしまいます。
これを避ける為には、予めレベルシーケンサ作成されているCineCameraActorに対して、インポートを行う事で、回避できます。


明日は、[Toshiyuki Wada](https://qiita.com/toshiyuki_wada)さんになります。
よろしくお願いいたします。

# 参考URL
 * https://qiita.com/sy_/items/6a2e0625decaff12a782
 * https://docs.unrealengine.com/4.27/en-US/API/Editor/MovieSceneTools/UMovieSceneUserImportFBXSettings/