Unity2017からARライブラリのVuforiaがUnityに統合され、ますます簡単にARアプリケーションを作ることができるようになりました。ここではUnityでVuforiaを使う時に使えるTIPSとハマりやすいポイントを合わせて10個紹介したいと思います!
Vuforiaのセットアップ方法から、マーカの上にARで立方体を出すまでの入門講座はこちらをご覧ください。
nn-hokuson.hatenablog.com
- UnityでVuforiaを使う
- オートフォーカスを使いたい
- シーン再読み込みでライティングがおかしくなる
- アプリ起動時にはVuforiaを起動したくない
- あれ?モデルが表示されない?
- あれ?モデルが表示されない2?
- ARオブジェクトをタッチしたい
- ARオブジェクトにこっちを向かせたい
- なんかアプリの起動時間が長い
- UnityEditorで実行するとクラッシュする
UnityでVuforiaを使う
Vuforiaを使用するには、メニューバーからEdit→Project Settings→Player
を選択し、インスペクタのXR Settings→Vuforia Augmented Reality Supportedにチェックを入れるだけです。
注意点として、この設定はPC/iOS/Androidごとに分かれているので、iOSやAndroidビルドするときにはモバイル用のSettingsにも忘れずにチェックを入れないと次のようなエラーが出ます。
Assets/Vuforia/Scripts/DefaultInitializationErrorHandler.cs(10,7): error CS0246: The type or namespace name `Vuforia' could not be found. Are you missing an assembly reference?
オートフォーカスを使いたい
iOSでは基本的にオートフォーカスが効くようですが、Androidの一部端末ではオートフォーカスがかからないことがあります。
この場合は次のスクリプトをARCameraにアタッチすることでオートフォーカスが効くようになります。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Vuforia; using UnityEngine.UI; public class FocusController : MonoBehaviour { private bool mVuforiaStarted = false; void Start () { VuforiaARController vuforia = VuforiaARController.Instance; if (vuforia != null) vuforia.RegisterVuforiaStartedCallback(StartAfterVuforia); } private void StartAfterVuforia() { mVuforiaStarted = true; CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO) } void OnApplicationPause(bool pause) { if (!pause && mVuforiaStarted) { CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO) } } }
参考サイト
Camera Focus mode - Android - Unity | Vuforia Developer Portal
シーン再読み込みでライティングがおかしくなる
Vuforiaを使ったシーンを再読み込みすると、ライトが消えたようなおかしな画面になってしまうことがあります。マテリアルにStandardシェーダを使っている場合は特に気になります。
その場合は手動でライトのベイクを一度行うことで解決するようです。手動でベイクするにはメニューバーのWindow→Lighting→Settings
で表示されるライトの設定の一番下にあるDebug SettingsのAuto Generateのチェックを外してGenerate Lightingのボタンを押します。
アプリ起動時にはVuforiaを起動したくない
XR SettingsのVuforia Augmented Reality Supportedにチェックを入れると、ARを使用したくないシーンでも強制的にカメラが起動してしまいます・・・(AR Cameraオブジェクトを配置していないにも関わらず!)このままではアプリ起動時はメニュー画面を表示してから、AR画面に遷移する・・・のようなことができないのです。
解決策は、とても意味不明なのですが、ARを使用したくないシーンのカメラ(ARを使うシーンのAR Cameraじゃなくて!!!)にVuforia Behaviourコンポーネントをアタッチし、チェックを外します(非アクティブにする)
これでARカメラを起動しないシーンができます。あとはSceneManagerのLoadSceneなどを使ってARのシーンに移動すれば、ちゃんとARカメラが起動します。Vuforia Configurationの中にあるDelayed Initializationなどは全てトラップです。勘弁してください・・・
あれ?モデルが表示されない?
使用したいARマーカーのデータベースがアクティベートされていない可能性があります。一度チェックを入れても、マーカーをシーンビューに追加したタイミングなどでちょくちょく外れます(なんでやねん!)
Vuforiaの設定画面(AR CameraにアタッチされているVuforia BehaviourスクリプトのOpen Vuforia Configurationボタンをクリック)を開き、Databasesの欄をみて、使用したいマーカーのデータベースにチェックが入っているかを確認してください。
あれ?モデルが表示されない2?
マーカーの上に表示したいオブジェクトはマーカー(VuforiaのImage)の子要素にする必要があります。ヒエラルキービューで表示したいオブジェクトをマーカーにドラッグ&ドロップして下さい。
ARオブジェクトをタッチしたい
ARカメラからRayを飛ばしてオブジェクトに当たったかどうかを判定します。まずはARで表示するオブジェクトにCollisionを設定してから、次のスクリプトを作成してAR Cameraにアタッチしてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LockMaster : MonoBehaviour { void Update () { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit = new RaycastHit(); if (Physics.Raycast(ray, out hit, 1000)) { Debug.Log(hit.gameObject.name); } } } }
Updateメソッドの中で、タップされた位置からカメラの向いている方向にRayを飛ばして、そのRayがヒットしたオブジェクトを探しています。あとは煮るなり焼くなり・・・です。
ARオブジェクトにこっちを向かせたい
ARオブジェクトが常にカメラを向くように(ビルボード)にするためにはLookAtメソッドを使います。次のスクリプトをARオブジェクトにアタッチしてください。
using UnityEngine; public class LookAtCamera : MonoBehaviour { public GameObject camera; void Update () { transform.LookAt(camera.transform); } }
アタッチしたスクリプトのcameraの欄にヒエラルキービューのARCameraをドラッグ&ドロップしてください。このスクリプトではUpdateメソッドの中でLookAtのターゲットとしてAR Cameraの場所を指定しています。これによりカメラが移動した場合でも常にカメラに対して正面を向くようになります。
ARで表示したキャラクタの頭だけをこちらに向かせたい、といった場合はIKを使う必要があります。次の記事を参考にしてください。
なんかアプリの起動時間が長い
それはVuforiaのせいではないかもしれません(Vuforiaのせいにしていた時代がありました、ごめんなさい)。大きなテクスチャを使用している場合、シーンのロードに時間がかかります。テクスチャのインスペクタからMax Sizeを制限してみてください。
あとSubstanceで作られたMaterialを読み込むのにも、かなり時間かかります。こちらもインスペクタから「Bake and discard substance」に設定するとシーンのロード時間が速くなります。
UnityEditorで実行するとクラッシュする
プロジェクトフォルダを置いているパスに日本語が含まれているとクラッシュするようです(何時代だよ・・・)