UnityでCubeを床に投げるARKitアプリを作るUnityで始めるARKit入門(2)

Unityを使ってARKit対応アプリを開発するための入門連載。今回は、床の上に、色がランダムに変化するCubeが投げ出されるアプリを作ってみよう。

» 2018年01月25日 05時00分 公開
[薬師寺国安PROJECT KySS]

 Unityを使ってARKit対応アプリを開発するための入門連載「Unityで始めるARKit入門」。連載初回となる前回は、ARKit対応アプリの開発環境を構築し、サンプルアプリを動かすまでの手順を解説した。今回から実際にARKitのプログラミングについて見ていこう。

 今回は、図1のようなサンプルを作る。

図1 床の上に、色がランダムに変化するCubeが投げ出されている

プロジェクトを新規で作成し、Asset StoreからARKitのプラグインを取り込む

 まずは前回インストールしたUnityから新しいプロジェクトを作成して開いてほしい。プロジェクト名は何でも構わないが、今回はRandomColorChangeCubeとした。

 Asset Storeに入り、前回解説したように「Unity ARKit Plugin」をインポートしておこう。

UnityARkitSceneのサンプルファイルを開く

 「Examples」フォルダ内のUnityARkitSceneのサンプルファイルをクリックすると、Hierarchy内に必要なファイルが表示される。

 Hierarchy内の「PointExample」と「AR3DOFCameraManager」のチェックがInspectorから外されている(図2)。

図2 InspectorからPointExampleのチェックを外した

 チェックが外されたオブジェクトはグレー表示になっている(図3)。

図3 チェックが外されているオブジェクトはグレー表示になっている

プログラムを書く

 今回、Scene上には配置するものは何もない。Cube自体はプログラムから動的に生成する。それでは、早速プログラムを書いていこう。

 Hierarchy内の「HitCubeParent」を展開すると、中に「HitCube」という子Cubeがある(図4)。

図4 「HitCubeParent」を展開すると「HitCube」という子Cubeがある

 このHitCubeのInspectorを表示すると「Unity AR Hit Test Example(Script)」の中のScriptに「UnityARHitTestExample」というスクリプトがある(図5)。

図5 「UnityARHitTestExample」というスクリプトをエディタで編集する

 これをダブルクリックしてエディタを起動し、「UnityARHitTestExample.cs」ファイルをリスト1のように編集する。

using System;
using System.Collections.Generic;
 
namespace UnityEngine.XR.iOS
{
    public class UnityARHitTestExample : MonoBehaviour
    {
        //public変数として、Camera型の変数Camを宣言する
        public Camera cam;
//以下のコードはコメントアウトする
        //public Transform m_HitTransform;
 
        //bool HitTestWithResultType (ARPoint point, ARHitTestResultType resultTypes)
        //{
        //    List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface ().HitTest (point, resultTypes);
        //    if (hitResults.Count > 0) {
        //        foreach (var hitResult in hitResults) {
        //            Debug.Log ("Got hit!");
        //            m_HitTransform.position = UnityARMatrixOps.GetPosition (hitResult.worldTransform);
        //            m_HitTransform.rotation = UnityARMatrixOps.GetRotation (hitResult.worldTransform);
        //            Debug.Log (string.Format ("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));
        //            return true;
        //        }
        //    }
        //    return false;
        //}
 
        void Update () {
            if (Input.touchCount > 0 && cam != null)
            {
                //CreatePrimitiveで動的にGameObjectであるCubeを生成する
                GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
//Cubeに適用するランダムな色を生成する
                Material material = new Material(Shader.Find("Diffuse"))
                {
                    color = new Color(Random.value, Random.value, Random.value)
                };
                //ランダムに変化する色をCubeに適用する
                cube.GetComponent<Renderer>().material = material;
                //Android端末をタップして、ランダムな色のCubeを認識した平面上に投げ出すように追加していく
                //Cubeの大きさも0.2fとして指定している
                cube.transform.position = cam.transform.TransformPoint(0, 0, 0.5f);
                cube.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
                //CubeにはRigidbodyを持たせて重力を与えておかないと、床の上には配置されないので注意が必要。Rigidbodyで重力を持たせないとCubeは宙に浮いた状態になる
                cube.AddComponent<Rigidbody>();
                cube.GetComponent<Rigidbody>().AddForce(cam.transform.TransformDirection(0,1f,2f),ForceMode.Impulse);
                }
            }
        }
    }
}
リスト1 UnityARHitTestExamples.cs

 必ずビルドを忘れないで実行してほしい。

 コードの中で、public変数として宣言したCamが、「Unity AR Hit Test Example(Script)」の中にプロパティとして表示されるので、右隅の「○に・」アイコンをクリックして、「Main Camera」を指定する(図6)。

図6 CamにMain Cameraを指定した

 ここまでのSceneを「RandamColorCube」という名前で保存しておこう。

実行結果

 このままの状態でビルドしてiPhoneの端末で動かしてみよう。

 Unityメニューの「File」→「BuildSettings」と選択すると、Scenes In Build内にたくさんのサンプルが登録されている。今回は、「RandomColorCube」という名前でサンプルを保存しているので、「Add Open Scenes」のボタンをクリックして「RandomColorCube」を表示させてチェックを付ける。

 その後、「Swicth Platform」をクリックする(図7)。

図7 Add Open ScenesボタンでRandomColorCubeを表示して選択する

 「Switch Platform」の横にある「Player Settings」ボタンをクリックする。「Other Settings」の「Bundle Identifier」「Camera Usage Description」「Target Device 」「Target Minimum iOS Version」などを設定する。詳細については前回記事を参照してほしい。

 この設定が終わったら、iPhoneとMacのPCを接続しよう。「Build And Run」をクリックするとファイル名を保存する画面が表示される。「FirstARkitSample」と入力して「Save」ボタンをクリックするとビルドが開始される。

 ビルドが完了するとMacの右下でXcodeのアイコンが表示される。これをクリックするとXcodeの画面が起動する。

 以降の操作は、前回と全く同じ手順なので、解説は割愛する。

 動画1では、平面の床が認識されていないところにCubeを投げて奈落の底に落ちて行くのが分かる。

動画1 RandomColorCubeのサンプルを動かした動画

次回は、ボタンのタップでキャラクターがいろいろなダンスを踊る

 次回は、ボタンのタップでキャラクターがいろいろなダンスを踊るサンプルを紹介する。通常、ボタンを配置しておいて実行時にタップすると、ボタンをすり抜けて画面タップと同じ処理として扱われてしまう。その対処法も解説するので、お楽しみに。

著者プロフィール

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。

1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。

1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。

2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。

Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。

Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。

Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。

Microsoft MVP for Development Platforms-Windows Platform Development(Oct 2014-Sep 2015)。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。