Unreal Engine 4.19 を使ったスマホ向けARアプリの開発でつまづいたポイント
November 01, 2018仕事でUnreal Engine 4.19を利用した、スマホ向けARアプリをリリースした。そのデバッグやリリース準備でつまづいたポイントを紹介する。
(忘れている部分もあるので、加筆修正する可能性高い)
注意事項
- Unreal Engine 4.19での話。4.20で解決している部分あり。
- エディタの表示言語は英語。日本語だと表記が異なる場合がある。
- 文中にUnreal EngineのGitHub上にあるソースコードへのリンクをいくつか貼った。Unreal Engineのコードは開発者登録を行いアクセス権限を得ないと見ることができない。コードを見たい方はオフィシャルのドキュメント参考に登録を。
AR機能を利用しないレベルのカメラが、意図しない位置に移動してしまう
対象プラットフォーム: iOS & Android
起きたこと
リリースしたARアプリには、
- CGモデルを実空間の床面に配置するARモード
- 3D空間で CGモデルを眺められる3Dモード
という2つのモードが用意されている。
3Dモードではカメラの位置・角度がブループリントから制御されており、決まった視点を映すようになっている。 2つのモードを別レベルとして作成し、実機テストで2つのレベルを行ったり来たり遷移した。すると、3Dモードレベルのカメラが意図していない位置・角度で表示されてしまった。
解決方法
AR機能を利用しないレベル上のカメラの設定を変更
”Lock to HMD” を False に変更する。
原因の詳解
Unreal Engine 4.19のカメラコンポーネントには、HMDやARデバイスのトラッキング位置・角度に自身を固定する機能が提供されている。Camera Settingセクションにある”Lock to HMD”というBool型のプロパティが、この機能を利用する/しないのフラグになる。
エンジンソースコードのCameraComponent.cpp
を見るとわかるが、HMDやARデバイスのトラッキング位置・角度は、カメラコンポーネントではなくAR/VR/MR用トラッキングシステム(GEngine->XRSystem
)が保持している。それゆえ、明示的にリセットしない限り、レベルをまたいでトラッキング情報は引き継がれる。
そして、AR機能を有効にしていない(AR SystemのStart AR関数を呼んでいない)レベル上でも、”Lock To HMD”がTrue
となっているカメラは、このトラッキング情報に基づいて位置・角度が固定されてしまう。
3Dモードレベルでカメラがおかしな位置に移動してしまったのはこのためだった。
ARKit関連のコードを理由にAppStore審査でリジェクトされた
対象プラットフォーム: iOS
起きたこと
Unreal Engine 4.19.2のUnreal Engineを利用してアプリをビルドし、AppStoreに申請した。 すると、利用してないAPIへのアクセスがあるため審査を通らなかった。
解決方法
iOS ARKitのAPIを扱う部分のエンジンソースコードを修正し、利用していないTrueDepth API関連のコードを削除。カスタムしたエンジンを使ってアプリをビルドすることで、無事審査を通過した。
原因の詳解
大体はUnreal Engine 4フォーラムのこのスレッドを読んで判明。
“ARKit app rejected because of TrueDepth APIs usage - UE4 AnswerHub”
Unreal Engineでは動画プレイヤーやキャラクターAIなど様々な機能がプラグインとして提供されており、ユーザーはそれらを有効にして機能拡張できる。 ARKitプラグインも同様に、有効にすることでブループリントなどからARKitのAPIが利用可能になる。ただし、Unreal Engine 4.19のARKitプラグインには、今回リリースしたアプリで利用している平面トラッキングの他に、TrueDepth APIを利用したフェイストラッキングに関するコードも含まれている。
AppStoreの審査では、アプリのコンテンツで利用するはずのないAPIに対するアクセスを許していない。当アプリはTrueDepth APIを利用するコンテンツを含んでいないため、リジェクトされてしまった。どうやら、該当APIのヘッダファイルをimportしているだけでアウトのようだった。
そこで、審査を通過させるには、プロジェクトのコードはそのままに、エンジンのTrueDepth APIに関するコードを修正してアプリをビルドしなおさなければいけなかった。修正コードは、先述したスレッドにユーザーがアップしてくれている。
ちなみに、その修正コードをUnreal Engine 4.19.2 に適用した状態のものを、下記リポジトリの4.19_ARKitFixブランチにて公開してある。
umeruma/UnrealEngine/ Unreal Engine source code
(このリポジトリもUnrealEngineのリポジトリをフォークしたものであるため、開発者登録しているアカウントでないと観覧できない。)
なお、Unreal Engine 4.20のコミットログを見るに、この問題はすでに修正されている模様。
Updated: March 16, 2021