Hierarchy内にある「HitCubeParent」の子「HitCube」を選択して、Inspectorを表示させる。「Unity AR Hit Test Example(Script)」の中に、UnityARHitTestExampleのスクリプトがあるので、これをクリックしてコードエディタで開いて、リスト2のようにコードを編集する。
using UnityEngine.EventSystems; 
 
void Update () {
    if ((Input.touchCount > 0 && m_HitTransform != null) && !IsPointerOverUIObject())
    {
        var touch = Input.GetTouch(0);
        if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
{
            var screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
            ARPoint point = new ARPoint {
                x = screenPosition.x,
                y = screenPosition.y
            };
 
            // prioritize reults types
            ARHitTestResultType[] resultTypes = {
                ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, 
// if you want to use infinite planes use this:
//ARHitTestResultType.ARHitTestResultTypeExistingPlane,
                ARHitTestResultType.ARHitTestResultTypeHorizontalPlane, 
                ARHitTestResultType.ARHitTestResultTypeFeaturePoint
            }; 
    
            foreach (ARHitTestResultType resultType in resultTypes)
            {
                if (HitTestWithResultType (point, resultType))
                {
                    return;
                }
            } 
〜中略〜
private bool IsPointerOverUIObject()
{
    PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
    eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    List<RaycastResult> results = new List<RaycastResult>();
    EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
    return results.Count > 0;
}
コードの中身を解説しておこう。
まずは「using UnityEngine.EventSystems;」と記述して、「EventSystems」の名前空間を読み込んでおく。これはUnityのシーンのイベントを処理する役割を持っているので、忘れずに追加してほしい。
4行目で「&& !IsPointerOverUIObject()」を追加している。この関数は32〜39行目で定義している。
IsPointerOverUIObject()関数では、Danceの操作はボタンで行うことを明示している。このコードを書いていないと、「ボタンではなく画面そのものをタップした」と判断され、キャラクターが何人も表示されてしまう。
ただ、IsPointerOverUIObject()関数のコードを書いていても、何回も画面をタップしてしまうとキャラクターが何人も表示されるので、ボタンだけをクリックするように注意してほしい。
ボタンを使用したサンプルには、全てこのコードを追加する必要があり、使い回しが可能だ。本連載では次回以降でもボタンを使用したサンプルには、この関数を呼び出している。
ここまでのSceneを上書き保存しビルドしよう。
Unityメニューの「File」→「BuildSettings」と選択すると、「Scenes In Build」内にたくさんのサンプルが登録されている。「Add Open Scenes」ボタンをクリックして、DancingCharacterを表示させてチェックを付ける。その後、「Switch Platform」をクリックする。
「Switch Platform」の横にある「Player Settings」ボタンをクリックし、「Other Settings」の「Bundle Identifier」「Camera Usage Description」「Target Device」「Target Minimum iOS Version」などを設定する。詳細については、連載第1回を参照してほしい。
iPhoneとMacを接続し「Build And Run」をクリックすると、ファイル名を保存する画面が表示される。「DancingCharacter」と入力して「Save」ボタンをクリックすると、ビルドが開始される。
ビルドが完了するとMacの右下でXcodeのアイコンが表示されるので、これをクリックする。すると、Xcodeの画面が起動する。これ以後の操作はこれまでの連載と全く同じなので、解説は割愛する。
ビルドした結果「Build Failed」と表示されることがあるかもしれないが、その場合は無視してXcodeの変換処理を行うと問題なく動作する。
また、iPhone側で「アプリが信頼できるものである」と設定しなければならない場合もある。その場合はiPhoneの「設定」→「一般」→「デバイス管理」で設定してほしい。
実際に動かしてみて分かったのだが、現状だと3Dキャラクターにはあまり光が当たらず暗いので、もう1個「Directional Light」を追加して、モンスターに光が当たるようにしてもいいだろう。
次回はロケットを飛ばすサンプルを紹介するので、お楽しみに。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。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)。
Unityゲーム/アプリの表現力の幅を広げるシェーダーとは――シェーダー作成の初歩
UnityアプリをWebGL、UWP、Android、iOS用としてビルドしてみた
Gear VRとは――UnityでAndroidアプリを開発するための環境構築Copyright © ITmedia, Inc. All Rights Reserved.