2017年5月1日月曜日

とりあえずつかってみた、次世代ゲームエンジン Xenko プロジェクトの作成からRigdbodyでSphereを落とすまで

お疲れ様です。ZuQ9->Nnです。

最近UnityやHoloLensに関してまったく進捗があがらないまま
時間のみ過ぎていき、焦りと無力さばかりがつのる悶々とした日々

ゴールデンウイークはエンジニアの新技術研究期間?みたいなノリがあるので
今回、気晴らしもかねて次世代ゲームエンジンとされるXenkoをつかってみました。

Xenkoは2017/04/25にリリースされたばかりの新しいゲームエンジンで
シリコンスタジオという会社が開発、リリースを行っています。

特徴は、なっといっても、XenkoそのものがGitLabでオープンソースで開発されている事
そして、エンジン部分がC#で実装されてることかと思います。
ここら辺が「次世代」と言われているのかなって個人的には思います。

さっそく使ってみたので、プロジェクトの作成から、
RigdbodyでSphereを落とすまでをみていきたいと思います。

本来なら、インストールとかもやるべきかなぁと思ったりしたのですが、
それは、ほかの誰かが必ずやるだろうと思うので省略します。(*^^*)

勘違いしていたのですが、Xenkoそのものは、
setup.exeでWindows用しか公式には提供されていません。
現状はMacでは動かせないようです。

ちなみに、僕が普段使っているWindowsマシーンは
第四世代Intel Core i5、メモリ8G
Windowsは、64bitのWindows 10 Proです。
そちらでは、とくにインストールにはまることもありませんでした。

Xenkoをインストールするとlauncherが出てきますのでそちらをクリック
launcherが起動したらStartをクリック
Project Selectionの画面でNew ProjectのNew Gameを選択
(今回は保存場所とプロジェクト名はデフォルトのままですが
こちらは自由に変更しても問題ありません。)
プロジェクトのターゲットはWindows、Linx、UWP、Android、iOSとなっています。
Unityと違って、Web PlayerとかWebGLのサポートは現在のところ全くありません。

今回はとりあえずWindowsのみを選択しOKをおしました。
起動すると、こんな感じの画面で、メニュー等は
日本語化されていてなんだか安心感がありますw



すでにGroundのPlaneとSphereがデフォルト表示されています。
XenkoのページにXenko for Unityという
Unityとの比較がのっていて、各種のビューの名前がのっていますので
今回は、説明を割愛します。(;^_^A

Asset EditorのSphereを選択すると、Grid Propertyが
Sphereのプロパティに切り替わります。
Add Componentボタンありますのでそちらをクリック
つづいてRigdbodyを選択
そうすると、SphereのPrpoerty GridにRigdbodyのコンポーネントが追加されています。
オブジェクトに対してコンポーネントを追加していくのは、かなりUnityと似ていますね。

SphereのRigdbodyのコンポーネントのGravityをみると
なぜかX,Y,Zが指定できるようになっています。。
とりあえず、そのまま実行してみたところ。。なにも起きませんでした。
よくみると without any collider shapeというエラーがでていました。
これはRigdbodyのコンポーネントだけではなく
Colliderのコンポーネントを追加しないとダメなようです

SphereのRigdbodyのコンポーネントPrpoerty Gridの一番下に
Collider Shapesというプラスボタンがあり、そちらのプラスボタンをおすと
色々なColliderが選択できます。今回はSphereを選択しました
ここで気を取り直して、再びアプリを実行。。
動画が見にくくて申し訳ないのですが、
Unityのようにゲームビューで実行されず、
いったんWindowsのアプリとして別のWindowが起動します。
これは、少し不便ですね。。

あと、特にGravityのx,y,zの値は入れなくても下に落ちましたし
逆にxに値をいれてみても、実行結果に変化はありませんでした。

3Dのモデルはデフォルトでは、
ToursやTeapodなどUnityにはないものが用意されています。


おそらく、Asset Storeでの資産が大きく、すぐにUnityから乗り換えて
実務でガッツリ使うぜってノリで使えなかと思いますが
今回のように、とりあえず、試すには面白いツールかと思いました。

まだまだ今後の進化に期待ってところも多いですが
新しいツールの登場により、開発者の選択肢が広がるのは良いですね。
今後触り続けるかは、僕的にも少し微妙かな。。
ゴールデンウイークは時間が許す限りお遊びしてみます。(;^_^A


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を実行してみると、
こんな感じでオブジェクトに矢印が表示されます。
しかし、この方法では、問題がのこります。
そう、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を実行してみると、こんな感じで、
オブジェクト一つ、一つに対してマーカーがつき矢印もオブジェクトの方向に向きます。。
ただ、見ていただいてもわかるように、矢印がかなり、大きく不格好です。
また、オリジナルのマーカーを表示したいという欲求もうまれてきます。
なので、次に、マーカーを変更してみることにします。
まずは、お好きな画像を用意。

ここでの説明は、僕がかなり適当に作った 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を実行すると、こんな感じでです。

画像があまりに適当すぎて、わかりずらいのですが (;^_^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する方法が適していると思います。

2017年3月6日月曜日

HoloLensの開発効率化 KeywordManagerを利用して、超簡単にVoice Commandを実装しよう

お疲れ様です。ZuQ9->Nnです。 
今回はVoice Commandに挑戦です。

Voice Commandは、academyの101Chapter 4 - Voiceでは
KeywordRecognizer を使った実装が紹介されています。

HoloToolkit-UnityにはKeywordManager.csというスクリプトが用意されており
これを利用することで、簡単にVoice Commandを実装することができます。

まずは、HoloToolkit-Unityのインストールとプロジェクトの設定
今回は、Voice Commandを利用するので
UnityのHoloToolkitメニュー Configure > Apply HoloLens Capability Settingをクリック

Apply HoloLens Capability SettingsのMicrophoneのチェックをお忘れなく

UnityのHierarchyからCreate > Create Emptyで空のGameObjectを作成
作成したGameObjectを選択 Add Componentで
KeywordManager.csをアタッチメント
名前のよく似たKeyboardManager.csも存在するので
間違い無いように注意!!

今回は、Voice CommandでCubeとShpereを特定の座標に作成することにします。
UnityのProjectからCreate > C# Scriptで新しいScriptを作成
Script名はObjectCreator.csとします。

ObjectoCreator.csの中身はこんな感じ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectCreator : MonoBehaviour {

    public void CreateSphere()
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = new Vector3(-0.5f, 0, 3);
        sphere.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    }

    public void CreateCube()
    {
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.position = new Vector3(0.5f, 0, 3);
        cube.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    }
}

UnityのHierarchyでGameObjectを選択、Add Componentで作成した
ObjectCreator.csをアタッチメント


GameObjectにアタッチメントされているKeyboardManagerの
Keyword And Responsesのsizeを2にを入ると
Element 0、Element 1が表示されます。

Element 0のKey Cordにhi、Key CodeにCをセット
ResposeのList is Emptyの+マークをクリック

Runtime Onleyの下のNone(Object)をクリックし、GameObjectを選択

No Functionのドロップダウンリストをクリックし
ObjectoCreatorのCreateCubeメソッドを選択

Element 1には、ぼぼ同じ手順で
のKey Cordにya、Key CodeにSを
Response()のRuntime Onlyには
ObjectoCreatorのCreateSphereメソッドを選択

なんとこれでVoice Commandの実装完了
Unityを実行します。UnityではKey Codeに設定した
Cを押すとCubeがSを押すとSphere作成されます。

KeywordやKey Codeは
かならず、今回と同じでないと動かないわけではなく
別に何を設定しても問題ありません。
自分がわかりやすいものを設定してください。
また、コード内のcube、Shpereの座標も任意で大丈夫です。
実機で動かすとこんな感じ、

hiというとcubeがyaというとsphereが作成されます
ちなみに、いちいち実機にインストールしなくても
HoloLens Emulatorでも確認できます。

実質的に開発者はVoice Commandそのものの実装ではなく
Voice Commandの後に何をしたいかという目的の
コードを書いてアタッチメントし呼び出すだけで良く
コンテンツの作成に注力できるように工夫されています。

なお、Voice Commandは、ISpeechHandlerの
OnSpeechKeywordRecognizedをオーバーライドすることでも実装できますが
今回のような複数のVoice Command場合
Voice Commandとメソッドが一対一になり、分岐処理がなくなり
追加、修正、削除が簡単になるのではと考えています。

2017年2月21日火曜日

HoloLensの開発効率化 を世界一短いコードで検知した空間にPlaneを表示する処理を実装してみる

お疲れ様です。ZuQ9->Nnです

HoloLensの空間検知Spatial Mappingはとても面白いです。
しかし、このメッシュのままだと扱いにくい場合があり、
空間にPlaneのオブジェクトを表示したい時があります。

HoloToolkit-Unityを利用すると、検知した空間から
天井、壁、床を判断し、それにPlaneを作成するコードがすでにあります。
それが、SurfaceMeshesToPlanes.csです。

しかし、このコードをアタッチするだけでは、
Planのオブジェクトを表示してくれず、
開発者がコードを作成する必要があります。

HoloToolkit-Unity > SpatialMapping > Tests > ScriptsのSpatialProcessingTest.cs
Holograms-230-SpatialMapping > Completed > Planetarium > Assets > Scripts> PlaySpaceManager.cs 
が参考になりますが、それなり処理が長く解析や理解に時間がかかります。
そこで、今回は世界一短いコードで実装したいと思います。

コードを示す前に、まず、いつものようにステップバイステップで作成手順を見ていきましょう。
毎回ですが、HoloToolkit-Unityをインストール、プロジェクトの設定を行ってください。

HoloToolkit > SpatialMapping > Prefabs > SpatialMapping.prefabをHierachyにドラッグアンドドロップ

HierachyのSpatialMappingを選択ObjectSurfaceObserverのRoomModelのプロパティに
SRMeshを選択

HierachyのCreateからCreate EmptyでカラのGame Objectを生成

作成されたGame Objectを選択、SurfaceMeshesToPlanes.csをアタッチ

SurfaceMeshesToPlanesのSurfacePlanePrefabをクリックし、SurfacePlaneを選択し、アタッチ
ここで初めてコードを作成します。ProjectのCreateを選択

C#Scriptを選択、スクリプトの名前はPlaneCreatorとします。

PlaneCreatorをクリックしエディタを起動。PlaneCreatorの内容は下記です。

using UnityEngine;
using HoloToolkit.Unity.SpatialMapping;

public class PlaneCreator : MonoBehaviour {
    // Use this for initialization
    void Start () {
         SurfaceMeshesToPlanes.Instance.MakePlanes();
      }
}
HierachyのSurfaceMeshesToPlanesをアタッチした
Game Object を選択Add ComponentでPlaneCreatorをアタッチ

これでUnityを実行すると検知した空間の天井、床、壁にPlaneが表示されます。

開発者が実質記述するのは、なんと
SurfaceMeshesToPlanes.Instance.MakePlanes(); の一行だけです。

勘違いしないで欲しい点は、このコードが正しいのか?という点です。
 SurfaceMeshesToPlanes.Instance.MakePlanes(); は
サンプルのように30秒程度、Scanした後に実行すべきで
おそらくあまり実務では、Start直後に用いないほうが良いかと

今回は、あくまで、コードの理解を早める、
そしてUnity上でぱっと確かめるためという意図をこめ効率化としました。
これによって、壁や天井にオブジェクトを張るのが容易になり
今後の開発がスピードアップできればと考えています。

2017年2月13日月曜日

HoloLensの開発効率化 ノンコーディングで頭の移動に追随するオブジェクトを作成する方法

お疲れ様です。ZuQ9->Nnです。 

HoloToolkit-Unityを利用すれば 
またもノンコーディングで頭の動きに追随して 
移動するオブジェクトが作成できます。 

いつものように、HoloToolkit-Unityをインストール 
プロジェクトとSceneの設定を行います。 

Hierarchyのcreate > 3D Object > CubeでCubeを作成 
Cubeの座標をCameraに移るように移動(今回は x:0 y:0 y:7) 

Cubeを選択しAdd Componetをクリックし 
Tagalong.csを選択してアタッチ

これで完了です。Unityで実行して右クリックで 
頭の位置(Unityではカメラの位置)を移動させると 
Cube追随して動いてくれます。

実機でも動いたのですが何故か動画撮影中だと動かなくなりました。。 
なにか設定が必要なのでしょうか?? 
ちなみにSphereBasedTagalong.csをアタッチしても同じように動きます。 
これは名前から察するにSphere専用なのでしょうか? 
特にSphere以外にアタッチしても問題なく動きました。 
使い分けを勉強するとともにTagalong.csの中身も読み込んだほうがよさげですね。