Unityを使ってARKit対応アプリを開発するための入門連載。今回は、床の上に、色がランダムに変化するCubeが投げ出されるアプリを作ってみよう。
Unityを使ってARKit対応アプリを開発するための入門連載「Unityで始めるARKit入門」。連載初回となる前回は、ARKit対応アプリの開発環境を構築し、サンプルアプリを動かすまでの手順を解説した。今回から実際にARKitのプログラミングについて見ていこう。
今回は、図1のようなサンプルを作る。
まずは前回インストールしたUnityから新しいプロジェクトを作成して開いてほしい。プロジェクト名は何でも構わないが、今回はRandomColorChangeCubeとした。
Asset Storeに入り、前回解説したように「Unity ARKit Plugin」をインポートしておこう。
「Examples」フォルダ内のUnityARkitSceneのサンプルファイルをクリックすると、Hierarchy内に必要なファイルが表示される。
Hierarchy内の「PointExample」と「AR3DOFCameraManager」のチェックがInspectorから外されている(図2)。
チェックが外されたオブジェクトはグレー表示になっている(図3)。
今回、Scene上には配置するものは何もない。Cube自体はプログラムから動的に生成する。それでは、早速プログラムを書いていこう。
Hierarchy内の「HitCubeParent」を展開すると、中に「HitCube」という子Cubeがある(図4)。
このHitCubeのInspectorを表示すると「Unity AR Hit Test Example(Script)」の中のScriptに「UnityARHitTestExample」というスクリプトがある(図5)。
これをダブルクリックしてエディタを起動し、「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);
- }
- }
- }
- }
- }
必ずビルドを忘れないで実行してほしい。
コードの中で、public変数として宣言したCamが、「Unity AR Hit Test Example(Script)」の中にプロパティとして表示されるので、右隅の「○に・」アイコンをクリックして、「Main Camera」を指定する(図6)。
ここまでのSceneを「RandamColorCube」という名前で保存しておこう。
このままの状態でビルドしてiPhoneの端末で動かしてみよう。
Unityメニューの「File」→「BuildSettings」と選択すると、Scenes In Build内にたくさんのサンプルが登録されている。今回は、「RandomColorCube」という名前でサンプルを保存しているので、「Add Open Scenes」のボタンをクリックして「RandomColorCube」を表示させてチェックを付ける。
その後、「Swicth Platform」をクリックする(図7)。
「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を投げて奈落の底に落ちて行くのが分かる。
次回は、ボタンのタップでキャラクターがいろいろなダンスを踊るサンプルを紹介する。通常、ボタンを配置しておいて実行時にタップすると、ボタンをすり抜けて画面タップと同じ処理として扱われてしまう。その対処法も解説するので、お楽しみに。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。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.
Smart & Social 鬯ョ�ォ�ス�ェ髯区サゑスソ�ス�ス�ス�ス�コ髣包スオ隴∵コキ�ク�キ�ス�ケ隴趣ス「�ス�ス�ス�ウ鬩幢ス「�ス�ァ�ス�ス�ス�ュ鬩幢ス「隴趣ス「�ス�ス�ス�ウ鬩幢ス「�ス�ァ�ス�ス�ス�ー