Unity AR 触る

[【完走目指す】初心者が25日で強くなる Advent Calendar 2022】](https://qiita.com/advent-calendar/2022/aruhitoganbaru)
９日目です。　
# はじめに　
「備忘録　よく使うやつ一覧」の記事は抹消しました　
ARの使い方について学びます。
平面を検出→タップ→なんか出る
ここまでやります。
# 下準備
#### 1.Unityに必要な素材を入れる。
>AR 開発を始めるには、AR Foundation を使用して Unity がサポートするハンドヘルド AR デバイスとウェアラブル AR デバイス用のアプリケーションを作成することを推奨します。

>AR Foundation を使用すると、Unity 内でマルチプラットフォームの方法で拡張現実 (AR) プラットフォームを使用できます。このパッケージは Unity 開発者向けのインターフェースを提供しますが、それ自体で AR 機能を実装することはありません。

>ターゲットデバイスで AR Foundation を使用するには、Unity が公式にサポートするターゲットプラットフォームごとに個別のパッケージをダウンロードしてインストールする必要もあります。

引用：

https://docs.unity3d.com/ja/2019.4/Manual/AROverview.html

まずは必要なものを入れましょう
Window > Package Manager
この辺りに入っています
左上、デフォルトでPackages: In Projectとなっています。
この状態では、今自分のプロジェクトに入っているものが表示されます。
Unity Registryに変更すると、まだインストールしていないものが出てきます。

![スクリーンショット (74).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/d875976f-0163-f82c-ea94-000e78f59511.png)

今回はAndroidとios用の必要な奴ものを入れておきます。
詳しくは、引用したページを参照してください。
AR制作に「AR Foundation」が必要っぽいので入れておきます。

下準備、OK。
#### 2.いろいろ取り付けていく
![スクリーンショット_20221208_111421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/fab9df7f-e843-b479-921e-dbaa488c0a30.png)

Hierarchyになんか増えました。XR。今回使うやつです。

ここから
「AR Session」、「AR Session Origin」
を用意しましょう。
「AR Camera」は「AR Session Origin」の中に含まれているようです。　
これ以外いらないはずです。
>An ARSessionOrigin is the parent for an AR setup. It contains a Camera and any GameObjects created from detected features, such as planes or point clouds.


引用: 


https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@1.0-preview.8/api/UnityEngine.XR.ARFoundation.ARSessionOrigin.html

Unityに元からついていたカメラは消します。２つあるとうまく動きませんでした。
Hierarchyの中には今入れたやつしかいらないです。　
#### 3.設定する　
AR Session OriginにAR Plane Managerを入れます。
![スクリーンショット_20221208_130615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/56c67c90-d511-6e9d-0ac7-ac275991ac6a.png)
平面を検出できるようです。
壁も行けます。今回は平面ならどこでもいいのでDetection ModehaEverythingにします。
Plane Prefabはよくわかりませんが、とりあえず付けます。
![スクリーンショット_20221208_165305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/69390251-938c-ea57-89e1-d6f858984a64.png)
つきました。
ついでに、これもつけておきます。

https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html

あるといいらしい。
おそらく、今の状態では
１．AR　Cameraを使って景色が映る
２．AR　PlaneManagerで平面が検出される
ここまでできているはずです。
ここまでをいったんアプリにして確認します。
![Screenshot_20221208_172219_com.aruhitoganbaru.unitydeAR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/055e51a4-3b8b-172b-888c-e4ace49be2a1.jpeg)
　　　　　　　　　　　　　　　　　　　　　　　　　　
画面が真っ暗です。
何かしら間違っています。
![スクリーンショット_20221208_172525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/60cc1b55-8917-b403-f1dd-4690d24bb4fe.png)
Project Settingsの、XR Plug-in Management。
ARCoreにチェックを入れます
結果
![Screenshot_20221208_173839_com.aruhitoganbaru.unitydeAR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/0565526c-dc3c-bfd4-f0df-83f1d9543f59.jpeg)
見づらいけど、
##### できてる！
#### 4.平面タップでオブジェクト出す
平面を認識したので、認識した平面にオブジェクトを出します。
まずは、どのように作るか考えます
↓以下が文字に起こした、ざっくりした構造になります。
1.オブジェクトなどの必要なものをを定義
2.もし画面をタップしたら
3.タップした位置を取得
4.取得した位置に対して、オブジェクトを配置（角度は画面に対してデフォルトにする）
ここまでの流れをスクリプトに書いていきます
参照:

https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html

ここに書いてあるスクリプトを参考に作っていきます。

>using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

を入れます。これで、AR関連について書くこととができるようになります。
>[SerializeField] GameObject Cube;
    [SerializeField] ARRaycastManager ARRM;

Cubeを出します。なので名前はCubeです。
ARRMは大文字を集めただけです。気にしないでね。
>List<ARRaycastHit> Hits = new List<ARRaycastHit>();

List型は初めて使います。
これで　List<ARRaycastHit> Hits　の中はnew List<ARRaycastHit>()になります。
Listは、指定したもの(<>にくくられているもの）の中のデータを入れておくためのものらしいです。
> if (Input.touchCount == 0)
        {
            return;
        }

touchcountには、いろいろ種類があるようです。
今回使っているInput.touchCount == 0では、タッチされた指の本数を表すようです。
今回のtouchcount==0では、全く指がタッチされていない状態を表しています。
これが１とか２とか増えると、ボタンを一本指とか二本指とか増やせます。
returnは、その処理が終了します。今回の場合は、void Update()の中にあるので無限に始まって終わるを繰り返しているっぽいです。
> if (ARRM.Raycast(Input.GetTouch(0).position, Hits))
        {
            Instantiate(Cube,Input. GetTouch(0).position,Quaternion.identity);
        }

もし、AR Raycast ManagerのRaycastによってタッチしたことが検出されたら、InstantiateでCubeを作ります。
Instantiateはオブジェクトが作られる関数です。
参考:

https://www.sejuku.net/blog/48180

では、このスクリプトの全体像をどうぞ
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class TestAR : MonoBehaviour
{
    [SerializeField] GameObject Cube;
    [SerializeField] ARRaycastManager ARRM;
    List<ARRaycastHit> Hits = new List<ARRaycastHit>();
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.touchCount == 0)
        {
            return;
        }
        if (ARRM.Raycast(Input.GetTouch(0).position, Hits))
        {
            Instantiate(Cube,Input. GetTouch(0).position, Quaternion.identity);
        }
    }
}
```
あとは、Cubeを作ってProjectへ移動させて、
![スクリーンショット_20221208_224222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/f9d0391b-710a-9bb9-2825-ce19cc9fd2f7.png)
    さっきのやつをAR Session Originにつけて
![スクリーンショット_20221208_224231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/fd27eb8e-9944-e0c2-ed93-4ce69a09a66b.png)
動作確認します。
動きませんでした。何故。
# 原因を探る
なんか、
List<ARRaycastHit> Hits = new List<ARRaycastHit>();の位置がおかしいと予想。
void Updateの中に移動しました。
# 結果
動かない。 次

AR Session OriginのAR Plane ManagerのeverythingにしていたものをHorizontalに変更したり、AR Raycast ManagerのRAR Dafalt PlaneDafalt Plane
をつけてみたりした。
結果
以下のサイトを参考に、HitPose[0].poseを使ってみることにした。
あと、もともと
>  if (Input.touchCount == 0)
        {
            return;
        }

こうなっていたのも
>if(Input.touchCount == 0 || Input.GetTouch(0).phase != TouchPhase.Ended || sphere == null)
        {
            return;
        }

そのまま変えた。
結果
動かない。なんで。
# 真の原因
![スクリーンショット_20221208_233754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/6ebc6511-150b-edff-75f7-8ad9e4f370d3.png)
追加されてなかった。追加した。
### 結果
![Screenshot_20221209_004544_com.aruhitoganbaru.unitydeAR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/7fe27604-8134-f985-2916-55eda22c9c04.jpeg)

できた！！！

# まとめ
ARで新時代を見た。
可能性の塊。