2017年3月20日月曜日

HoloLensの開発効率化 ノーコーディングでオブジェクトにマーカーをつける方法

お疲れ様です。ZuQ9->Nnです。 
HoloLensは、とても視野が狭く、
ホロがどうしても、視界の外に出てしまいます。

そこで、オブジェクトにマーカーをつけて
視界を誘導してあげたい場合があります。
こちらもHoloToolkit-Unityにすでに用意されています。

一番簡単なものは、HoloToolkit > Utilities > Prefabsの中にある
HeadsUpDirectionIndicator.prefabを利用する方法です。

こちらも、いつものように手順をおっていきます。
まずは、HoloToolkit-Unityのインストールとプロジェクトの設定

最初にMain Cameraを選択、右クリックでメニューを表示しDelelteで削除します。
次に、HoloToolkit > Input> Prefabsの中にあるHoloLensCamera.prefabを
Hierarchyにドラッグアンドドロップで追加

次に、HoloToolkit > Input> Prefabsの中にあるInputManager.prefabを
Hierarchyにドラッグアンドドロップで追加
次に、HoloToolkit > Input> Prefabs > Cursorの中にあるBasicCursor.prefabを
Hierarchyにドラッグアンドドロップで追加
HierarchyからCreate > 3D Object > CubeでCubeを作成
Cubeの位置を見やすい位置に移動してください。(今回は x:0 y:0 z:7)
次に、HoloToolkit > Input> Utilities> Cursorの中にある
HeadsUpDirectionIndicator.prefabを
Hierarchyにドラッグアンドドロップで追加
HierarchyのHeadsUpDirectionIndicatorを選択し、Inspectorの
TargetにHierarchyのCubeをセット
なんと、作業はこれで完了、Unityを実行してみると、
こんな感じでオブジェクトに矢印が表示されます。
video
しかし、この方法では、問題がのこります。
そう、HeadsUpDirectionIndicatorのTargetには
1つのオブジェクトしかしていできません。

それでは、2つ以上のオブジェクトの場合の対応法をみていきましょう。
HeadsUpDirectionIndicatorを選択、右クリックでDeleteを選択し削除します。

HierarchyからCreate > 3D Object > SphereでSphereを作成
CubeとSphereの座標を見やすい位置に移動。(cubeは x:1 y:0 z:7、Sphere x:-1 y:0 z:7)

HierarchyからCreateを選択、InspectorのAdd ComponentでDirectionIndicator.csをアタッチ
アタッチされたDirectionIndicatorのCursorにHierarchyのBacicCursorをセット
HoloToolkit > Input> Utilities> PrefabsのHeadsUpDirectionIndicatorPointer.prefab
DirectionIndicatorのCursor Indicator Objectにセット
HierarchyのSphereも同じ手順で、同じ設定を行ってください。
これでUnityを実行してみると、こんな感じで、
オブジェクト一つ、一つに対してマーカーがつき矢印もオブジェクトの方向に向きます。。
video
ただ、見ていただいてもわかるように、矢印がかなり、大きく不格好です。
また、オリジナルのマーカーを表示したいという欲求もうまれてきます。
なので、次に、マーカーを変更してみることにします。
まずは、お好きな画像を用意。

ここでの説明は、僕がかなり適当に作った arrow.png、star.pngを使って説明します。
まずは、この画像をUnityのProjectに追加、
HierarchyからCreate > 3D Object >  QuadでQuadを作成
Quadを選択し、Projectに追加したarrow.pngをドラッグアンドドロップで追加
QuadをArrowに名前を変更後、HierarchyからProjectにドラッグアンドドロップでPrefabに
HierarchyのArrowは削除してください。
HierarchyのCubeを選択、InspectorのDirectionIndicator
Cursor Indicator ObjectにPrefab化したArrowをセット

同じ手順でStar.pngをQuadに追加、StarのPrefabを作成
SphereのDirectionIndicatorほうにはCursor Indicator ObjectにPrefab化したStarをセット
これでUnityを実行すると、こんな感じでです。
video

画像があまりに適当すぎて、わかりずらいのですが (;^_^A アセアセ・・・
Cube、Sphereにそれぞれ、独自のマーカーが適用され
それぞれのオブジェクト方向に向きます。

マーカーが青色に変わるのは、DirectionIndicator.csの
DirectionIndicatorColorが適用されているためでこちらの色はInspectorで変更可能です。

HoloToolkit > Utilities > Tests > Scenesに
HeadsUpDirectionIndicator.unityというサンプルがあり、
こちらは、HeadsUpDirectionIndicator.csを利用しています。

HeadsUpDirectionIndicator.csは、HeadsUpDirectionIndicator.prefabにも
利用されているスクリプトでDirectionIndicator.csとの違いは
HeadsUpDirectionIndicator.csのTargetに対してオブジェクトをアタッチします

こちらの手法でも、もちろん今回のようなサンプルでは大丈夫かと思いますが、
動的にコードでオブジェクトをInstantiateする場合は
オブジェクトに対してDirectionIndicator.csをアタッチし、
それをPrefab化したものをInstantiateする方法が適していると思います。