注意

Mixed Reality Academy チュートリアルでは、HoloLens として設計された (第 1 世代) と混在の現実イマーシブ ヘッドセットに注意してください。The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. そのため、これらのデバイス向けの開発にガイダンスがまだ必要な開発者のための場所でこれらのチュートリアルのままにすることが重要と思われます。As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. これらのチュートリアルは いない 最新のツールセットや相互作用が使用されている HoloLens 2 で更新されます。These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. サポートされているデバイスで作業を続行するが保持されます。They will be maintained to continue working on the supported devices. 一連の新しい HoloLens 2 を開発する方法を示すチュートリアルは、今後投稿があります。There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. この通知が投稿されるときにこれらのチュートリアルへのリンクが更新されます。This notice will be updated with a link to those tutorials when they are posted.


MR と Azure 309:Application insightsMR and Azure 309: Application insights

最終的な製品-開始

このコースではユーザーの行動に関する分析情報を収集する Azure Application Insights API を使用して複合現実のアプリケーションに Application Insights の機能を追加する方法についてはします。In this course, you will learn how to add Application Insights capabilities to a mixed reality application, using the Azure Application Insights API to collect analytics regarding user behavior.

Application Insights は開発者にはアプリケーションから分析情報を収集し、使いやすいポータルから管理できるよう、Microsoft サービスです。Application Insights is a Microsoft service, allowing developers to collect analytics from their applications and manage it from an easy-to-use portal. 分析は、カスタム情報を収集するパフォーマンスから設定を指定できます。The analytics can be anything from performance to custom information you would like to collect. 詳細については、次を参照してください。、 Application Insights のページします。For more information, visit the Application Insights page.

このコースを完了すると、以下を実行できる必要が複合現実イマーシブ ヘッドセット アプリケーションが完成します。Having completed this course, you will have a mixed reality immersive headset application which will be able to do the following:

  1. された様子を確認し、シーン内を移動するユーザーを許可します。Allow the user to gaze and move around a scene.
  2. Analytics への送信をトリガー、 Application Insights サービス、視線の先およびシーン内のオブジェクトの近接度を使用しています。Trigger the sending of analytics to the Application Insights Service, through the use of Gaze and Proximity to in-scene objects.
  3. アプリは、サービスは、過去 24 時間内で、ユーザーが最もに近づくとオブジェクトがされている情報をフェッチ時に呼び出すこともします。The app will also call upon the Service, fetching information about which object has been approached the most by the user, within the last 24 hours. そのオブジェクトには、緑色にその色が変化します。That object will change its color to green.

このコースでは、Unity に基づくサンプル アプリケーションに Application Insights サービスで、結果を取得する方法を説明します。This course will teach you how to get the results from the Application Insights Service, into a Unity-based sample application. 最大をカスタム アプリケーションをビルドしている場合にこれらの概念を適用することがあります。It will be up to you to apply these concepts to a custom application you might be building.

デバイスのサポートDevice support

コースCourse HoloLensHoloLens イマーシブ ヘッドセットImmersive headsets
MR と Azure 309:Application insightsMR and Azure 309: Application insights ✔️✔️ ✔️✔️

注意

このコースが主に Windows Mixed Reality 没入型 (VR) ヘッドセットを重点的に Microsoft HoloLens には、このコースで学習する内容を適用することもできます。While this course primarily focuses on Windows Mixed Reality immersive (VR) headsets, you can also apply what you learn in this course to Microsoft HoloLens. コースを実行するとき、HoloLens をサポートするために必要な場合があります変更でノートが表示されます。As you follow along with the course, you will see notes on any changes you might need to employ to support HoloLens. HoloLens を使用する場合は、音声キャプチャ中にいくつかのエコーが気付きです。When using HoloLens, you may notice some echo during voice capture.

前提条件Prerequisites

注意

このチュートリアルは、Unity を使用した基本的な経験がある開発者向けに設計およびC#します。This tutorial is designed for developers who have basic experience with Unity and C#. また、前提条件やこのドキュメント内の書面の手順を表すテストおよび (2018 年 7 月) の書き込み時に検証されたがどのようなことに注意してください。Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (July 2018). 内に一覧表示するには自由に最新のソフトウェアを使用して、ツールをインストールするにする必要がありますが想定されていなかったことについては、このコースでとまったく同じで記載されているものよりも新しいソフトウェアで表示されますが、記事以下に。You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you will find in newer software than what is listed below.

次のハードウェアとソフトウェアこのコースをお勧めします。We recommend the following hardware and software for this course:

開始前の作業Before you start

このプロジェクトのビルドの問題の発生を避けるため、強くお勧めのルートまたはルート近くフォルダーでこのチュートリアルで説明したようにプロジェクトを作成すること (長いフォルダー パスはビルド時に問題を発生できます)。To avoid encountering issues building this project, it is strongly suggested that you create the project mentioned in this tutorial in a root or near-root folder (long folder paths can cause issues at build-time).

警告

しようとするデータを対応するApplication Insights時間がかかり、患者があるためです。Be aware, data going to Application Insights takes time, so be patient. サービスが、データを受信したかどうかにチェックする場合は、チェック アウト14 章ポータルに移動する方法を説明するされます。If you want to check if the Service has received your data, check out Chapter 14, which will show you how to navigate the portal.

第 1 章 - Azure PortalChapter 1 - The Azure Portal

使用するApplication Insights、作成および構成する必要があります、 Application Insights サービスAzure portal でします。To use Application Insights, you will need to create and configure an Application Insights Service in the Azure portal.

  1. Azure ポータル にログインします。Log in to the Azure Portal.

    注意

    Azure アカウントがいない場合は、1 つを作成する必要があります。If you do not already have an Azure account, you will need to create one. クラスルームまたはラボのような状況では、このチュートリアルをフォローしている場合は、講師または新しいアカウントのセットアップについて proctors のいずれかにお問い合わせください。If you are following this tutorial in a classroom or lab situation, ask your instructor or one of the proctors for help setting up your new account.

  2. ログインした後は、をクリックして新規左上隅にある検索してApplication Insights、 をクリックEnterします。Once you are logged in, click on New in the top left corner, and search for Application Insights, and click Enter.

    注意

    単語新規に置き換えられましたリソースの作成、新しいポータルでします。The word New may have been replaced with Create a resource, in newer portals.

    Azure Portal

  3. 右側に新しいページがの説明を入力、 Azure Application Insightsサービス。The new page to the right will provide a description of the Azure Application Insights Service. このページの左下にある at、作成ボタンは、この関連付けサービスを作成します。At the bottom left of this page, select the Create button, to create an association with this Service.

    Azure Portal

  4. クリックすると作成:Once you have clicked on Create:

    1. 必要な挿入名前このサービス インスタンス。Insert your desired Name for this Service instance.

    2. としてアプリケーションの種類全般します。As Application Type, select General.

    3. 適切な選択サブスクリプションします。Select an appropriate Subscription.

    4. 選択、リソース グループか新規に作成します。Choose a Resource Group or create a new one. リソース グループは、監視、プロビジョニングのアクセスを制御および Azure の資産のコレクションの課金を管理する方法を提供します。A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. 勧めします (例: これらのコース) などの 1 つのプロジェクトに共通のリソース グループの下の Azure サービスに関連付けられているすべて保持する)。It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      詳細にする場合、Azure リソース グループについてのごリソース グループの記事を参照してください。します。If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. 選択、場所します。Select a Location.

    6. また、このサービスに適用される条件を理解したことを確認する必要があります。You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. [作成] を選択します。Select Create.

      Azure Portal

  5. クリックすると作成サービスを作成するを待機する必要があります、これは少し時間がかかる場合があります。Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  6. 通知は、サービス インスタンスが作成されたら、ポータルに表示されます。A notification will appear in the portal once the Service instance is created.

    Azure Portal

  7. 新しいサービス インスタンスを探索する通知をクリックします。Click on the notifications to explore your new Service instance.

    Azure Portal

  8. をクリックして、リソースに移動通知では、新しいサービス インスタンスを表示するボタンをクリックします。Click the Go to resource button in the notification to explore your new Service instance. 実施する、新しいApplication Insights サービスインスタンス。You will be taken to your new Application Insights Service instance.

    Azure Portal

    注意

    この web ページを開いたままにして簡単にアクセスでき、ここに戻り、収集されたデータを表示するには、多くの場合。Keep this web page open and easy to access, you will come back here often to see the data collected.

    重要

    Application Insights を実装するには次の 3 つ (3) 特定値を使用する必要があります。インストルメンテーション キーアプリケーション ID、およびAPI キーします。To implement Application Insights, you will need to use three (3) specific values: Instrumentation Key, Application ID, and API Key. 次のとおり、サービスからこれらの値を取得する方法が表示されます。Below you will see how to retrieve these values from your Service. 空白でこれらの値をメモしておきますメモ帳ページのコードですぐに使用するがあるためです。Make sure to note these values on a blank Notepad page, because you will use them soon in your code.

  9. 検索する、インストルメンテーション キー、サービスの機能の一覧を下までスクロールし、をクリックする必要がありますプロパティ、表示されるタブが表示されます、サービス キーします。To find the Instrumentation Key, you will need to scroll down the list of Service functions, and click on Properties, the tab displayed will reveal the Service Key.

    Azure Portal

  10. 少し下プロパティ、検索はAPI アクセス、 をクリックする必要があります。A little below Properties, you will find API Access, which you need to click. 右側にパネルを提供、アプリケーション IDアプリの。The panel to the right will provide the Application ID of your app.

    Azure Portal

  11. アプリケーション IDパネル をクリックしますAPI キーの作成、これが表示されます、 API キーの作成パネル。With the Application ID panel still open, click Create API Key, which will open the Create API key panel.

    Azure Portal

  12. ここで開く内API キーの作成パネルで、説明を入力および3 つのボックスをオンにWithin the now open Create API key panel, type a description, and tick the three boxes.

  13. クリックしてキー生成します。Click Generate Key. API キーが作成され、表示されます。Your API Key will be created and displayed.

    Azure Portal

    警告

    これは、唯一の時間、サービス キーが表示されます、ようにして今すぐそのコピーを作成します。This is the only time your Service Key will be displayed, so ensure you make a copy of it now.

第 2 章 - Unity プロジェクトの設定Chapter 2 - Set up the Unity project

次のコード例が複合現実での開発の一般的な設定して、そのため、他のプロジェクトの適切なテンプレートには。The following is a typical set up for developing with the mixed reality, and as such, is a good template for other projects.

  1. 開いているUnityクリック新規します。Open Unity and click New.

    Unity プロジェクトを設定します。

  2. Unity プロジェクト名を指定する必要がありますこれで挿入MR_Azure_アプリケーション_Insightsします。You will now need to provide a Unity Project name, insert MR_Azure_Application_Insights. 必ず、テンプレートに設定されている3Dします。Make sure the Template is set to 3D. 設定、場所に該当する別の場所 (ただし、ルート ディレクトリに近づけるためのより良い)。Set the Location to somewhere appropriate for you (remember, closer to root directories is better). をクリックし、プロジェクトの作成です。Then, click Create project.

    Unity プロジェクトを設定します。

  3. 既定値を確認する必要が開いている Unity、スクリプト エディターに設定されているVisual Studioします。With Unity open, it is worth checking the default Script Editor is set to Visual Studio. 移動して編集>設定し、新しいウィンドウに移動外部ツールします。Go to Edit > Preferences and then from the new window, navigate to External Tools. 変更External Script EditorVisual Studio 2017します。Change External Script Editor to Visual Studio 2017. 閉じる、設定ウィンドウ。Close the Preferences window.

    Unity プロジェクトを設定します。

  4. 次に移動ファイル>Build Settingsにプラットフォームを切り替えるとユニバーサル Windows プラットフォーム、 をクリックして、プラットフォームの切り替えボタンをクリックします。Next, go to File > Build Settings and switch the platform to Universal Windows Platform, by clicking on the Switch Platform button.

    Unity プロジェクトを設定します。

  5. 移動してファイル>Build Settingsことを確認してください。Go to File > Build Settings and make sure that:

    1. デバイスを対象にに設定されている任意のデバイスTarget Device is set to Any device

      Microsoft HoloLens、設定ターゲット デバイスHoloLensします。For the Microsoft HoloLens, set Target Device to HoloLens.

    2. ビルドの種類に設定されているD3DBuild Type is set to D3D

    3. SDKに設定されているインストールされている最新SDK is set to Latest installed

    4. ビルドおよび実行に設定されているローカル マシンBuild and Run is set to Local Machine

    5. シーンを保存し、ビルドに追加します。Save the scene and add it to the build.

      1. これには、選択開くシーンを追加します。Do this by selecting Add Open Scenes. 保存ウィンドウが表示されます。A save window will appear.

        Unity プロジェクトを設定します。

      2. 任意の将来のシーンとこれには、新しいフォルダーを作成し、をクリックして、新しいフォルダーボタンは、新しいフォルダーを作成する名前を付けますシーンします。Create a new folder for this, and any future scene, then click the New folder button, to create a new folder, name it Scenes.

        Unity プロジェクトを設定します。

      3. 新たに作成した開くシーンフォルダー、し、ファイル名: テキスト フィールドに「 ApplicationInsightsScene、順にクリックしますを保存.Open your newly created Scenes folder, and then in the File name: text field, type ApplicationInsightsScene, then click Save.

        Unity プロジェクトを設定します。

  6. 設定に残っているBuild Settings、ここでは既定値として残しておく必要があります。The remaining settings, in Build Settings, should be left as default for now.

  7. Build Settingsウィンドウのプレーヤー設定ボタン、領域に関連するパネルが開き、インスペクターが配置されています。In the Build Settings window, click on the Player Settings button, this will open the related panel in the space where the Inspector is located.

    Unity プロジェクトを設定します。

  8. このパネルは、いくつかの設定を確認する必要があります。In this panel, a few settings need to be verified:

    1. その他の設定 タブ。In the Other Settings tab:

      1. Scripting ランタイム バージョンする必要があります試験的 (.NET 4.6 Equivalent) エディターを再起動する必要があるします。Scripting Runtime Version should be Experimental (.NET 4.6 Equivalent), which will trigger a need to restart the Editor.

      2. バックエンドの scriptingべき .NETScripting Backend should be .NET

      3. API の互換性レベルべき .NET 4.6API Compatibility Level should be .NET 4.6

      Unity プロジェクトを設定します。

    2. 内で、発行の設定] タブの [機能、確認してください。Within the Publishing Settings tab, under Capabilities, check:

      • InternetClientInternetClient

        Unity プロジェクトを設定します。

    3. パネル、下の方にXR 設定(次に示します発行の設定)、ティック仮想現実サポート、ことを確認、 Windows Mixed RealitySDKが追加されます。Further down the panel, in XR Settings (found below Publishing Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Unity プロジェクトを設定します。

  9. 戻りBuild SettingsUnity C#プロジェクトが不要になったグレー; これの横にあるチェック ボックスをオンにします。Back in Build Settings, Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  10. ビルド設定ウィンドウを閉じます。Close the Build Settings window.

  11. シーンとプロジェクトを保存 (ファイル > シーン保存/ファイル > プロジェクトを保存)。Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

第 3 章 - Unity パッケージのインポートChapter 3 - Import the Unity package

重要

スキップする場合、 Unity を設定するコンポーネントのこのコースで、コードにまっすぐコンティニュし、自由にこれをダウンロード309.unitypackage MR-Azure の、としてプロジェクトにインポート、 カスタム パッケージします。If you wish to skip the Unity Set up components of this course, and continue straight into code, feel free to download this Azure-MR-309.unitypackage, import it into your project as a Custom Package. [次へ] の章から Dll が含まれます。This will also contain the DLLs from the next Chapter. インポートの後から引き続き第 6 章します。After import, continue from Chapter 6.

重要

Unity 内での Application Insights を使用するには、DLL を Newtonsoft DLL と共にインポートする必要があります。To use Application Insights within Unity, you need to import the DLL for it, along with the Newtonsoft DLL. インポート後に再構成するプラグインを必要とする Unity での既知の問題は現在します。There is currently a known issue in Unity which requires plugins to be reconfigured after import. バグが解決された後、次の手順 (このセクションでは 4 ~ 7) は必要に不要になった。These steps (4 - 7 in this section) will no longer be required after the bug has been resolved.

独自のプロジェクトに Application Insights をインポートするには、必ず確保ダウンロード、'.unitypackage'、プラグインを含むします。To import Application Insights into your own project, make sure you have downloaded the '.unitypackage', containing the plugins. 次に、次の操作を行います。Then, do the following:

  1. 追加、 .unitypackageに Unity を使用して、資産>パッケージのインポート>カスタム パッケージメニュー オプション。Add the .unitypackage to Unity by using the Assets > Import Package > Custom Package menu option.

  2. Unity パッケージのインポートその pop をボックスで、(およびなど)、すべてのことを確認プラグインが選択されています。In the Import Unity Package box that pops up, ensure everything under (and including) Plugins is selected.

    Unity パッケージをインポートします。

  3. をクリックして、インポートをプロジェクトにアイテムを追加するボタンをクリックします。Click the Import button, to add the items to your project.

  4. 移動して、 Insightsの下のフォルダープラグインプロジェクトを表示し、次のプラグインを選択のみ:Go to the Insights folder under Plugins in the Project view and select the following plugins only:

    • Microsoft.ApplicationInsightsMicrosoft.ApplicationInsights

    Unity パッケージをインポートします。

  5. このプラグインように選択すると、 Any プラットフォームunchecked、ことを確認しますWSAPlayerunchecked、 をクリックし、適用します。With this plugin selected, ensure that Any Platform is unchecked, then ensure that WSAPlayer is also unchecked, then click Apply. これは、ファイルが正しく構成されていることを確認するだけです。Doing this is just to confirm that the files are configured correctly.

    Unity パッケージをインポートします。

    注意

    このようなプラグインをマークするには、Unity エディターでのみ使用することを構成します。Marking the plugins like this, configures them to only be used in the Unity Editor. Dll プロジェクトは Unity からエクスポートした後に使用される、WSA フォルダー内のさまざまなセットがあります。There are a different set of DLLs in the WSA folder which will be used after the project is exported from Unity.

  6. 次を開く必要があります、 WSAフォルダー内で、 Insightsフォルダー。Next, you need to open the WSA folder, within the Insights folder. 構成した同じファイルのコピーが表示されます。You will see a copy of the same file you just configured. このファイルを選択し、インスペクターのことを確認しますAny プラットフォームunchecked、ことを確認しますのみ WSAPlayer は、チェックします。Select this file, and then in the inspector, ensure that Any Platform is unchecked, then ensure that only WSAPlayer is checked. [適用] をクリックします。Click Apply.

    Unity パッケージをインポートします。

  7. 次のようになりましたが必要手順 4 ~ 6が、 Newtonsoftプラグイン代わりにします。You will now need to follow steps 4-6, but for the Newtonsoft plugins instead. 参照してください、次のスクリーン ショットのように、結果がなります。See the below screenshot for what the outcome should look like.

    Unity パッケージをインポートします。

第 4 章 - を設定すると、カメラとユーザー コントロールChapter 4 - Set up the camera and user controls

この章では、ユーザーを表示し、シーン内を移動できるように、カメラとコントロールを設定します。In this Chapter you will set up the camera and the controls to allow the user to see and move in the scene.

  1. 階層 パネルで、空の領域で右クリックして作成 > 空します。Right-click in an empty area in the Hierarchy Panel, then on Create > Empty.

    カメラとユーザー コントロールを設定します。

  2. 新しい空の GameObject に名前を変更カメラ親します。Rename the new empty GameObject to Camera Parent.

    カメラとユーザー コントロールを設定します。

  3. [階層] パネルで空の領域で右クリックし3D オブジェクト、次にします。Right-click in an empty area in the Hierarchy Panel, then on 3D Object, then on Sphere.

  4. 球体の名前を変更右側します。Rename the Sphere to Right Hand.

  5. 設定、スケールを変換を右側の0.1、0.1、0.1Set the Transform Scale of the Right Hand to 0.1, 0.1, 0.1

    カメラとユーザー コントロールを設定します。

  6. 削除、球 Colliderコンポーネント をクリックして右側から、歯車で、球 Colliderコンポーネント、しコンポーネントの削除.Remove the Sphere Collider component from the Right Hand by clicking on the Gear in the Sphere Collider component, and then Remove Component.

    カメラとユーザー コントロールを設定します。

  7. 階層パネル ドラッグで、 Main Camera右側オブジェクトをカメラ親オブジェクト。In the Hierarchy Panel drag the Main Camera and the Right Hand objects onto the Camera Parent object.

    カメラとユーザー コントロールを設定します。

  8. 設定、変換位置両方のMain Camera右側オブジェクトを0, 0, 0します。Set the Transform Position of both the Main Camera and the Right Hand object to 0, 0, 0.

    カメラとユーザー コントロールを設定します。

    カメラとユーザー コントロールを設定します。

第 5 章 - Unity シーン内のオブジェクトを設定Chapter 5 - Set up the objects in the Unity scene

ここでは、ユーザーが操作できる、シーンのいくつかの基本的な図形を作成します。You will now create some basic shapes for your scene, with which the user can interact.

  1. 空の領域で右クリックし、階層パネル、次に3D オブジェクトを選択し、平面します。Right-click in an empty area in the Hierarchy Panel, then on 3D Object, then select Plane.

  2. 平面を設定位置を変換0、-1、0します。Set the Plane Transform Position to 0, -1, 0.

  3. 平面を設定スケールを変換5, 1, 5します。Set the Plane Transform Scale to 5, 1, 5.

    Unity シーン内のオブジェクトを設定します。

  4. 使用する基本的な素材を作成、平面オブジェクト、その他の図形がわかりやすくなるようにします。Create a basic material to use with your Plane object, so that the other shapes are easier to see. 移動、プロジェクト パネル、右クリックし、作成、その後にフォルダー、新しいフォルダーを作成します。Navigate to your Project Panel, right-click, then Create, followed by Folder, to create a new folder. 名前を付けます資料します。Name it Materials.

    Unity シーン内のオブジェクトを設定します。 Unity シーン内のオブジェクトを設定します。

  5. 開く、資料フォルダー、し、右クリックし、 をクリックします作成、しマテリアル、新しい素材を作成します。Open the Materials folder, then right-click, click Create, then Material, to create a new material. 名前を付けます青いします。Name it Blue.

    Unity シーン内のオブジェクトを設定します。 Unity シーン内のオブジェクトを設定します。

  6. 新しい素材を選択すると、参照で、インスペクター、と共に四角形のウィンドウをクリックします。 Albedoします。With the new Blue material selected, look at the Inspector, and click the rectangular window alongside Albedo. 青の色を選択します (次の 1 つの図は、 16 進数の色。#3592FFFF)。Select a blue color (the one picture below is Hex Color: #3592FFFF). 選択した後は、閉じるボタンをクリックします。Click the close button once you have chosen.

    Unity シーン内のオブジェクトを設定します。

  7. 新しいマテリアルをドラッグして、資料フォルダー、新たに作成した平面、シーン内で (またはの上にドロップ、平面オブジェクト内、 階層)。Drag your new material from the Materials folder, onto your newly created Plane, within your scene (or drop it on the Plane object within the Hierarchy).

    Unity シーン内のオブジェクトを設定します。

  8. 空の領域で右クリックし、階層パネル、次に3 D オブジェクト、Capsuleします。Right-click in an empty area in the Hierarchy Panel, then on 3D Object, Capsule.

    • Capsule変更選択すると、その*変換***位置を: -10, 1, 0します。With the Capsule selected, change its Transform Position to: -10, 1, 0.
  9. 空の領域で右クリックし、階層パネル、次に3 D オブジェクト、Cubeします。Right-click in an empty area in the Hierarchy Panel, then on 3D Object, Cube.

    • キューブ変更選択すると、その**変換**位置に。**0, 0, 10**.With the Cube selected, change its Transform Position to: 0, 0, 10.
  10. 空の領域で右クリックし、階層パネル、次に3 D オブジェクト、球体します。Right-click in an empty area in the Hierarchy Panel, then on 3D Object, Sphere.

    • 変更選択すると、その**変換**位置に。**10, 0, 0**.With the Sphere selected, change its Transform Position to: 10, 0, 0.

    Unity シーン内のオブジェクトを設定します。

    注意

    これら位置値は提案します。These Position values are suggestions. 自由にカメラから遠すぎてオブジェクト間の距離がない場合は、アプリケーションのユーザーを簡単に好きなに、オブジェクトの位置を設定できます。You are free to set the positions of the objects to whatever you would like, though it is easier for the user of the application if the objects distances are not too far from the camera.

  11. アプリケーションが実行されている場合、これを実現するために、シーン内のオブジェクトを識別するためにできるようにする必要がある、タグ付けする必要があります。When your application is running, it needs to be able to identify the objects within the scene, to achieve this, they need to be tagged. 選択して、オブジェクトの 1 つ、インスペクターパネルで、をクリックしてタグを追加しています. 、スワップされますが、インスペクターで、タグし、レイヤーパネル。Select one of the objects, and in the Inspector panel, click Add Tag..., which will swap the Inspector with the Tags & Layers panel.

    Unity シーン内のオブジェクトを設定します。 Set up the objects in the Unity Scene

  12. をクリックして、 + (正符号 +) 記号、としてタグの名前を入力ObjectInSceneします。Click the + (plus) symbol, then type the tag name as ObjectInScene.

    Unity シーン内のオブジェクトを設定します。

    警告

    別の名前、タグを使用する場合もこの変更が行われたことを確認する必要があります、 DataFromAnalyticsObjectTrigger、と視線、後で、スクリプトを、。オブジェクトが検出され、検出されると、シーン内で。If you use a different name for your tag, you will need to ensure this change is also made the DataFromAnalytics, ObjectTrigger, and Gaze, scripts later, so that your objects are found, and detected, within your scene.

  13. 作成したタグを 3 つのオブジェクトのすべてに適用する必要があります。With the tag created, you now need to apply it to all three of your objects. 階層、保持、 Shiftキーをクリック、 Capsuleキューブ、および、オブジェクトは、次に、インスペクター、と共にドロップダウン メニューをクリックします。タグ、順にクリックします、 ObjectInSceneタグを作成します。From the Hierarchy, hold the Shift key, then click the Capsule, Cube, and Sphere, objects, then in the Inspector, click the dropdown menu alongside Tag, then click the ObjectInScene tag you created.

    Unity シーン内のオブジェクトを設定します。 Set up the objects in the Unity Scene

第 6 章 - ApplicationInsightsTracker クラスを作成します。Chapter 6 - Create the ApplicationInsightsTracker class

最初のスクリプトを作成する必要があるはApplicationInsightsTrackerは責任を負います。The first script you need to create is ApplicationInsightsTracker, which is responsible for:

  1. Azure Application Insights に送信するためのユーザー操作に基づいてイベントを作成します。Creating events based on user interactions to submit to Azure Application Insights.

  2. ユーザーの操作に応じて、適切なイベント名を作成します。Creating appropriate Event names, depending on user interaction.

  3. Application Insights サービスのインスタンスにイベントを送信しています。Submitting events to the Application Insights Service instance.

このクラスを作成します。To create this class:

  1. 右クリックし、プロジェクト パネル、し作成 > フォルダーします。Right-click in the Project Panel, then Create > Folder. フォルダーの名前スクリプトします。Name the folder Scripts.

    ApplicationInsightsTracker クラスを作成します。 ApplicationInsightsTracker クラスを作成します。

  2. スクリプトフォルダーが作成されると、ダブルクリックして、開きます。With the Scripts folder created, double-click it, to open. その後、そのフォルダー内で右クリックし、作成 > C#スクリプトします。Then, within that folder, right-click, Create > C# Script. スクリプトの名前ApplicationInsightsTrackerします。Name the script ApplicationInsightsTracker.

  3. ダブルクリックして、新しいApplicationInsightsTrackerスクリプト ファイルを開くVisual Studioします。Double-click on the new ApplicationInsightsTracker script to open it with Visual Studio.

  4. 更新するスクリプトの上部にある名前空間以下のとおり。Update namespaces at the top of the script to be as below:

        using Microsoft.ApplicationInsights;
        using Microsoft.ApplicationInsights.DataContracts;
        using Microsoft.ApplicationInsights.Extensibility;
        using UnityEngine;
    
  5. クラス内には、次の変数を挿入します。Inside the class insert the following variables:

        /// <summary>
        /// Allows this class to behavior like a singleton
        /// </summary>
        public static ApplicationInsightsTracker Instance;
    
        /// <summary>
        /// Insert your Instrumentation Key here
        /// </summary>
        internal string instrumentationKey = "Insert Instrumentation Key here";
    
        /// <summary>
        /// Insert your Application Id here
        /// </summary>
        internal string applicationId = "Insert Application Id here";
    
        /// <summary>
        /// Insert your API Key here
        /// </summary>
        internal string API_Key = "Insert API Key here";
    
        /// <summary>
        /// Represent the Analytic Custom Event object
        /// </summary>
        private TelemetryClient telemetryClient;
    
        /// <summary>
        /// Represent the Analytic object able to host gaze duration
        /// </summary>
        private MetricTelemetry metric;
    

    注意

    設定、 instrumentationKey、applicationId および API_Keyを使用して、適切な値、サービス キーで説明したように、Azure Portal から第 1 章手順 9以降。Set the instrumentationKey, applicationId and API_Key values appropriately, using the Service Keys from the Azure Portal as mentioned in Chapter 1, step 9 onwards.

  6. 追加し、 Start()Awake() メソッドで、クラスを初期化するときに呼び出されます。Then add the Start() and Awake() methods, which will be called when the class initializes:

        /// <summary>
        /// Sets this class instance as a singleton
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {
            // Instantiate telemetry and metric
            telemetryClient = new TelemetryClient();
    
            metric = new MetricTelemetry();
    
            // Assign the Instrumentation Key to the Event and Metric objects
            TelemetryConfiguration.Active.InstrumentationKey = instrumentationKey;
    
            telemetryClient.InstrumentationKey = instrumentationKey;
        }
    
  7. イベントと、アプリケーションで登録されているメトリックの送信を行うメソッドを追加します。Add the methods responsible for sending the events and metrics registered by your application:

        /// <summary>
        /// Submit the Event to Azure Analytics using the event trigger object
        /// </summary>
        public void RecordProximityEvent(string objectName)
        {
            telemetryClient.TrackEvent(CreateEventName(objectName));
        }
    
        /// <summary>
        /// Uses the name of the object involved in the event to create 
        /// and return an Event Name convention
        /// </summary>
        public string CreateEventName(string name)
        {
            string eventName = $"User near {name}";
            return eventName;
        }
    
        /// <summary>
        /// Submit a Metric to Azure Analytics using the metric gazed object
        /// and the time count of the gaze
        /// </summary>
        public void RecordGazeMetrics(string objectName, int time)
        {
            // Output Console information about gaze.
            Debug.Log($"Finished gazing at {objectName}, which went for <b>{time}</b> second{(time != 1 ? "s" : "")}");
    
            metric.Name = $"Gazed {objectName}";
    
            metric.Value = time;
    
            telemetryClient.TrackMetric(metric);
        }
    
  8. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

Chapter 7 - 視線入力スクリプトを作成します。Chapter 7 - Create the Gaze script

次のスクリプトを作成するには、視線スクリプト。The next script to create is the Gaze script. このスクリプトは作成を担当する、 Raycastからフォワード投影は、 Main Cameraユーザーが見るオブジェクトを検出します。This script is responsible for creating a Raycast that will be projected forward from the Main Camera, to detect which object the user is looking at. ここで、 Raycastを持つオブジェクトで、ユーザーが探している場合を識別する必要があります、 ObjectInScene 、タグを付けるし、ユーザーはどのくらいの時間をカウントし、 gazesでそのオブジェクト。In this case, the Raycast will need to identify if the user is looking at an object with the ObjectInScene tag, and then count how long the user gazes at that object.

  1. ダブルクリックして、スクリプトフォルダーを開きます。Double-click on the Scripts folder, to open it.

  2. 内側を右クリックし、スクリプトフォルダー、をクリックして作成 > C#スクリプトRight-click inside the Scripts folder, click Create > C# Script. スクリプトの名前視線します。Name the script Gaze.

  3. Visual Studio で開くことをスクリプトをダブルクリックします。Double-click on the script to open it with Visual Studio.

  4. 次のように、既存のコードに置き換えます。Replace the existing code with the following:

        using UnityEngine;
    
        public class Gaze : MonoBehaviour
        {
            /// <summary>
            /// Provides Singleton-like behavior to this class.
            /// </summary>
            public static Gaze Instance;
    
            /// <summary>
            /// Provides a reference to the object the user is currently looking at.
            /// </summary>
            public GameObject FocusedGameObject { get; private set; }
    
            /// <summary>
            /// Provides whether an object has been successfully hit by the raycast.
            /// </summary>
            public bool Hit { get; private set; }
    
            /// <summary>
            /// Provides a reference to compare whether the user is still looking at 
            /// the same object (and has not looked away).
            /// </summary>
            private GameObject _oldFocusedObject = null;
    
            /// <summary>
            /// Max Ray Distance
            /// </summary>
            private float _gazeMaxDistance = 300;
    
            /// <summary>
            /// Max Ray Distance
            /// </summary>
            private float _gazeTimeCounter = 0;
    
            /// <summary>
            /// The cursor object will be created when the app is running,
            /// this will store its values. 
            /// </summary>
            private GameObject _cursor;
        }
    
  5. コードをAwake()Start() 今すぐメソッドを追加する必要があります。Code for the Awake() and Start() methods now needs to be added.

        private void Awake()
        {
            // Set this class to behave similar to singleton
            Instance = this;
            _cursor = CreateCursor();
        }
    
        void Start()
        {
            FocusedGameObject = null;
        }
    
        /// <summary>
        /// Create a cursor object, to provide what the user
        /// is looking at.
        /// </summary>
        /// <returns></returns>
        private GameObject CreateCursor()    
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
    
            // Remove the collider, so it does not block raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
    
            newCursor.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    
            newCursor.GetComponent<MeshRenderer>().material.color = 
            Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
    
            newCursor.SetActive(false);
            return newCursor;
        }
    
  6. 内で、視線クラスで、次のコードを追加、 Update() プロジェクトにメソッドをRaycastターゲット ヒットの検出と。Inside the Gaze class, add the following code in the Update() method to project a Raycast and detect the target hit:

        /// <summary>
        /// Called every frame
        /// </summary>
        void Update()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedGameObject;
    
            RaycastHit hitInfo;
    
            // Initialize Raycasting.
            Hit = Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, _gazeMaxDistance);
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedGameObject = hitInfo.collider.gameObject;
    
                    // Lerp the cursor to the hit point, which helps to stabilize the gaze.
                    _cursor.transform.position = Vector3.Lerp(_cursor.transform.position, hitInfo.point, 0.6f);
    
                    _cursor.SetActive(true);
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedGameObject = null;
    
                    _cursor.SetActive(false);
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedGameObject = null;
    
                _cursor.SetActive(false);
            }
    
            // Check whether the previous focused object is this same object. If so, reset the focused object.
            if (FocusedGameObject != _oldFocusedObject)
            {
                ResetFocusedObject();
            }
            // If they are the same, but are null, reset the counter. 
            else if (FocusedGameObject == null && _oldFocusedObject == null)
            {
                _gazeTimeCounter = 0;
            }
            // Count whilst the user continues looking at the same object.
            else
            {
                _gazeTimeCounter += Time.deltaTime;
            }
        }
    
  7. 追加、 ResetFocusedObject() メソッドは、データを送信するApplication Insightsオブジェクトで、ユーザーが検索する場合。Add the ResetFocusedObject() method, to send data to Application Insights when the user has looked at an object.

        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        public void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                // Only looking for objects with the correct tag.
                if (_oldFocusedObject.CompareTag("ObjectInScene"))
                {
                    // Turn the timer into an int, and ensure that more than zero time has passed.
                    int gazeAsInt = (int)_gazeTimeCounter;
    
                    if (gazeAsInt > 0)
                    {
                        //Record the object gazed and duration of gaze for Analytics
                        ApplicationInsightsTracker.Instance.RecordGazeMetrics(_oldFocusedObject.name, gazeAsInt);
                    }
                    //Reset timer
                    _gazeTimeCounter = 0;
                }
            }
        }
    
  8. 完了したので、視線スクリプト。You have now completed the Gaze script. 変更を保存Visual Studioに戻る前にUnityします。Save your changes in Visual Studio before returning to Unity.

8 - 章 ObjectTrigger クラスを作成します。Chapter 8 - Create the ObjectTrigger class

次のスクリプトを作成する必要があるはObjectTriggerは責任を負います。The next script you need to create is ObjectTrigger, which is responsible for:

  • メイン カメラの衝突の必要なコンポーネントを追加します。Adding components needed for collision to the Main Camera.
  • カメラが近くとしてタグ付けされたオブジェクトがかどうかを検出するObjectInSceneします。Detecting if the camera is near an object tagged as ObjectInScene.

スクリプトを作成します。To create the script:

  1. ダブルクリックして、スクリプトフォルダーを開きます。Double-click on the Scripts folder, to open it.

  2. 内側を右クリックし、スクリプトフォルダー、をクリックして作成 C# > スクリプトRight-click inside the Scripts folder, click Create C# > Script. スクリプトの名前ObjectTriggerします。Name the script ObjectTrigger.

  3. Visual Studio で開くことをスクリプトをダブルクリックします。Double-click on the script to open it with Visual Studio. 次のように、既存のコードに置き換えます。Replace the existing code with the following:

        using UnityEngine;
    
        public class ObjectTrigger : MonoBehaviour
        {
            private void Start()
            {
                // Add the Collider and Rigidbody components, 
                // and set their respective settings. This allows for collision.
                gameObject.AddComponent<SphereCollider>().radius = 1.5f;
    
                gameObject.AddComponent<Rigidbody>().useGravity = false;
            }
    
            /// <summary>
            /// Triggered when an object with a collider enters this objects trigger collider.
            /// </summary>
            /// <param name="collision">Collided object</param>
            private void OnCollisionEnter(Collision collision)
            {
                CompareTriggerEvent(collision, true);
            }
    
            /// <summary>
            /// Triggered when an object with a collider exits this objects trigger collider.
            /// </summary>
            /// <param name="collision">Collided object</param>
            private void OnCollisionExit(Collision collision)
            {
                CompareTriggerEvent(collision, false);
            }
    
            /// <summary>
            /// Method for providing debug message, and sending event information to InsightsTracker.
            /// </summary>
            /// <param name="other">Collided object</param>
            /// <param name="enter">Enter = true, Exit = False</param>
            private void CompareTriggerEvent(Collision other, bool enter)
            {
                if (other.collider.CompareTag("ObjectInScene"))
                {
                    string message = $"User is{(enter == true ? " " : " no longer ")}near <b>{other.gameObject.name}</b>";
    
                    if (enter == true)
                    {
                        ApplicationInsightsTracker.Instance.RecordProximityEvent(other.gameObject.name);
                    }
                    Debug.Log(message);
                }
            }
        }
    
  4. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

9 - 章 DataFromAnalytics クラスを作成します。Chapter 9 - Create the DataFromAnalytics class

作成する必要がありますこれで、 DataFromAnalyticsを担当するスクリプト。You will now need to create the DataFromAnalytics script, which is responsible for:

  • どのオブジェクトがされてに近づくと、カメラで最も analytics データをフェッチしています。Fetching analytics data about which object has been approached by the camera the most.
  • 使用して、サービス キー、Azure Application Insights のサービス インスタンスと通信できるようにします。Using the Service Keys, that allow communication with your Azure Application Insights Service instance.
  • シーン内のオブジェクトを並べ替え、これに基づいてが最上位のイベント数。Sorting the objects in scene, according to which has the highest event count.
  • 最も approached のオブジェクトのマテリアルの色を変更する緑色します。Changing the material color, of the most approached object, to green.

スクリプトを作成します。To create the script:

  1. ダブルクリックして、スクリプトフォルダーを開きます。Double-click on the Scripts folder, to open it.

  2. 内側を右クリックし、スクリプトフォルダー、をクリックして作成 C# > スクリプトRight-click inside the Scripts folder, click Create C# > Script. スクリプトの名前DataFromAnalyticsします。Name the script DataFromAnalytics.

  3. Visual Studio で開くことをスクリプトをダブルクリックします。Double-click on the script to open it with Visual Studio.

  4. 次の名前空間を挿入します。Insert the following namespaces:

        using Newtonsoft.Json;
        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. スクリプト内で、次のように挿入します。Inside the script, insert the following:

        /// <summary>
        /// Number of most recent events to be queried
        /// </summary>
        private int _quantityOfEventsQueried = 10;
    
        /// <summary>
        /// The timespan with which to query. Needs to be in hours.
        /// </summary>
        private int _timepspanAsHours = 24;
    
        /// <summary>
        /// A list of the objects in the scene
        /// </summary>
        private List<GameObject> _listOfGameObjectsInScene;
    
        /// <summary>
        /// Number of queries which have returned, after being sent.
        /// </summary>
        private int _queriesReturned = 0;
    
        /// <summary>
        /// List of GameObjects, as the Key, with their event count, as the Value.
        /// </summary>
        private List<KeyValuePair<GameObject, int>> _pairedObjectsWithEventCount = new List<KeyValuePair<GameObject, int>>();
    
        // Use this for initialization
        void Start()
        {
            // Find all objects in scene which have the ObjectInScene tag (as there may be other GameObjects in the scene which you do not want).
            _listOfGameObjectsInScene = GameObject.FindGameObjectsWithTag("ObjectInScene").ToList();
    
            FetchAnalytics();
        }
    
  6. 内で、 DataFromAnalyticsクラス、直後、 Start() メソッドと呼ばれる次のメソッドを追加FetchAnalytics() します。Within the DataFromAnalytics class, right after the Start() method, add the following method called FetchAnalytics(). このメソッドは、キー値のペアのリストに追加、 GameObjectとプレース ホルダーのイベントのカウント数。This method is responsible for populating the list of key value pairs, with a GameObject and a placeholder event count number. 初期化し、 GetWebRequest() コルーチンします。It then initializes the GetWebRequest() coroutine. クエリ構造への呼び出しのApplication Insightsこのメソッド内で見つかんだことができますも、として、クエリ URLエンドポイント。The query structure of the call to Application Insights can be found within this method also, as the Query URL endpoint.

        private void FetchAnalytics()
        {
            // Iterate through the objects in the list
            for (int i = 0; i < _listOfGameObjectsInScene.Count; i++)
            {
                // The current event number is not known, so set it to zero.
                int eventCount = 0;
    
                // Add new pair to list, as placeholder, until eventCount is known.
                _pairedObjectsWithEventCount.Add(new KeyValuePair<GameObject, int>(_listOfGameObjectsInScene[i], eventCount));
    
                // Set the renderer of the object to the default color, white
                _listOfGameObjectsInScene[i].GetComponent<Renderer>().material.color = Color.white;
    
                // Create the appropriate object name using Insights structure
                string objectName = _listOfGameObjectsInScene[i].name;
    
                // Build the queryUrl for this object.
                string queryUrl = Uri.EscapeUriString(string.Format(
                    "https://api.applicationinsights.io/v1/apps/{0}/events/$all?timespan=PT{1}H&$search={2}&$select=customMetric/name&$top={3}&$count=true",
                    ApplicationInsightsTracker.Instance.applicationId, _timepspanAsHours, "Gazed " + objectName, _quantityOfEventsQueried));
    
    
                // Send this object away within the WebRequest Coroutine, to determine it is event count.
                StartCoroutine("GetWebRequest", new KeyValuePair<string, int>(queryUrl, i));
            }
        }
    
  7. すぐ下、 FetchAnalytics() メソッドというメソッドを追加GetWebRequest() 、返された、 IEnumeratorします。Right below the FetchAnalytics() method, add a method called GetWebRequest(), which returns an IEnumerator. このメソッドは、特定の対応するイベントを発生回数の合計を要求する責任を負いますGameObjectが内で呼び出されたApplication Insightsします。This method is responsible for requesting the number of times an event, corresponding with a specific GameObject, has been called within Application Insights. 送信されたすべてのクエリが返されるときに、 DetermineWinner() メソッドが呼び出されます。When all the sent queries have returned, the DetermineWinner() method is called.

        /// <summary>
        /// Requests the data count for number of events, according to the
        /// input query URL.
        /// </summary>
        /// <param name="webQueryPair">Query URL and the list number count.</param>
        /// <returns></returns>
        private IEnumerator GetWebRequest(KeyValuePair<string, int> webQueryPair)
        {
            // Set the URL and count as their own variables (for readibility).
            string url = webQueryPair.Key;
            int currentCount = webQueryPair.Value;
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(url))
            {
                DownloadHandlerBuffer handlerBuffer = new DownloadHandlerBuffer();
    
                unityWebRequest.downloadHandler = handlerBuffer;
    
                unityWebRequest.SetRequestHeader("host", "api.applicationinsights.io");
    
                unityWebRequest.SetRequestHeader("x-api-key", ApplicationInsightsTracker.Instance.API_Key);
    
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError)
                {
                    // Failure with web request.
                    Debug.Log("<color=red>Error Sending:</color> " + unityWebRequest.error);
                }
                else
                {
                    // This query has returned, so add to the current count.
                    _queriesReturned++;
    
                    // Initialize event count integer.
                    int eventCount = 0;
    
                    // Deserialize the response with the custom Analytics class.
                    Analytics welcome = JsonConvert.DeserializeObject<Analytics>(unityWebRequest.downloadHandler.text);
    
                    // Get and return the count for the Event
                    if (int.TryParse(welcome.OdataCount, out eventCount) == false)
                    {
                        // Parsing failed. Can sometimes mean that the Query URL was incorrect.
                        Debug.Log("<color=red>Failure to Parse Data Results. Check Query URL for issues.</color>");
                    }
                    else
                    {
                        // Overwrite the current pair, with its actual values, now that the event count is known.
                        _pairedObjectsWithEventCount[currentCount] = new KeyValuePair<GameObject, int>(_pairedObjectsWithEventCount[currentCount].Key, eventCount);
                    }
    
                    // If all queries (compared with the number which was sent away) have 
                    // returned, then run the determine winner method. 
                    if (_queriesReturned == _pairedObjectsWithEventCount.Count)
                    {
                        DetermineWinner();
                    }
                }
            }
        }
    
  8. 次の方法はDetermineWinner() の一覧の並べ替えGameObjectInt最大イベント数に従ってのペア。The next method is DetermineWinner(), which sorts the list of GameObject and Int pairs, according to the highest event count. マテリアルの色を変更し、 GameObject緑色(フィードバックの最大数を持つ) として。It then changes the material color of that GameObject to green (as feedback for it having the highest count). これには、分析結果を含むメッセージが表示されます。This displays a message with the analytics results.

        /// <summary>
        /// Call to determine the keyValue pair, within the objects list, 
        /// with the highest event count.
        /// </summary>
        private void DetermineWinner()
        {
            // Sort the values within the list of pairs.
            _pairedObjectsWithEventCount.Sort((x, y) => y.Value.CompareTo(x.Value));
    
            // Change its colour to green
            _pairedObjectsWithEventCount.First().Key.GetComponent<Renderer>().material.color = Color.green;
    
            // Provide the winner, and other results, within the console window. 
            string message = $"<b>Analytics Results:</b>\n " +
                $"<i>{_pairedObjectsWithEventCount.First().Key.name}</i> has the highest event count, " +
                $"with <i>{_pairedObjectsWithEventCount.First().Value.ToString()}</i>.\nFollowed by: ";
    
            for (int i = 1; i < _pairedObjectsWithEventCount.Count; i++)
            {
                message += $"{_pairedObjectsWithEventCount[i].Key.name}, " +
                    $"with {_pairedObjectsWithEventCount[i].Value.ToString()} events.\n";
            }
    
            Debug.Log(message);
        }
    
  9. 受け取った JSON オブジェクトを逆シリアル化するために使用するクラスの構造を追加Application Insightsします。Add the class structure which will be used to deserialize the JSON object, received from Application Insights. 一番下にこれらのクラスを追加、 DataFromAnalyticsクラス ファイル、クラス定義の。Add these classes at the very bottom of your DataFromAnalytics class file, outside of the class definition.

        /// <summary>
        /// These classes represent the structure of the JSON response from Azure Insight
        /// </summary>
        [Serializable]
        public class Analytics
        {
            [JsonProperty("@odata.context")]
            public string OdataContext { get; set; }
    
            [JsonProperty("@odata.count")]
            public string OdataCount { get; set; }
    
            [JsonProperty("value")]
            public Value[] Value { get; set; }
        }
    
        [Serializable]
        public class Value
        {
            [JsonProperty("customMetric")]
            public CustomMetric CustomMetric { get; set; }
        }
    
        [Serializable]
        public class CustomMetric
        {
            [JsonProperty("name")]
            public string Name { get; set; }
        }
    
  10. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

章 10 - 移動クラスを作成します。Chapter 10 - Create the Movement class

移動スクリプトは、次のスクリプトを作成する必要があります。The Movement script is the next script you will need to create. 担当します。It is responsible for:

  • カメラの方向に応じて、メイン カメラの移動は、方向に求めています。Moving the Main Camera according to the direction the camera is looking towards.
  • シーンのオブジェクトには、その他のすべてのスクリプトを追加します。Adding all other scripts to scene objects.

スクリプトを作成します。To create the script:

  1. ダブルクリックして、スクリプトフォルダーを開きます。Double-click on the Scripts folder, to open it.

  2. 内側を右クリックし、スクリプトフォルダー、をクリックして作成 > C#スクリプトRight-click inside the Scripts folder, click Create > C# Script. スクリプトの名前移動します。Name the script Movement.

  3. ファイルを開くスクリプトをダブルクリックしてVisual Studioします。Double-click on the script to open it with Visual Studio.

  4. 次のように、既存のコードに置き換えます。Replace the existing code with the following:

        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
    
        public class Movement : MonoBehaviour
        {
            /// <summary>
            /// The rendered object representing the right controller.
            /// </summary>
            public GameObject Controller;
    
            /// <summary>
            /// The movement speed of the user.
            /// </summary>
            public float UserSpeed;
    
            /// <summary>
            /// Provides whether source updates have been registered.
            /// </summary>
            private bool _isAttached = false;
    
            /// <summary>
            /// The chosen controller hand to use. 
            /// </summary>
            private InteractionSourceHandedness _handness = InteractionSourceHandedness.Right;
    
            /// <summary>
            /// Used to calculate and proposes movement translation.
            /// </summary>
            private Vector3 _playerMovementTranslation;
    
            private void Start()
            {
                // You are now adding components dynamically 
                // to ensure they are existing on the correct object  
    
                // Add all camera related scripts to the camera. 
                Camera.main.gameObject.AddComponent<Gaze>();
                Camera.main.gameObject.AddComponent<ObjectTrigger>();
    
                // Add all other scripts to this object.
                gameObject.AddComponent<ApplicationInsightsTracker>();
                gameObject.AddComponent<DataFromAnalytics>();
            }
    
            // Update is called once per frame
            void Update()
            {
    
            }
        }
    
  5. 内で、移動クラス、Update() メソッド、手の形のコント ローラーを使用して仮想空間に移動するユーザーを許可する次のメソッドを挿入します。Within the Movement class, below the empty Update() method, insert the following methods that allow the user to use the hand controller to move in the virtual space:

        /// <summary>
        /// Used for tracking the current position and rotation of the controller.
        /// </summary>
        private void UpdateControllerState()
        {
    #if UNITY_WSA && UNITY_2017_2_OR_NEWER
            // Check for current connected controllers, only if WSA.
            string message = string.Empty;
    
            if (InteractionManager.GetCurrentReading().Length > 0)
            {
                foreach (var sourceState in InteractionManager.GetCurrentReading())
                {
                    if (sourceState.source.kind == InteractionSourceKind.Controller && sourceState.source.handedness == _handness)
                    {
                        // If a controller source is found, which matches the selected handness, 
                        // check whether interaction source updated events have been registered. 
                        if (_isAttached == false)
                        {
                            // Register events, as not yet registered.
                            message = "<color=green>Source Found: Registering Controller Source Events</color>";
                            _isAttached = true;
    
                            InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
                        }
    
                        // Update the position and rotation information for the controller.
                        Vector3 newPosition;
                        if (sourceState.sourcePose.TryGetPosition(out newPosition, InteractionSourceNode.Pointer) && ValidPosition(newPosition))
                        {
                            Controller.transform.localPosition = newPosition;
                        }
    
                        Quaternion newRotation;
    
                        if (sourceState.sourcePose.TryGetRotation(out newRotation, InteractionSourceNode.Pointer) && ValidRotation(newRotation))
                        {
                            Controller.transform.localRotation = newRotation;
                        }
                    }
                }
            }
            else
            {
                // Controller source not detected. 
                message = "<color=blue>Trying to detect controller source</color>";
    
                if (_isAttached == true)
                {
                    // A source was previously connected, however, has been lost. Disconnected
                    // all registered events. 
    
                    _isAttached = false;
    
                    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
    
                    message = "<color=red>Source Lost: Detaching Controller Source Events</color>";
                }
            }
    
            if(message != string.Empty)
            {
                Debug.Log(message);
            }
    #endif
        }
    
        /// <summary>
        /// This registered event is triggered when a source state has been updated.
        /// </summary>
        /// <param name="obj"></param>
        private void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
        {
            if (obj.state.source.handedness == _handness)
            {
                if(obj.state.thumbstickPosition.magnitude > 0.2f)
                {
                    float thumbstickY = obj.state.thumbstickPosition.y;
    
                    // Vertical Input.
                    if (thumbstickY > 0.3f || thumbstickY < -0.3f)
                    {
                        _playerMovementTranslation = Camera.main.transform.forward;
                        _playerMovementTranslation.y = 0;
                        transform.Translate(_playerMovementTranslation * UserSpeed * Time.deltaTime * thumbstickY, Space.World);
                    }
                }
            }
        }
    
        /// <summary>
        /// Check that controller position is valid. 
        /// </summary>
        /// <param name="inputVector3">The Vector3 to check</param>
        /// <returns>The position is valid</returns>
        private bool ValidPosition(Vector3 inputVector3)
        {
            return !float.IsNaN(inputVector3.x) && !float.IsNaN(inputVector3.y) && !float.IsNaN(inputVector3.z) && !float.IsInfinity(inputVector3.x) && !float.IsInfinity(inputVector3.y) && !float.IsInfinity(inputVector3.z);
        }
    
        /// <summary>
        /// Check that controller rotation is valid. 
        /// </summary>
        /// <param name="inputQuaternion">The Quaternion to check</param>
        /// <returns>The rotation is valid</returns>
        private bool ValidRotation(Quaternion inputQuaternion)
        {
            return !float.IsNaN(inputQuaternion.x) && !float.IsNaN(inputQuaternion.y) && !float.IsNaN(inputQuaternion.z) && !float.IsNaN(inputQuaternion.w) && !float.IsInfinity(inputQuaternion.x) && !float.IsInfinity(inputQuaternion.y) && !float.IsInfinity(inputQuaternion.z) && !float.IsInfinity(inputQuaternion.w);
        }   
    
  6. 最後に、メソッドの呼び出し内の追加、 Update() メソッド。Lastly add the method call within the Update() method.

        // Update is called once per frame
        void Update()
        {
            UpdateControllerState();
        }
    
  7. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

第 11 章 – スクリプト参照の設定Chapter 11 - Setting up the scripts references

この章では、配置する必要があります、移動にスクリプト、カメラ親し、その参照のターゲットを設定します。In this Chapter you need to place the Movement script onto the Camera Parent and set its reference targets. 他のスクリプトに必要な場所に配置するスクリプトを処理し、します。That script will then handle placing the other scripts where they need to be.

  1. スクリプトフォルダーで、プロジェクト パネル、ドラッグ、移動スクリプトをカメラ親内にあるオブジェクトは、階層パネルします。From the Scripts folder in the Project Panel, drag the Movement script to the Camera Parent object, located in the Hierarchy Panel.

    Unity シーン内のスクリプト参照の設定

  2. をクリックして、カメラ親します。Click on the Camera Parent. 階層パネル、ドラッグ、右側オブジェクトから、階層パネル、参照先をコント ローラーで、インスペクター パネルします。In the Hierarchy Panel, drag the Right Hand object from the Hierarchy Panel to the reference target, Controller, in the Inspector Panel. 設定、ユーザー速度5、次の図に示すようにします。Set the User Speed to 5, as shown in the image below.

    Unity シーン内のスクリプト参照の設定

第 12 章 - Unity プロジェクトをビルドChapter 12 - Build the Unity project

このプロジェクトの Unity のセクションの必要なすべてが今すぐ完了したら、ので、Unity から構築するための時間。Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. 移動しますビルド設定(ファイル > ビルド設定...) .Navigate to Build Settings, (File > Build Settings...).

  2. Build Settingsウィンドウで、をクリックしてビルドします。From the Build Settings window, click Build.

    UWP のソリューションに Unity プロジェクトをビルドします。

  3. Aファイル エクスプ ローラーウィンドウがポップアップで、ビルドの場所の入力を求めます。A File Explorer window will pop-up, prompting you for a location for the build. 新しいフォルダーを作成 (をクリックして新しいフォルダー左上隅にある)、名前を付けますビルドします。Create a new folder (by clicking New Folder in the top-left corner), and name it BUILDS.

    UWP のソリューションに Unity プロジェクトをビルドします。

    1. 開く、新しいビルドフォルダー、別のフォルダーを作成し、(を使用して新しいフォルダーもう一度)、名前を付けますMR_Azure_アプリケーション_Insightsします。Open the new BUILDS folder, and create another folder (using New Folder once more), and name it MR_Azure_Application_Insights.

      UWP のソリューションに Unity プロジェクトをビルドします。

    2. MR_Azure_アプリケーション_Insightsフォルダーを選択すると、クリックしてフォルダーの選択します。With the MR_Azure_Application_Insights folder selected, click Select Folder. プロジェクトは、ビルドを 1 分程度かかります。The project will take a minute or so to build.

  4. 次のビルドファイル エクスプ ローラー新しいプロジェクトの場所が示されますが表示されます。Following Build, File Explorer will appear showing you the location of your new project.

第 13 章 - MR_Azure_Application_Insights アプリ、マシンをデプロイします。Chapter 13 - Deploy MR_Azure_Application_Insights app to your machine

展開する、 MR_Azure_アプリケーション_Insightsローカル コンピューター上のアプリ。To deploy the MR_Azure_Application_Insights app on your Local Machine:

  1. ソリューション ファイルを開き、 MR_Azure_アプリケーション_InsightsでアプリVisual Studioします。Open the solution file of your MR_Azure_Application_Insights app in Visual Studio.

  2. ソリューション プラットフォームx86、ローカル コンピューターします。In the Solution Platform, select x86, Local Machine.

  3. ソリューション構成選択デバッグします。In the Solution Configuration select Debug.

    UWP のソリューションに Unity プロジェクトをビルドします。

  4. 移動してビルド メニューの をクリックソリューションの配置をコンピューターにアプリケーションをサイドローディングします。Go to Build menu and click on Deploy Solution to sideload the application to your machine.

  5. アプリが起動する準備ができて、インストールされているアプリの一覧に表示されます。Your app should now appear in the list of installed apps, ready to be launched.

  6. 複合現実のアプリケーションを起動します。Launch the mixed reality application.

  7. オブジェクトに近づいていると、それを見て、シーンの移動時に、 Azure Insight サービス十分なイベント データが収集が緑に最も対処されているオブジェクトが設定されます。Move around the scene, approaching objects and looking at them, when the Azure Insight Service has collected enough event data, it will set the object that has been approached the most to green.

重要

平均待機時間を中に、イベントとメトリック約 15 分は、サービスによって収集されるように、いくつかの状況で最大 1 時間がかかる場合があります。While the average waiting time for the Events and Metrics to be collected by the Service takes around 15 min, in some occasions it might take up to 1 hour.

第 14 章 – Application Insights サービス ポータルChapter 14 - The Application Insights Service portal

シーンを中心にローミングしたし、いくつかのオブジェクトで gazed で収集されたデータを表示できます、 Application Insights サービスポータル。Once you have roamed around the scene and gazed at several objects you can see the data collected in the Application Insights Service portal.

  1. Application Insights サービス ポータルに戻ります。Go back to your Application Insights Service portal.

  2. をクリックしてメトリックス エクスプ ローラーします。Click on Metrics Explorer.

    収集されたデータを見る

  3. 表すグラフを含むタブが開きます、イベントとメトリックアプリケーションに関連します。It will open in a tab containing the graph which represent the Events and Metrics related to your application. 前述のように、グラフに表示されるデータ (最大 1 時間) まで時間がかかる場合があります。As mentioned above, it might take some time (up to 1 hour) for the data to be displayed in the graph

    収集されたデータを見る

  4. をクリックして、イベント バーで、イベントの合計でその名前を持つイベントの詳細な内訳を表示する、アプリケーションのバージョン。Click on the Events bar in the Total of Events by Application Version, to see a detailed breakdown of the events with their names.

    収集されたデータを見る

Application Insights サービス アプリケーションの終了Your finished your Application Insights Service application

これで、アプリ内のユーザーのアクティビティを監視する Application Insights サービスを利用している mixed reality アプリを構築します。Congratulations, you built a mixed reality app that leverages the Application Insights Service to monitor user's activity within your app.

コースの結果

ボーナスの演習Bonus Exercises

手順 1Exercise 1

手動で作成する, ObjectInScene オブジェクトを起動し、スクリプト内で平面上の座標を設定します。Try spawning, rather than manually creating, the ObjectInScene objects and set their coordinates on the plane within your scripts. これにより、質問を入力できます Azure どのような最も人気のあるオブジェクトが (視線の先または近接検索の結果からいずれか) と生成、余分なそれらのオブジェクトのいずれか。In this way, you could ask Azure what the most popular object was (either from gaze or proximity results) and spawn an extra one of those objects.

手順 2Exercise 2

最も重要なデータを取得して、アプリケーションで時間その機微なデータを実装するように、時間で Application Insights 結果を並べ替えます。Sort your Application Insights results by time, so that you get the most relevant data, and implement that time sensitive data in your application.