HAMADAの語り草

興味のある技術のアウトプットをしたいと思います

UnityでARに入門した話

はじめに

こんにちは!!会津大学学部二年のHAMADAです。

夏休み第二弾のブログです!!八月も終わりに近づいてきましたが、まだまだ頑張ります。

第三弾も頑張ってやりたいですね.....

さて今回は、UnityでARに入門した話です。

 

動機・目的

私は大学でA-PxL(Aizu-Progressive xr Lab)というサークルに所属しています。しかし今までじっくりとxR開発を行なってこなかったので、一念発起してARに取り組むことにしました!!サークル内でも、VR開発がメインなのでこれを機にARを頑張りたい。

 

開発準備

使用したもの
  • Unity
    いつもお世話になりますUnity先生。容量を結構持って行かれて辛い。

  • C#
    iOSのAR開発では、Swiftも使いますがUnityなのでC#
  • Xcode
    Unityからbuildして、Xcode経由でiPhoneにやる。こいつも容量食う。
  • iPhone 12 mini
    私の相棒です。
  • Macbook Air
    頑張ってくれてますが、容量が足りません。Unityはギリ動く。

実装内容について

Unityのセッティング

まず、AR開発ができるように設定していきます。

以下に手順を書いていきたいと思います。

  1. Unityで新しいプロジェクトを作成します。(3Dコアで構いません)
  2. プロジェクトが開かれたら、Edit > ProjectSettings...を開きます。
    XR Plug-in Management > iOSを選択し、ARKitにチェックを入れます。

     

  3. Window > Package Manager を開きます。
    AR Foundation, ARKit XR Pluginをインストールする。

    とりあえずはこれでOKです。

具体的に実装してみる

今回した実装は、水平面を検知してその場所を示してくれるものと画面 (iPhoneの画面)をタップするとCubeが配置されるというもの。

順番に手順を示します。

まず、水平面の検知

  1. Hierarchy上で右クリックして、XR > AR Session Origin, XR > AR Sessionを追加します。Main cameraは必要ないので消去します。

  2. AR Session OriginのInspectorからAdd Component > AR Plane Managerを追加します。

  3. Hierarchy上で右クリックして、XR > AR Default Planeを追加します。このAR Default PlaneをPrefab化して、Hierarchy上からは消去しておきます。

  4. AR Session Origin のInspectorで、AR Plane Manager > Plane PrefabにPrefab化したAR Default Planeを追加する。

  5. AR Plane Manager > Detection ModeはHorizontalにしておく。

 

次に、タップするとCubeが配置されるようにします。

  1. AR Session OriginのInspectorからAdd Component > AR Raycast Managerを追加します。

  2. Hierarchy上で右クリックして、3D Object > Cubeを追加します。このCubeはPrefab化して、Hierarchy上からは消去します。

  3. Project上で右クリックして、Create > C# Scriptから画面をタップするとCubeが配置されるようにするためのスクリプトを作成します。
    コードは以下のようなものです。
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.XR.ARFoundation;
    using UnityEngine.XR.ARSubsystems;
    public class tap_object : MonoBehaviour
    {
        [SerializeField] GameObject cube;
        private ARRaycastManager m_RaycastManager;
    
        List m_Hits = new List();
    
        private void Awake()
        {
            m_RaycastManager = GetComponent();
        }
        void Update()
        {
            if (Input.touchCount > 0)
            {
                Vector2 Touch_Position = Input.GetTouch(0).position;
                if (m_RaycastManager.Raycast(Touch_Position, m_Hits, TrackableType.Planes))
                {
                    Instantiate(cube, m_Hits[0].pose.position, Quaternion.identity);
                }
            }
        }
    }
  4. AR Session OriginのInspectorからAdd Component > 作成したC# Scriptを追加します。追加したC# Script > Cubeに先ほどPrefab化したCubeを追加します
  5. これで完成です!!

Inspectorがどんな感じか添付しておきます。

ビルドする

具体的に実装してみる

まずは、Unity側からBuildします。

File > Build Settingsを開いて以下の画像のように設定します。



ここで左下の Player Settingsを開きます。

Requires ARKit supportにチェックを入れます。

その後Build SettingsからBuildします。XcodeとARKitのバージョンの不一致からBuildできない旨の警告が出た場合は、Player Settings > Target minimum iOS Versionを入力し直すと上手くいきました。

次にXcodeを起動します。

Open a project or fileから、先ほどbuildしたものの中にある、拡張子がxcodeprojのものを選択します。

Projectが開けたら、Xcodeでbuild and run していきますが、このままではBuildに失敗します。

buildしてみるとissueが吐かれるので、issueをクリックしてみると次のような画面になりました。

ここでAutomatically manage siginingにチェックを入れます。

Teamの欄は、画像上ではNoneにしていますが、ここで自分のTeamを作成するか、既にあるものを選択します。

その後、iOSの部分の表示が変わります。それでもダメそうであれば、Bundle Idenntifierの部分を画像のように、末尾に現在の日付を入れるなどします。その後、iOSの部分のTry Againを押すと上手くいきます。

Bundle Identifierは同じものが存在するとうまくいかないようです。

 

MaciPhoneを繋ぐとXcode上部にUnity-iPhone > "自分のiPhoneの名前"のように表示されます。

いよいよbuildします。

buildするとiPhone側で"信頼されていないデベロッパ"うんぬんかんぬんと出ます。

Mac側ではこんな感じのが出ます。

                                    

iPhoneの設定 > 一般 > VPNとデバイス管理 を選択します。

その中に、デベロッパAPPの欄があるのでそれを選択して、"信頼する"と選択するとbuildできます。

そうすると、アプリがiPhoneに表示されて開くことができるようになります。

                                             

 

デモ

実際に動かしてみるとこんな感じ。

                                        

おもしろい!!!

黒枠で囲まれて、黄色くなっているのが平面を検知してくれているものです。

タップするとCubeが置かれていますが、タップを続けると連続してCubeが置かれてしまうので改良の余地ありです。

 

感想と展望

今回はARに入門してみるということで取り組みました。現実に+αされるのがすごく面白くて楽しかったです。Unityの使い方自体は、他の開発と大きく変わるものではなかったのでそこまで大変ではなかったように思います。Unityの公式ドキュメントを主に使用しましたが、英語力の衰えを感じたので、英語を頑張る必要がありそうですw Unityでのゲーム開発よりは情報が少なく、その点は難しかったように思います。ここまでお付き合いありがとうございました!

 

参考リンク

docs.unity3d.com

ticklecode.com

所属サークル

A-PxL (@aizu_PxL) / Twitter

私のTwitter

HAMADA (@AHMOS_HMD) / Twitter

私のgithub

ahmos0 (HAMADA) · GitHub