【Unity 2022 + AR Foundation + Lightship】LiDARなしのiPhoneでEnvironment Occlusionをする方法

# はじめに
　こんにちは。
　ARアプリケーションを開発するうえでOcclusionはぜひ実装したい機能です。AR Foundationには簡単にOcclusionを実現するためのコンポーネントが用意されていますが、LiDAR非搭載iPhone(iPhone無印)ではEnvironment Occlusion(環境オクルージョン)をすることができません。そこで今回はLightship ARDKを利用してLiDAR非搭載iPhoneでEnvironment Occlusionをしていこうと思います。

# Lightship ARDKとは
Lightship ARDKとは『Pokémon GO』を開発したNianticよるAR開発ツールキットで、リッチなARを実現するための機能が提供されています。AR Foundationを拡張することができ、AR Foundationで強力なLightship ARDKの機能を利用できるようになります。AR Foundationでは行うことのできない単眼深度測定を行うことができ、これによってLiDARなしでOcclusionを実現します。

# 実装
## Lightshipの準備

https://lightship.dev/

上のリンクからアカウントを作成します。

![E3DD25F5-ECB7-482C-9FD2-6A2281ED12F7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/1e5bf19c-9773-1c2e-372f-2db7f88d4f04.jpeg)
![D0321950-8DF8-4236-9D12-CA72A6C439F4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/41a1f367-c630-5029-3be5-2b4174b52304.jpeg)

アカウントの登録ができたらダッシュボードに入るので、プロジェクトの作成に進みます。

![CAEA84BE-0881-46A9-BC73-5E2DECD6CFD5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/a17796f1-d5a6-0a4c-d5cd-697112e62aca.jpeg)
![6D2A0896-E462-4457-89E5-7134F550B5F4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/3f8636b2-2bba-7573-cfd0-56b2c628a9ac.jpeg)

プロジェクトを作成したら、(お好みでプロジェクトの名前を設定してもよいです)API Keyをコピーします。

![3B595DB0-77A9-498A-9C90-2B58201C3693.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/db32d49f-ff05-e697-35ca-1b429e4c0d69.jpeg)

## Unityプロジェクトの作成
Unity Hubからプロジェクトを作成してください。このとき使用するエディターのバージョンは公式で以下のように明言されています。
> Unity 2022 LTS（2022.3.37f1）と2021 LTS（2021.3.37f1）をサポートしています。

筆者の環境で全く同じバージョンでなくても`2022.3.53f1`で動作しているので2021や2022のLTSを使っておけば大丈夫でしょう。(だめだったらごめんなさい)

![CleanShot 2024-12-03 at 00.18.11@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/e5d04402-d785-f99d-8c30-b31728ea7e1c.png)

## パッケージインストール
AR開発に必要なパッケージをインストールしていきます。
まず、ARパッケージをまとめてインストールしてしまいましょう。

![CleanShot 2024-12-03 at 00.33.57@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/30e882d9-3dc5-e024-704e-7f635fafa5e2.png)

エディターの再起動の指示があったら、そのまま再起動してください。
再起動したら、もう一度`Package Manager`を開いて、以下のGit URLからパッケージを追加してください。
```
https://github.com/niantic-lightship/ardk-upm.git
```

![CleanShot 2024-12-03 at 00.37.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/88b68b80-533e-a047-11b9-6a644e8196d7.png)
![CleanShot 2024-12-03 at 00.37.34@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/e28bb355-41e9-4e62-c4d1-49fb9bee72fb.png)

## プロジェクト設定
`Edit` > `Project Settings`から`Project Settings`を開きます。
`XR Plug-in Management`で以下のように操作してください。

![CleanShot 2024-12-03 at 00.43.33@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/64846a70-7997-a31b-fa6a-f4e430ce5b9d.png)
![CleanShot 2024-12-03 at 00.43.37@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/b39f22d1-3891-c5b4-c1f6-23eadaa28817.png)

`Niantic Lightship SDK`の設定に移ります。
`API Key`に先程のAPI Keyをペーストしてください。

![CleanShot 2024-12-03 at 00.46.55@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/923de4e9-edd8-9d88-9a5d-7ce41ccc01ce.png)

`Project Validation`を確認するといくつか問題が発生してようですが`Fix All`を押すと解決します。

![CleanShot 2024-12-03 at 00.49.10@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/8cd04692-892f-60f5-5b34-0373fe768515.png)

画像では`iOS`のみ確認していますが念の為他のタブも確認していおいたほうが良いでしょう。
以上でLightship SKDの設定は完了です。

## ビルド設定
皆さんの環境に合わせてビルド設定を行いましょう。ここではiOS向けのビルド設定をしておきます。
iOSに`Switch Platform`をした後、`Player Settings`へ。

![CleanShot 2024-12-03 at 00.51.35@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/2e7ce068-e1a1-f9bd-0a04-45181fb1852a.png)
`Requires ARKit support`にチェック。
![CleanShot 2024-12-03 at 00.52.49@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/f6e99e98-a5e9-bf84-5231-830395c69e94.png)

プロジェクト名が`TestAR`など普遍的なものの場合は`Bundle Identifier`も変えておきましょう。

:::note info
Bundle Identifierは全世界で重複できません。そのためプロジェクトで固有の値を設定する必要があります。Unityにおける`Bundle Identifier`の設定方法は他にもありますがここでは詳しくは触れません。
:::

![CleanShot 2024-12-03 at 00.54.40@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/854385b5-18f5-a26a-21d3-076d379222d8.png)

これでビルド設定も完了です。

## Sceneの準備
いよいよARを実現するSceneを作っていきます。
まず、ヒエラルキーから`Main Camera`を削除してください。

![CleanShot 2024-12-03 at 00.55.49@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/f4c8bd64-4d22-d307-cabe-82c8a5e086b9.png)

続いて、ヒエラルキー上で右クリックし`XR`の中にある`AR Session`と`XR Origin(Mobile AR)`を追加してください。

![CleanShot 2024-12-03 at 00.56.22@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/40771b13-02bc-7085-368c-9f634686c2ae.png)

ヒエラルキーから`XR Origin` > `Camera Offset` > `Main Camera`に`Lightship Occlusion Extension`コンポーネントを追加してください。`AR Occlusion Manager`と`Lightship Occlusion Extension`が追加されます。

![BA0B85BC-6142-4F7D-A328-A78B4AF77381.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/23571c9e-755a-7012-8d2b-5e2ef6b70dd5.jpeg)

`XR Origin`の子として`3D Object` > `Cube`を追加して、`Transform`から`Position`を少しずらして、`Scale`をそれぞれ`0.3`ぐらいに設定しましょう。

:::note info
Unityで利用される長さの単位は`Unity unit`といい、デフォルトで「1Unity unit = 1メートル」です[^1]。1メートルだと大きいと思うので調整しています。
この`Transform`の設定だと1辺30cmの立方体が60cm先に出現します。
:::

![CleanShot 2024-12-03 at 17.02.29@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/2d065e96-024c-b8aa-b33a-7af776cbadce.png)

これで終わりです!お疲れ様でした。

# 実行結果
iPhoneへのビルド方法は以下の記事を参考にしてください。

https://qiita.com/T-H9703EnAc/items/2dfbac421b27b8c08634#iphone%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92

窮屈な部屋ですが、実行するとこんな感じです↓
![abScreenRecording_12-03-2024 18-20-52_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/db1b2d1a-4efd-1563-a67b-08a58039ca3a.gif)

3Dオブジェクトとの距離が離れていたり、遮蔽となる物体が大きいとき(扉など)だともうちょっときれいに動作します。

# まとめ
AR Foundation単体ではLiDAR搭載iPhoneでないと環境オクルージョンできなかったので困りましたが、これならとても簡単にLiDARなしで実装することができます。他にも便利な機能がたくさんあるので、皆さんぜひ使ってみてください!

# 参考

https://lightship.dev/docs/ardk

https://lightship.dev/ja/docs/ardk/index.html

Lightshipのドキュメントが2つありますが、私は上のものを主に参考にしていました。なぜ2つあるのか、違いはわかりません...

https://www.youtube.com/watch?v=B5MIFGDpL-s

[^1]: https://qiita.com/RyotaMurohoshi/items/432e6ad6b58b81af3c95