Unreal Engine 4.19 を使ったスマホ向けARアプリの開発でつまづいたポイント

November 01, 2018

仕事でUnreal Engine 4.19を利用した、スマホ向けARアプリをリリースした。そのデバッグやリリース準備でつまづいたポイントを紹介する。

(忘れている部分もあるので、加筆修正する可能性高い)

注意事項


AR機能を利用しないレベルのカメラが、意図しない位置に移動してしまう

対象プラットフォーム: iOS & Android

起きたこと

リリースしたARアプリには、

という2つのモードが用意されている。

3Dモードではカメラの位置・角度がブループリントから制御されており、決まった視点を映すようになっている。 2つのモードを別レベルとして作成し、実機テストで2つのレベルを行ったり来たり遷移した。すると、3Dモードレベルのカメラが意図していない位置・角度で表示されてしまった。

解決方法

AR機能を利用しないレベル上のカメラの設定を変更

”Lock to HMD” を False に変更する。

原因の詳解

CameraComponent
CameraComponent

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のコミットログを見るに、この問題はすでに修正されている模様。

development