【Unity6 + AR Foundation】Unity6でAR Foundationを使うときにカメラ出力が黄色になってしまうときの対処法とついでに入門

## はじめに
　こんにちは。
　先日、Unity6とARFoundationでスマホ(とりあえずはiOS)用のアプリを作ろうとした際に、カメラ出力が真っ黄色になってしまう症状が発生しました。これについて解決法を見つけたのでここでご紹介します。同じような症状でお困りの方の参考になると幸いです。
　ちなみに、本記事は私の初投稿記事になります。読みやすさなど至らない点があるかと思いますがどうかご容赦ください。

## 動作環境
- Unity 6000.0.29f1(Apple Silicon)
- AR Foundation 6.0.3
- Apple ARKit XR Plugin 6.0.3
- OpenXR Plugin 1.13.2(UnityEditor上での動作確認用)

## お急ぎの方へ/概略
![CleanShot 2024-12-02 at 12.00.46@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/73822aae-116a-53bb-1931-0c72e3087ae6.png)

この問題を解決していきます。
「入門とか大丈夫。問題の解決方法のみ知りたい！」という方は[一面黄色の解決法](#一面黄色の解決法)までどうぞ。

## 導入
ついでなのでUnity6におけるAR Foundationの入門からやっていこうと思います。
iOS用のセットアップをご紹介しますので、Android用のセットアップを確認したい方は他の記事を見に行っていただけるとやりやすいかと思います。

### Unityプロジェクトの作成
Unity6をインストールしていない場合はUnity Hubからインストールしてください。
プロジェクトを`Universal 3D`で作成してください。
![CleanShot 2024-12-02 at 12.37.55@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/fb00c540-21f9-5976-6fb0-0c6ff46fa91b.png)


プロジェクトを作成したら以下のような画面になりますが、URPのテンプレートは今回使わないので`Remove Readme Assets`で消してしまってください。
![CleanShot 2024-12-02 at 11.51.30@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/8298c8a2-d684-fff1-bec7-fce5b4468ffa.png)

### パッケージのインストール
メニューバーから`Window` > `Package Manager`を開きます。
![CleanShot 2024-12-02 at 11.53.51@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/47623954-7f3c-0aff-5196-1d9f1e4d8928.png)

パッケージマネージャーを開いたら、左側のサイドバーから`Unity Registry` > `Features`の「AR」を選択し、`Packages Included`から必要なパッケージを個別でインストールしてください。

:::note alert
ARパッケージ全体でインストールしないでください。
記事執筆時点(2024/12/02)で`Magic Leap`プラグインを導入するとエラーが発生してプロジェクトが動かなくなります。ARパッケージを全体でインストールすると`Magic Leap`もインストールされてしまうので、`Packages Included`から必要なARパッケージを個別でインストールしてください。
:::

![CleanShot 2024-12-02 at 11.56.11@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/df1b430a-47fb-a4fe-55ab-c1f1e08af911.png)

今回は動作環境にもあるように
- AR Foundation
- Apple ARKit XR Plugin
- OpenXR Plugin
の3つをインストールしますが、必要に応じて他パッケージもインストールしましょう。

### ビルド設定
メニューバーから`File` > `Build Profiles`を開きます。iOSを選択し`Switch Platform`を押してビルド対象を変更します。ビルド対象を変更したら、`Player Settings`を押してください。
![CleanShot 2024-12-02 at 11.57.59@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/f2196bf7-1485-4455-817b-a1cb4e920a54.png)

開いたら下にスクロールして、`Requires ARKit support`にチェックを入れてください。
またUnity6では`Bundle Identifier`の初期値が(おそらく)すべて同じでXCodeでエラーを吐くので、`Override Default Bundle Indentifier`のチェックを一度外してまた付けて、`Bundle Identifier`を固有の値に変更してください。

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

次に、`XR Plug-in Management`に進んでください。
![CleanShot 2024-12-02 at 11.58.58@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/a3f7493f-5965-029e-738f-d68fb11d609b.png)

以下の画像の通りにチェックを入れてください。「XR Simulation」はエディター上での実行に必要です。
![CleanShot 2024-12-02 at 11.59.11@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/8e2fd4d7-a08f-14c3-af3c-81422b020c15.png)
![CleanShot 2024-12-02 at 11.59.14@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/b1751554-70f5-fe42-4204-8845c4dc6eb1.png)

以上でビルド設定は終了です。

### シーン設定
ここからARのためのシーンを作っていきます。難しそうに思えますがめちゃくちゃ簡単です。
まず最初にシーンから`Main Camera`と`lobal Volume`を削除します。
![CleanShot 2024-12-02 at 11.59.54@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/657b32b3-6ce9-108e-bd2f-4ab436b70bb9.png)

次に、ヒエラルキー上で右クリックをして、`XR`から`AR Session`と`XR Origin(Mobile AR)`を追加してください。
![CleanShot 2024-12-02 at 12.00.12@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/0b455da9-36ee-a722-c2ce-5a464030ef5b.png)

実はこれだけで、ARを実行する準備は整ったのです!
では試しにエディター上で実行してみましょう!

:::note
`OpenXR`の導入と[ビルド設定](#ビルド設定)で行った`XR Simulation`へのチェックのおかげでPC上でも擬似的に実行できます。
:::

### 実行...あれ?!
![CleanShot 2024-12-02 at 12.00.46@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/394a1edd-8212-7890-d552-49ee8fbf9f4d.png)

...出ました。今回の記事のトピック、「一面真っ黄色」です。実機でもこうなります。こいつのせいで私は多くの時間を消費したのです。

## 一面黄色の解決法
まず、「URP」という名前で(他の名前でもいいですがRender関係であることがわかるように)フォルダを作成してください。
![CleanShot 2024-12-02 at 12.01.13@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/3ea9abcd-ca04-1fce-25c4-d949f8435191.png)

続いて、作成したフォルダ内で右クリックをし`URP Asset(with Universal Renderer)`を作成してください。
![CleanShot 2024-12-02 at 12.01.34@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/051e8032-455e-812a-2fc6-773d2ebedd8b.png)

2つファイルが作成されますが、そのうち「<指定した名前>_Renderer(Universal Renderer Data)」にインスペクターの`Add Renderer Feature`から`AR Background Renderer Feature`を追加してください。
![CleanShot 2024-12-02 at 12.02.02@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/24bc25e0-91c8-fb44-bfa3-ee1f2ac1ef66.png)

URPの設定が終わったら、メニューバーから`Edit` > `Project Settings`を開きます。

`Graphics`を開き、`Default Render Pipeline`を先ほど作成したものに変更します(枠一番右の二重丸をクリックすると選択できます)。
![CleanShot 2024-12-02 at 12.02.58@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/ceab7842-ca6c-3304-41bc-01067779b2ab.png)

次は、`Quality`を開き、以下のようにクリックします。
![CleanShot 2024-12-02 at 12.03.20@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/3a2de8b4-c04a-cbff-abcb-2551f92228dc.png)

先ほどと同様に、`Render Pipeline Asset`を変更します。
![CleanShot 2024-12-02 at 12.03.30@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/647300ab-f738-4883-0d83-af0824ce9d72.png)

**これで完了です！**

### もう一度実行!
![CleanShot 2024-12-02 at 12.03.47@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949821/a3dc54c3-4efd-407b-032f-86b45e586962.png)

黄色が消えました!
実機でのテストは省略しますが、正常に動作します。

## まとめ
以上、カメラ出力が黄色になってしまうときの対処法でした。ドキュメントとサンプルプロジェクトと私の環境とでにらめっこしながら頑張りました(^^)
この方法は参考にしたAR Foundationのドキュメントでは必要に応じてする操作とされているのですが、私の環境では必須でした。なので他の方の環境ではわかりませんが、もはやチュートリアルの一環と言ってもいいのではないでしょうか。
皆さんのお役に立てたら幸いです。
それでは、良きAR開発ライフを!

## 参考

https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.0/manual/index.html

https://github.com/Unity-Technologies/arfoundation-samples?tab=readme-ov-file