UnityでARアプリを製作してみる

初めまして。インフラトップでメンターを行っている@YuCucamberと申します。
Qiita初投稿で拙い点が多々あると思いますが、宜しくお願い致します。

さて、WEBCAMPではRailsをはじめとしたWebサービスに関するコンテンツ取り扱っておりますが、プライベートでは主にUnityを利用した小規模なゲームの開発を行っております。（ジャンルめっちゃ違うやんけ…）
特に最近関心を持っているのがXR。AR、VR、MR等の総称ですね。
ただ、VRやMRの開発を本格的に行おうとすると、ゴーグルを買ったり、開発環境整えたりで、かなりのコストがかかってしまいます…（OculusもHoloLensも高すぎる…スマートフォンを利用したVRゴーグルなら手頃に買えるそうですが…）
ということで、手元のスマートフォンとPCで始められ、手間暇のあまりかからないARを始めることにしました。
今回はVuforiaEngineを利用して、お手軽簡単にARアプリを作っていこうと思います。

P.S. 投稿遅れてしまい本当にすみませんでしたあああああ！！！！！

#使用するソフトウェア
Unity2019.1.14f1
Adobe PhotoShop（箱の画像の編集時に利用、GIMP等でも可）
ルヴァン（立方体のデザイン付きの箱なら基本問題ないと思います。箱のサイズを設定する際は、適切なサイズに置き換えて下さい）

#目的
Unityを使ったことのない人でも、気づいたらARアプリが作れる状態を目指しています。
お菓子の箱を認識し、周囲をキューブがぐるぐる回る簡易的なARアプリを作ります。
初心者向けかつ実際勢いで書いていたりするので、Unityの経験者の方などがみると長ったらしいかもしれません。

#目次
###Vuforiaを導入してみる
<ul>
<li>Unityのインストール</li>
<li>Vuforia Developer Consoleへの登録</li>
<li>Vuforiaを有効にする
</ul>
###CuboidTargetを使用してみる
<ul>
<li>箱のデザインを取り込む</li>
<li>データベース、ターゲットの作成</li>
<li>Unityに適用していく</li>
<li>少しだけ応用</li>
</ul>
###VuMarkを使う
後日追記、来週には完成すると思います。
###モデルに依存しないARを実現する
後日追記、来週には完成すると思います。
SmartTerrainとGroundPlateを利用する予定です。

#Vuforiaを導入してみる。
早速Vuforiaを使っていくわけですが、Vuforiaを利用するためにはUnityなどのゲームエンジンが必要です。（ゲームエンジンを用いない開発方法もありますが、高度な方法になっていくため、今回は言及しません。）
そうなると、まずはUnityをインストールしなくてはいけません。Unityの導入方法については、既に素晴らしいカラムが多数あるのでそちらをご紹介させて頂ければと思います。

**しかし、幾つかご留意頂きたい点があります。**

![vuforia16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/9f2dfbe2-964a-dcfb-7d65-ad6c0d0246b7.jpeg)


今からおそらく、UnityHub、あるいはUnityのバージョンをダウンロード・インストールして頂くことになりと思いますが、その際は「**Vuforia argument reality support**」等と記述された項目にチェックをつけて頂きますようお願い致します。（とりあえずVuforiaとついていたらインストールしてください）
もし、チェックマークをつけ忘れてインストールした方（あるいは既存のUnityのバージョンに組み込んでいく方）も、UnityHubの場合は「インストール」欄から特定バージョンの「・・・」を選択し、モジュールを加えるという項目から、後から追加することができます。

注意点は以上となります。Unityのインストールはこちらを参考にお願い致します。
リンク→ https://www.sejuku.net/blog/47646


##Vuforiaを有効にする
無事インストールが完了したら、プロジェクトを作っていきましょう。
Unity（UnityHub）を開いて、3Dで新規プロジェクトの作成をしてください。プロジェクト名はお好みでどうぞ。
![cuboid.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/b2ba2839-1aa8-5a5a-55b2-9a2cbb2c42ae.jpeg)

作成できましたら、早速Vuforiaの機能を有効にしていきましょう。
Windowsの場合は、メニューバー内の「File→Build Setting」をクリックし、表示されるウィンドウ右下の「Player Settings」をクリック、そうすると更に新しいウィンドウが開くのでその中の「XR Settings」内の「**Vuforia argument reality supported**」をクリックすると、Vuforia機能を有効にできます。
![vuforiaGIF1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/06b4cfd4-6391-2419-ce61-0eae53a95cf5.gif)
続けて、エディタ内にARカメラを配置していきます。
![vuforia17.jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/5900c007-64ad-b867-346f-d12c60942c6c.png)
これで事前準備は完了しましたが、まだ使えません。Vuforiaを利用するためには**Vuforia Developer Console**へのアカウント登録とライセンスキーの発行、そしてARを検知するための情報を登録してあげないといけません。

順序はこのようになります。
 - Vuforia Developer portalへの会員登録
 - Development keyの発行

###会員登録
はじめに、以下のサイトへアクセスし、右上の「Register」を選択します。
https://developer.vuforia.com/

VuforiaDeveloperPortalへ会員登録を行います。必要箇所入力しアカウントの作成を行って下さい。
![vuforia1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/782c9c2c-b2e3-e913-10b8-15b9d06ea9b0.jpeg)

アカウント作成後、ヘッダーの「Develop」選択し、LicenseManagerへ移動します。
Lisence Keyには、無償で開発向けに使用できる「Development Key」と、有償で商業向けのリリースに使用できる「Deployment Key」を使用することが出来ます。
今回は、リリースまで行う予定がないので、「Get Development Key」を選択します。

![vuforia2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/a1ff0079-9a1d-0713-c6f8-187c9a096e08.jpeg)

ライセンスキー名を入力し、Confirmを選択し作成します。
作成後、再びLicense Managerの画面へ戻り、先ほど作成したライセンスキーを選択します。

選択後、灰色の枠の中に長文の暗号文らしきものが出てきます。写真では隠していますが、こちらが今回利用するLisence Keyとなります。後々利用するので、わかりやすい場所にメモしておきましょう。
![vuforia18.jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/6ca0f9d1-54c0-3e50-c3a7-fdded925fc30.png)

続けて、今回認識対象として利用する立方体（Cuboid）の作成を行っていくのですが…肝心の画像がありません。ということで作っていきましょう。

今回、僕の方ではルヴァンを利用して作成させて頂きました。理由はなんとなく食べたかったからです。
![DSC_0210.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/8d7508be-ba34-42bb-5490-bbc0bf1f8c91.jpeg)

こちらは、分解用と、完成したときの認識用合計2箱購入してきました。
早速片方を解剖していきましょう。カッターで慎重に展開図に…

案の定汚い出来になってしまいましたがこの程度なら問題ないはず…
こちらをスキャナでPCに取り込んでいきます。
![DSC_0211.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/9a20df0a-d34b-d233-4f8f-2674136b16a2.jpeg)

一面ごとの画像に分解し、保存していきます。ここで重要なのがアスペクト比を意識する点です。画像を保存する際に、実際箱のサイズ比と一致しているか確認しましょう。違ったら解像度を変更してカバーしていきます。透明度やsRGBが有効になっていると宜しくないみたいなので切っておきましょう。画像サイズも気をつけて…
![vuforia3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/bb296439-b1db-5b1d-9867-54e4ae9e7cc0.jpeg)

分解完了しました。これらをVuforia Portalへ読み込ませていきます。
![vuforia4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/c922147e-dcec-c371-6dbc-c5faa145b77b.jpeg)

Webサイトに戻り、先ほどのLisenceManager画面のヘッダー下にある「Target Manager」をクリックします。
Targetを保存するには、それらをまとめるDataBaseが必須となります。現時点で存在しないので作っていきましょう。TargetManagerトップの「Add Database」をクリックします。

データベースを作成します。お名前はお好みで、タイプは今回はデバイス内に認識対象の情報を保存したいのでDeviseを選びCreateボタンを押します。
![vuforia6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/9d1bdf9b-0d94-4fcc-d659-9cfaf29a7493.jpeg)

ライセンスの時と同じように、データベースを選択すると以下の画面になります。早速Targetを作成していきましょう。左上のAdd Targetをクリックして下さい。
![vuforia19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/9f851158-7c5c-5b9d-fca2-c2aeff8b93e9.jpeg)

こちらで作成するTargetの種類の選択やサイズの設定を行います。今回は立方体（Cuboid）で行いますが、他にも平面の画像や円柱、複雑な図形のオブジェクトなど様々なタイプの設定が存在します。
今回はCuboidを選択しましょう。

Dimensionに実際の箱の大きさの設定を行います。
インターネットでルヴァンの箱の大きさを検索したところ、「12.5cm,16cm,5cm」だと書かれていたのでそれぞれ入力していきます。名前はお好みで。僕は「Levain」で登録しました。
入力完了したら「Add」を押して作成します。
![vuforia20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/683be882-6c21-0f80-7c80-4f20cd38c7bc.jpeg)

さて、立方体そのものの作成は完了しましたが、肝心の画像の情報が未だに入っていません。設定していきましょう。作成したTargetを選択すると、以下のような画像が表示されると思います。
この画面で一面ずつ、画像の情報を登録していき完成させていきます。
それでは、Upload Frontを選択しましょう。
![vuforia7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/c5a81cd6-7eeb-239e-1a99-172886dbf512.jpeg)

選択すると、以下のような画面になります。Browseをクリックし、正面の画像を選択し、Uploadしましょう。
ここで上手くいかない場合は、正しく画像が設定されていない、画質が高すぎて最大サイズをオーバーしている等が考えられます。確認しましょう。
![vuforia8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/2f455b2c-ab3d-3bda-4f5a-b692f7622c92.jpeg)

幾つか入れていくと、以下のような画像になります。こうみるとすごい…！
![vuforia9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/4e6a75fd-5b19-80ac-4384-76c59126be55.jpeg)

すべての画像を入れ終えたら、データベースをダウンロードし、Unityに組み込んでいきましょう
データベースを選択し、右上の「Download Database」を選択しましょう。すると、以下の画面になるはずです。今回はUnityの環境を利用して開発しているので、Unity Editorを選択してDownloadボタンを押しましょう。
![vuforia21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/80b00aab-ddae-7810-25ad-7240bba12924.jpeg)

先ほどのプロジェクトを開いた状態で、今回のunitypackageを開いて下さい。
すると、以下のような画面が出てきます。「どのへんインポートしておく？」と聞いてきてるので、チェックマークを外さずimportを行いましょう。
![vuforia15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/618aea05-5839-5850-035d-8e90355d7469.jpeg)
すると、StreammingAssets/vuforia内に幾つかデータベースが入っているはずです。名前が違ってもお気になさらず。
![vuforia22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/bf93022e-9757-9710-c08d-15c4ee847d81.jpeg)

すると、[名前].unitypackageというデータがダウンロードされるはずです。ここからはUnityに戻り作業を進めていきましょう。

いよいよ実装してきます。確かARCameraを導入するところまで進んでいますよね。
まずは、ライセンスキーを適用してあげないといけません。これを入れないと動いてくれないので致命傷です。
早速、ヒエラルキー内のARCameraを選択し、インスペクタ内にある「Open Vuforia Engine configuration」を選択しましょう。
![vuforia23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/22e20dcd-63c0-419b-de3a-f7de2aa92dc2.jpeg)

クリックすると、Vuforiaに関する設定画面が出てくると思います。
その中の「App Lisence Key」の欄に予め用意しておいたライセンスキーをペーストしてください。ペースト後、その下の「Add Lisence」をクリックしたら完了です。

続けて作成した立方体をシーンに導入していきましょう。
ヒエラルキーからVuforiaEngine→MultiImageを選択しましょう。
![vuforia24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/3ab31a83-95ee-b93e-4f2c-8c1f9f203f47.png)

クリックすると、勝手に作成済みの箱が真ん中あたりに表示されているはずです。もし複数のターゲットを設定している場合はインスペクタ内のmulti Target欄の選択を変更すれば反映されます。
![vuforia24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/b59bd05c-bdcd-6298-f98d-eb09cc5ca83d.jpeg)

そして最後に、立方体と関連つけるオブジェクトを作成します。MultiImageの子オブジェクトとして登録することで、親オブジェクトの箱の位置に合わせて表示されます。箱が認識されなかった場合は表示されません。
MultiImageの子オブジェクトとして、3DObject→Cubeを作成しましょう。以下図のようになれば問題ありません。
![vuforia26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/f03beeb0-0700-523c-95a7-7375d6569951.jpeg)

作成できたら、Cubeをいい感じの位置と大きさに変更しましょう。
Cubeのtransform設定を以下のように変更しましょう。
![vuforia27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/136a5eba-4b69-69a6-cb4c-770e14853118.jpeg)


お待たせしました…これでARアプリの完成です！まずはPC上で動かしてみましょう！
PCでもWebカメラ等が内蔵、あるいは接続されていれば利用することが可能です。
エディタ中央上部の再生ボタンを押して下さい。

そうすると、Webカメラの映像が一面に映し出されるはずです。画面内に箱のデザインがすべて入るようにかざしてみましょう。面積の大きい正面がいいかと思います。

箱と連動してキューブが表示されたり、位置の移動が行われていれば大成功です！
おめでとうございます！！！！！

##少し応用してみる
箱に連動してキューブを表示することは出来ましたが、これではまだまだARを使っていくイメージが浮かびにくいかと思います。そこで、今のキューブを少し改変し、「ルヴァン（箱）の周りをぐるぐる回るキューブ」を作成していきましょう！

まずは、ヒエラルキーから「Create Empty」を選択・作成し、以下のように構造を組み直します。ドラッグアンドドロップで親子関係の作成、解除が可能です。
![vuforia25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/22d0ede9-3389-2047-a94f-1a9b4df0cbe3.jpeg)

また、GameObject、Cubeの座標設定を以下のように変更して下さい。

![vuforia26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/73f75b49-9ab1-fd85-057e-b9d9569ab84d.jpeg)
![vuforia27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/a6707317-a4bd-bf3b-76fd-c97d5b71486a.jpeg)

次に、GameObjectを選択し、「Add Component」→「New Script」を選択して下さい。
Nameを「Cube」に設定の上、「Create and Add」をクリックして作成して下さい。
![vuforia28.jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/5020214c-ac66-a06b-21a1-f6eed0ede3ec.png)

作成後、プロジェクト内の「cube」をダブルクリックして開いて下さい。
![vuforia28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/1921de1c-95c2-7bc7-21b0-b6a03c050745.jpeg)

既存のコードをすべて消した上で以下のコードを貼り付け、セーブして下さい。

```cube.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cube : MonoBehaviour
{
    public bool returnSwitch; //回転方向の設定、trueにすると反時計回りになる
    public float speed; //キューブが回るスピード
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //if else で向きの設定を確認し、別々の動作を行っている
        if (returnSwitch) transform.Rotate(new Vector3(0f, 0f,-1f*speed * Time.deltaTime));
        else transform.Rotate(new Vector3(0f, 0f,speed * Time.deltaTime));

    }
}
```

セーブ後、Unityに戻り、GameObjectを選択した上でヒエラルキの以下の数値を設定して下さい。
![vuforia29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541709/4f280156-f8af-87bc-2f82-0b266930bdc9.jpeg)

設定後、再びエディタ中央上部の再生ボタンをお願いします。
成功していれば箱を中心にキューブが回っているかと思います…！
Vuforiaで箱の前か後ろかの認識が出来ているみたいで、キューブもしっかり箱に隠れていますね！

とりあえずここで完成です！わーい！！！


#終わりに

以上、UnityとARアプリに関する記事を書かせて頂きました。
今回の記事を通して、ARアプリやUnityに関心を持って頂けたら幸いです…！