Mixamoの3DキャラクターとアニメーションをiPhoneのARで表示するにはUnityで始めるARKit入門(3)(3/3 ページ)

» 2018年02月08日 05時00分 公開
[薬師寺国安PROJECT KySS]
前のページへ 1|2|3       

画面タップではなくボタンタップであることを明示する処理を追加する

 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;
}
リスト2 UnityARHitTestExample.cs

 コードの中身を解説しておこう。

 まずは「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の「設定」→「一般」→「デバイス管理」で設定してほしい。

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

次回は、ロケットを飛ばすサンプル

 実際に動かしてみて分かったのだが、現状だと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)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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