ARCoreをためしてみた

# 概要
**この記事古いです、今はPreview2がでているのでこちらを参考してください**
https://qiita.com/taptappun/items/a5337d29a43d5d673c7f

ARCoreを以下に沿って試した、軽くソースを見たまとめ
特にエラーもなく動作した
https://developers.google.com/ar/develop/unity/getting-started

# 詳細
## 動作端末
- Pixel/Pixel XL
- Galaxy S8  

https://developers.google.com/ar/discover/#supported_devices
今回はPixel XLを利用

## 動作対象OS
- Android7.0以上  
8.0でも一応動いた

## 開発環境
- Android SDK version 7.0 (API Level 24) or higher  
https://developer.android.com/studio/intro/update.html#sdk-manager
- Unity 2017.2 Beta 9 or later  
https://unity3d.com/jp/unity/beta
- ARCore SDK for Unity  
https://github.com/google-ar/arcore-unity-sdk/releases/download/sdk-preview/arcore-unity-sdk-preview.unitypackage

## 環境構築手順
基本的にgetting-started通りでOK
1. Unityダウンロード後install
　　- デフォルトのままインストールすればOKのはず、Androidが対象となっているかだけ見たほうがいいかも
2. ARCore SDK for Unity import
　　- ダウンロードしてきたARCore SDK for Unityをimport
　　- Unity開いて対象ファイル実行すればimportされる
3. File > BuildSettingsをひらき、Androidを選択しswitch Platform押下
<img width="664" alt="スクリーンショット 2017-08-31 12.56.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/178684/617deeae-a4e2-6a2d-87fc-346baf4d9cd8.png">
4. Player Settings押下、以下のように設定
　　- Multithread Renderingをoffにする
　　![スクリーンショット 2017-08-31 12.45.12.png](https://qiita-image-store.s3.amazonaws.com/0/178684/d4d9d5ba-d19e-9fc7-d280-7f0081076613.png)
　　- Package Nameをcom.example.helloARにする（デフォルトじゃなければなんでもいい）、Minimum API LevelをAPI Level 24に、Target API LevelをAPI Level 24以上に
　　![スクリーンショット 2017-08-31 12.45.02.png](https://qiita-image-store.s3.amazonaws.com/0/178684/553cfc12-76d7-beeb-5f6f-85c1f762a39b.png)
　　- 一番下にあるxR SettingsのTango SupportedをONに
　![スクリーンショット 2017-08-31 12.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/178684/0aeb1b94-30bb-d728-28c3-c40ff84c82e5.png)
5. デバイスにCoreAR動作に必要なapk install
　　- apkをダウンロード、インストール
　　https://github.com/google-ar/arcore-android-sdk/releases/download/sdk-preview/arcore-preview.apk
　　- apkのインストール方法がわからない人は以下を参照
　　　　https://developer.android.com/studio/debug/dev-options.html#enable
　　　　https://developer.android.com/studio/debug/dev-options.html#debugging

## 動作した感じ
https://youtu.be/IL4iMZfGFSA
ARKitと同じイメージ、平面を認識して、そこにものを置ける

## コードを軽く読んだ感じ
PointCloudを軽く読んで見た

```csharp

        public void Update()
        {
            // Do not update if ARCore is not tracking.
            if (Frame.TrackingState != FrameTrackingState.Tracking)
            {
                return;
            }

```

Frameの中に現在のTrackingの状態が入っている、その状態によって処理を振り分ける
https://developers.google.com/ar/reference/unity/class/google-a-r-core/frame

例えばPointCloudをUpdate契機で取得して、今保持しているものよりTimeStampが新しければ置き換える的なことをする

```csharp

            // Fill in the data to draw the point cloud.
            PointCloud pointcloud = Frame.PointCloud;
            if (pointcloud.PointCount > 0 && pointcloud.Timestamp > m_lastPointCloudTimestamp)
            {
                // Copy the point cloud points for mesh verticies.
                for (int i = 0; i < pointcloud.PointCount; i++)
                {
                    m_points[i] = pointcloud.GetPoint(i);
                }

                // Update the mesh indicies array.
                int[] indices = new int[pointcloud.PointCount];
                for (int i = 0; i < pointcloud.PointCount; i++)
                {
                    indices[i] = i;
                }

                m_mesh.Clear();
                m_mesh.vertices = m_points;
                m_mesh.SetIndices(indices, MeshTopology.Points, 0);
                m_lastPointCloudTimestamp = pointcloud.Timestamp;
            }

```

調査進めたら加筆するかも

## 参考リンク集
- Getting Started for Unity  
https://developers.google.com/ar/develop/unity/getting-started
- ARCore for Unity API Reference   
https://developers.google.com/ar/reference/unity/