Unity ARKit Pluginのチュートリアル日本語訳

# この文章は何か
Unity ARKit Plugin（[レポジトリ](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin)）のプロジェクト直下にある[TUTORIAL.txt](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/TUTORIAL.txt?at=default&fileviewer=file-view-default)の日本語訳です。
現時点（2017/06/07）では、プラグインについての説明はこの文章くらいしか存在しないようなので読んでみました。

# 注意点
- そのままの翻訳ではなく、意訳やソースを見ての補足が混じっている点ご了承下さい。
- 文中のリンクはレポジトリへの該当ファイル/該当業のURLを貼りましたが、バージョンが変わるとURLが変わると思いますので、より新しいバージョンがリリースされていた場合はそちらを参照下さい。

# 本文

1. ARKitの概要については[ここ](https://developer.apple.com/documentation/arkit/understanding_augmented_reality)を読む。このUnityプラグインは、ARKitのネイティブインタフェースに対応するAPIを提供する。

2. PluginのUnityプロジェクトに含まれるサンプルシーンを見るとアプリの作り方がわかる。[UnityARSessionNativeInterface.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default) と [NativeInterface](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/?at=default) フォルダが最も低レベルなAPI。以下で詳細を説明する。

3. [UnityARSessionNativeInterface.GetARSessionNativeInterface()](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-249) でネイティブのsessionインタフェースを取得する（以下、 m_session と記載）。[UnityARCameraManager.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARCameraManager.cs?at=default&fileviewer=file-view-default) も参照。

4. [m_session.RunWithConfig(config)](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-422) でARSessionを設定する。configは用途に応じて  [ARKitWorldTrackingSessionConfiguration](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-139) (6DOF) または [ARKitSessionConfiguration](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-117) (3DOF)を指定する。また、開始済みのsessionを [m_session.RunWithConfigAndOption(config, option)](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-396) のoption指定でリセットする事もできる。[UnityARCameraManager.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARCameraManager.cs?at=default&fileviewer=file-view-default) も参照。

5. update毎に[m_session.GetCameraPose()](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-257)を呼ぶ事で、カメラのpositionとrotationを取得する事ができる。以下のように、Unityシーン内の座標系に変換するユーティリティ関数もある。[UnityARCameraManager.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARCameraManager.cs?at=default&fileviewer=file-view-default) も参照。  
> camera.transform.localPosition = UnityARMatrixOps.GetPosition(matrix);
> camera.transform.localRotation = UnityARMatrixOps.GetRotation (matrix);

6. update毎に[m_session.GetCameraProjection ()](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-267)を呼ぶことでカメラの射影パラメータ（projection parameters)を取得する事ができるので、[camera.projectionMatrix をUnityカメラに設定する](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARCameraManager.cs?at=default&fileviewer=file-view-default#UnityARCameraManager.cs-68)。

7. シーンのMain Cameraに[UnityARVideo](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARVideo.cs?at=default&fileviewer=file-view-default)コンポーネントを追加し、inspectorでClear MaterialフィールドにYUVMaterialを設定する。[UnityARVideo.csの該当部分](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARVideo.cs?at=default&fileviewer=file-view-default#UnityARVideo.cs-43)。

8. ここまで来れば、シーンに3Dオブジェクトを置いて端末を移動させてそれを周りから眺める事ができるようになる。

9. HitTest API（[このあたり](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-220)）を使うと、シーン内でインタラクションを実現できる。ヒットした結果の種別の[ソース](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/ARHitTestResultType.cs?at=default&fileviewer=file-view-default)、[説明]( https://developer.apple.com/documentation/arkit/arhittestresult.resulttype)にある。この情報を使ってobjectをどこに置くか決める。[UnityARHitTestExample.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/UnityARHitTestExample.cs?at=default&fileviewer=file-view-default)も参照。

10. 平面検出イベントを受け取るには、[ARAnchorAddedEvent](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-179)、[ARAnchorUpdatedEvent](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-182)、[ARAnchorRemovedEvent](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-185) をフックする。これらのdelegateは全てARAnchorUpdated(ARPlaneAnchor anchorData)の形式をとる。この平面に応じてGameObjectを描画する事もできるし、単に基準（anchor）として用いても良い。[UnityARAnchorManager.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/Utility/UnityARAnchorManager.cs?at=default&fileviewer=file-view-default)も参照

11. [ポイントクラウド](https://developer.apple.com/documentation/arkit/arpointcloud)情報を含むARKitのフレーム更新を受け取りたい場合、[ARFrameUpdatedEvent](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-176)をフックする。これはARFrameUpdate([UnityARCamera](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-31) unityarcamera)の形式をとる。このunityarcamera.pointCloudDataからポイントクラウド情報が取得できる。 [PointCloudParticleExample.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/PointCloudParticleExample.cs?at=default&fileviewer=file-view-default) も参照。

12. 上記のARFrameUpdatedEventはカメラの位置/回転/射影行列（projection matrix。手順5,6の代わりとなる）の更新にも利用できるが、その場合UnityのupdateタイミングではなくARKitのupdateタイミングで行われる事に注意する。また、正しい座標系での結果を得るためにユーティリティ関数を使う必要があるかもしれない。

13. [周囲の明るさ推測機能](https://developer.apple.com/documentation/arkit/arlightestimate)を使うには、update毎に[m_session.GetARAmbientIntensity()](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs?at=default&fileviewer=file-view-default#UnityARSessionNativeInterface.cs-460)を呼び出す。[UnityARAmbient.cs](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/8bc659cab710e1880d863bc0f9ccf67175d84bbd/Assets/UnityARAmbient.cs?at=default&fileviewer=file-view-default)も参照。