3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【完走目指す】初心者が25日で強くなる Advent Calendar 2022】
9日目です。 

はじめに 

「備忘録 よく使うやつ一覧」の記事は抹消しました 
ARの使い方について学びます。
平面を検出→タップ→なんか出る
ここまでやります。

下準備

1.Unityに必要な素材を入れる。

AR 開発を始めるには、AR Foundation を使用して Unity がサポートするハンドヘルド AR デバイスとウェアラブル AR デバイス用のアプリケーションを作成することを推奨します。

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

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

引用:

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

スクリーンショット (74).png

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

下準備、OK。

2.いろいろ取り付けていく

スクリーンショット_20221208_111421.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.

引用:

Unityに元からついていたカメラは消します。2つあるとうまく動きませんでした。
Hierarchyの中には今入れたやつしかいらないです。 

3.設定する 

AR Session OriginにAR Plane Managerを入れます。
スクリーンショット_20221208_130615.png
平面を検出できるようです。
壁も行けます。今回は平面ならどこでもいいのでDetection ModehaEverythingにします。
Plane Prefabはよくわかりませんが、とりあえず付けます。
スクリーンショット_20221208_165305.png
つきました。
ついでに、これもつけておきます。

あるといいらしい。
おそらく、今の状態では
1.AR Cameraを使って景色が映る
2.AR PlaneManagerで平面が検出される
ここまでできているはずです。
ここまでをいったんアプリにして確認します。
Screenshot_20221208_172219_com.aruhitoganbaru.unitydeAR.jpg
                          
画面が真っ暗です。
何かしら間違っています。
スクリーンショット_20221208_172525.png
Project Settingsの、XR Plug-in Management。
ARCoreにチェックを入れます
結果
Screenshot_20221208_173839_com.aruhitoganbaru.unitydeAR.jpg
見づらいけど、

できてる!

4.平面タップでオブジェクト出す

平面を認識したので、認識した平面にオブジェクトを出します。
まずは、どのように作るか考えます
↓以下が文字に起こした、ざっくりした構造になります。
1.オブジェクトなどの必要なものをを定義
2.もし画面をタップしたら
3.タップした位置を取得
4.取得した位置に対して、オブジェクトを配置(角度は画面に対してデフォルトにする)
ここまでの流れをスクリプトに書いていきます
参照:

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

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

を入れます。これで、AR関連について書くこととができるようになります。

[SerializeField] GameObject Cube;
[SerializeField] ARRaycastManager ARRM;

Cubeを出します。なので名前はCubeです。
ARRMは大文字を集めただけです。気にしないでね。

List Hits = new List();

List型は初めて使います。
これで List Hits の中はnew List()になります。
Listは、指定したもの(<>にくくられているもの)の中のデータを入れておくためのものらしいです。

if (Input.touchCount == 0)
{
return;
}

touchcountには、いろいろ種類があるようです。
今回使っているInput.touchCount == 0では、タッチされた指の本数を表すようです。
今回のtouchcount==0では、全く指がタッチされていない状態を表しています。
これが1とか2とか増えると、ボタンを一本指とか二本指とか増やせます。
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はオブジェクトが作られる関数です。
参考:

では、このスクリプトの全体像をどうぞ

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
さっきのやつをAR Session Originにつけて
スクリーンショット_20221208_224231.png
動作確認します。
動きませんでした。何故。

原因を探る

なんか、
List Hits = new List();の位置がおかしいと予想。
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
追加されてなかった。追加した。

結果

Screenshot_20221209_004544_com.aruhitoganbaru.unitydeAR.jpg

できた!!!

まとめ

ARで新時代を見た。
可能性の塊。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?