注意

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 305:関数とストレージMR and Azure 305: Functions and storage

最終的な製品-開始

このコースでは、作成し、Azure Functions を使用する複合現実のアプリケーション内で、Azure Storage リソースにデータを格納する方法を学びます。In this course, you will learn how to create and use Azure Functions and store data with an Azure Storage resource, within a mixed reality application.

Azure Functionsできる小規模なコードを実行する開発者の Microsoft サービス '関数'、Azure では、します。Azure Functions is a Microsoft service, which allows developers to run small pieces of code, 'functions', in Azure. これは、多くのメリットを持つことができる、ローカル アプリケーションではなく、クラウドに作業を委任する方法を提供します。This provides a way to delegate work to the cloud, rather than your local application, which can have many benefits. Azure Functions C をなど、複数の開発言語をサポートしている#、F#Node.js、Java、および PHP します。Azure Functions supports several development languages, including C#, F#, Node.js, Java, and PHP. 詳細については、次を参照してください。、 Azure Functions の記事します。For more information, visit the Azure Functions article.

Azure Storageは、開発者が使用される高可用性、セキュリティで保護された、永続的な拡張性と冗長性保険、データの格納を Microsoft クラウド サービスです。Azure Storage is a Microsoft cloud service, which allows developers to store data, with the insurance that it will be highly available, secure, durable, scalable, and redundant. つまり、Microsoft のすべての保守、および重大な問題を処理します。This means Microsoft will handle all maintenance, and critical problems for you. 詳細については、次を参照してください。、 Azure Storage の記事します。For more information, visit the Azure Storage article.

このコースを完了すると、以下を実行できる必要が複合現実イマーシブ ヘッドセット アプリケーションが完成します。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 around a scene.
  2. ユーザーが gazes 3D 'button' にあるときに、オブジェクトの生成をトリガーします。Trigger the spawning of objects when the user gazes at a 3D 'button'.
  3. Azure 関数によって生成されたオブジェクトが選択されます。The spawned objects will be chosen by an Azure Function.
  4. アプリケーションがオブジェクトの種類を格納するように、各オブジェクトが生成される、 Azure FileにあるAzure Storageします。As each object is spawned, the application will store the object type in an Azure File, located in Azure Storage.
  5. 再度読み込むときに、 Azure Fileデータは取得、およびアプリケーションの以前のインスタンスからの起動元のアクションを再生するために使用します。Upon loading a second time, the Azure File data will be retrieved, and used to replay the spawning actions from the previous instance of the application.

アプリケーションでは、責任ですが、設計と、結果を統合する方法について。In your application, it is up to you as to how you will integrate the results with your design. このコースは、Unity プロジェクトで Azure サービスを統合する方法を説明する設計されています。This course is designed to teach you how to integrate an Azure Service with your Unity Project. できるように、複合現実のアプリケーションを強化するためには、このコースからのナレッジを使用して、ジョブになります。It is your job to use the knowledge you gain from this course to enhance your mixed reality Application.

デバイスのサポートDevice support

コースCourse HoloLensHoloLens イマーシブ ヘッドセットImmersive headsets
MR と Azure 305:関数とストレージMR and Azure 305: Functions and storage ✔️✔️ ✔️✔️

注意

このコースが主に 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.

前提条件Prerequisites

注意

このチュートリアルは、Unity を使用した基本的な経験がある開発者向けに設計およびC#します。This tutorial is designed for developers who have basic experience with Unity and C#. また、前提条件やこのドキュメント内の書面の手順を表すテストおよび (2018 年 5 月) の書き込み時に検証されたがどのようなことに注意してください。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 (May 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'll find in newer software than what's 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).

第 1 章 - Azure PortalChapter 1 - The Azure Portal

使用する、 Azure ストレージ サービス、作成および構成する必要があります、ストレージ アカウントAzure portal でします。To use the Azure Storage Service, you will need to create and configure a Storage Account in the Azure portal.

  1. ログイン、 Azure Portalします。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. ログインした後は、をクリックして新規左上隅にある検索してストレージ アカウント、 をクリックEnterします。Once you are logged in, click on New in the top left corner, and search for Storage account, and click Enter.

    azure storage の検索

    注意

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

  3. 新しいページがの説明を入力、 Azure Storage アカウントサービス。The new page will provide a description of the Azure Storage account service. このプロンプトの左下にある at、作成ボタンは、このサービスとの関連付けを作成します。At the bottom left of this prompt, select the Create button, to create an association with this service.

    サービスを作成します。

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

    1. 挿入、名前お使いのアカウントに、数字と小文字のみこのフィールドを受け入れるに注意してください。Insert a Name for your account, be aware this field only accepts numbers, and lowercase letters.

    2. デプロイ モデルResource managerします。For Deployment model, select Resource manager.

    3. アカウントの種類ストレージ (汎用 v1) します。For Account kind, select Storage (general purpose v1).

    4. 確認、場所(新しいリソース グループを作成する) 場合は、リソース グループ。Determine the Location for your resource group (if you are creating a new Resource Group). 場所は、アプリケーションが実行リージョンにあるが理想的です。The location would ideally be in the region where the application would run. 一部の Azure 資産は特定のリージョンでのみ使用できます。Some Azure assets are only available in certain regions.

    5. レプリケーション選択読み取りアクセスの geo 冗長ストレージ (RA-GRS) します。For Replication select Read-access-geo-redundant storage (RA-GRS).

    6. パフォーマンス標準します。For Performance, select Standard.

    7. まま転送が必須のセキュリティで保護されたとして無効になっているします。Leave Secure transfer required as Disabled.

    8. 選択、サブスクリプションします。Select a Subscription.

    9. 選択、リソース グループか新規に作成します。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 labs) under a common resource group).

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

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

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

      入力のサービス情報

  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.

    リソースに移動します。

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

    アクセス キー

  9. をクリックしてアクセス キー、このクラウド サービスのエンドポイントを表示します。Click Access keys, to reveal the endpoints for this cloud service. 使用して、メモ帳と同様に、後で使用できる、キーの 1 つをコピーするか。Use Notepad or similar, to copy one of your keys for use later. また、接続文字列値で使用するため、 AzureServicesクラスは、後で作成します。Also, note the Connection string value, as it will be used in the AzureServices class, which you will create later.

    接続文字列をコピー

第 2 章 – Azure 関数の設定Chapter 2 - Setting up an Azure Function

記述して、 Azure 関数で Azure サービスです。You will now write an Azure Function in the Azure Service.

使用することができます、 Azure 関数ほぼ何も行うでの操作とクラシックの関数を使用した、コードの違いは、この関数は、Azure アカウントへのアクセス資格情報を持つ任意のアプリケーションからアクセスできることです。You can use an Azure Function to do nearly anything that you would do with a classic function in your code, the difference being that this function can be accessed by any application that has credentials to access your Azure Account.

Azure 関数を作成します。To create an Azure Function:

  1. Azure Portal、 をクリックして新規左上隅にある検索してFunction App、 をクリックEnterFrom your Azure Portal, click on New in the top left corner, and search for Function App, and click Enter.

    function app を作成します。

    注意

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

  2. 新しいページがの説明を入力、 Azure Function Appサービス。The new page will provide a description of the Azure Function App service. このプロンプトの左下にある at、作成ボタンは、このサービスとの関連付けを作成します。At the bottom left of this prompt, select the Create button, to create an association with this service.

    関数アプリの情報

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

    1. 提供、アプリ名します。Provide an App name. アルファベットと数字のみをここで使用することができます (上限または下限のいずれかのケースは許可されています)。Only letters and numbers can be used here (either upper or lower case is allowed).

    2. 選択、優先サブスクリプションします。Select your preferred Subscription.

    3. 選択、リソース グループか新規に作成します。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 labs) under a common resource group).

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

    4. この演習では、次のように選択します。 Windowsとして選択したOSします。For this exercise, select Windows as the chosen OS.

    5. 選択従量課金プランホスティング プランします。Select Consumption Plan for the Hosting Plan.

    6. 確認、場所(新しいリソース グループを作成する) 場合は、リソース グループ。Determine the Location for your resource group (if you are creating a new Resource Group). 場所は、アプリケーションが実行リージョンにあるが理想的です。The location would ideally be in the region where the application would run. 一部の Azure 資産は特定のリージョンでのみ使用できます。Some Azure assets are only available in certain regions. 最適なパフォーマンス、ストレージ アカウントと同じリージョンを選択します。For optimal performance, select the same region as the storage account.

    7. ストレージを選択します既存の、以前に作成したストレージを検索し、ドロップダウン メニューを使用するとします。For Storage, select Use existing, and then using the dropdown menu, find your previously created storage.

    8. ままApplication Insightsこの演習ではオフです。Leave Application Insights off for this exercise.

      入力関数アプリの詳細

  4. [作成] をクリックします。Click the Create button.

  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.

    関数アプリのリソースに移動します。

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

  9. 関数アプリダッシュ ボードで、マウス カーソルを置く関数、左側のパネル内に存在し、クリックして、 + (正符号 +) シンボル。On the Function App dashboard, hover your mouse over Functions, found within the panel on the left, and then click the + (plus) symbol.

    新しい関数を作成します。

  10. 次のページで確認webhook+apiが選択されていると 、言語の選択選択CSharp、このチュートリアルで使用されている言語があります。On the next page, ensure Webhook + API is selected, and for Choose a language, select CSharp, as this will be the language used for this tutorial. 最後に、をクリックして、この関数を作成ボタンをクリックします。Lastly, click the Create this function button.

    web フック csharp を選択します。

  11. コードが表示される、左側のパネル内の関数の一覧で、新しく作成された関数の いない場合 (run.csx) ページの します。You should be taken to the code page (run.csx), if not though, click on the newly created Function in the Functions list within the panel on the left.

    新しい関数を開く

  12. 関数には、次のコードをコピーします。Copy the following code into your function. この関数は、0 と 2 が呼び出されるとの間のランダムな整数を返しますだけです。This function will simply return a random integer between 0 and 2 when called. 既存のコードについて心配ではなく自由に、その上に貼り付けます。Do not worry about the existing code, feel free to paste over the top of it.

        using System.Net;
        using System.Threading.Tasks;
    
        public static int Run(CustomObject req, TraceWriter log)
        {
            Random rnd = new Random();
            int randomInt = rnd.Next(0, 3);
            return randomInt;
        }
    
        public class CustomObject
        {
            public String name {get; set;}
        }
    
  13. [保存] を選びます。Select Save.

  14. 結果は、次の図のようになります。The result should look like the image below.

  15. をクリックして関数の URL を取得するメモ、エンドポイントが表示されます。Click on Get function URL and take note of the endpoint displayed. 挿入する必要があります、 AzureServicesこのコースの後半で作成するクラス。You will need to insert it into the AzureServices class that you will create later in this course.

    関数のエンドポイントを取得します。

    関数のエンドポイントを取得します。

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

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

設定して、mixed reality イマーシブ ヘッドセットをテストします。Set up and test your mixed reality immersive headset.

注意

いないこのコースのモーションのコント ローラーが必要です。You will not require Motion Controllers for this course. イマーシブ ヘッドセットの設定をサポートする場合は、次のようにしてください。記事セットアップ複合現実を参照してください。します。If you need support setting up the immersive headset, please visit the mixed reality set up article.

  1. Unity を開き、をクリックして新規します。Open Unity and click New.

    新しい unity プロジェクトを作成します。

  2. これで、Unity プロジェクト名を指定する必要があります。You will now need to provide a Unity Project name. 挿入MR_Azure_Functionsします。Insert MR_Azure_Functions. 必ず、プロジェクトの種類に設定されて3Dします。Make sure the project type 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.

    スクリプト エディターとして visual studio の設定

  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.

    uwp にプラットフォームを切り替える

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

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

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

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

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

    4. Visual Studio バージョンに設定されているインストールされている最新Visual Studio Version is set to Latest installed

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

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

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

        開いているシーンを追加します。

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

        シーンのフォルダーを作成します。

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

        関数のシーンを保存します。

  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.

    インスペクターの player の設定

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

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

      1. ランタイム バージョンをスクリプトする必要があります試験的(.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
    2. 内で、発行の設定] タブの [機能、確認してください。Within the Publishing Settings tab, under Capabilities, check:

      • InternetClientInternetClient

        セットの機能

    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.

      XR を設定します。

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

    ティックの c# プロジェクト

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

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

第 4 章 - メイン カメラのセットアップChapter 4 - Setup Main Camera

重要

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

  1. 階層パネル、という名前のオブジェクトが表示されますMain Camera、「内部」アプリケーションが表示されたら、このオブジェクトは、"head"の観点を表します。In the Hierarchy Panel, you will find an object called Main Camera, this object represents your "head" point of view once you are "inside" your application.

  2. 選択する前にある Unity ダッシュ ボードで、メイン カメラの GameObjectします。With the Unity Dashboard in front of you, select the Main Camera GameObject. 表示になります、インスペクター パネル(一般にダッシュ ボードで、右側にあります) をさまざまなコンポーネントが表示されますGameObject変換後に、上部にあるカメラ、およびその他のコンポーネント。You will notice that the Inspector Panel (generally found to the right, within the Dashboard) will show the various components of that GameObject, with Transform at the top, followed by Camera, and some other components. これが正しく配置されているため、メイン カメラの変換をリセットする必要があります。You will need to reset the Transform of the Main Camera, so it is positioned correctly.

  3. これを行うには、選択、歯車カメラの横にあるアイコン変換コンポーネント、および選択リセットTo do this, select the Gear icon next to the Camera's Transform component, and select Reset.

    変換をリセットします。

  4. 更新し、変換のようにコンポーネント。Then update the Transform component to look like:

    変換の位置TRANSFORM - POSITION
    XX YY ZZ
    00 11 00
    変換の回転TRANSFORM - ROTATION
    XX YY ZZ
    00 00 00
    変換のスケールTRANSFORM - SCALE
    XX YY ZZ
    11 11 11

    セットのカメラの変換

第 5 章 - Unity シーンの設定Chapter 5 - Setting up the Unity scene

  1. 空の領域で右クリックし、階層パネル 3D オブジェクト、追加、平面します。Right-click in an empty area of the Hierarchy Panel, under 3D Object, add a Plane.

    新しい面を作成します。

  2. 平面オブジェクトの選択されている、次のパラメーターを変更、インスペクター パネル:With the Plane object selected, change the following parameters in the Inspector Panel:

    変換の位置TRANSFORM - POSITION
    XX YY ZZ
    00 00 44
    変換のスケールTRANSFORM - SCALE
    XX YY ZZ
    1010 11 1010

    平面の位置を設定してスケール

    平面のシーン ビュー

  3. 空の領域で右クリックし、階層パネル 3D オブジェクト、追加、キューブします。Right-click in an empty area of the Hierarchy Panel, under 3D Object, add a Cube.

    1. キューブの名前を変更GazeButton (選択されているキューブを押して 'F2')。Rename the Cube to GazeButton (with the Cube selected, press 'F2').

    2. 次のパラメーターを変更、インスペクター パネル:Change the following parameters in the Inspector Panel:

      変換の位置TRANSFORM - POSITION
      XX YY ZZ
      00 33 55

      セットの視線入力ボタンの変換

      視線ボタン シーン ビュー

    3. をクリックして、タグドロップダウン ボタンをクリックしますタグを追加を開く、レイヤー ペイン (&)、タグします。Click on the Tag drop-down button and click on Add Tag to open the Tags & Layers Pane.

      新しいタグを追加します。

      プラス記号を選択します

    4. 選択、 + (正符号 +) ボタン、し、新しいタグ名フィールドに、入力GazeButton、キーを押します保存Select the + (plus) button, and in the New Tag Name field, enter GazeButton, and press Save.

      新しいタグの名前

    5. をクリックして、 GazeButtonオブジェクト、階層パネル、し、インスペクター パネル、割り当て、新しく作成されたGazeButtonタグ。Click on the GazeButton object in the Hierarchy Panel, and in the Inspector Panel, assign the newly created GazeButton tag.

      視線入力ボタンをクリックして新しいタグを割り当てる

  4. 右クリックし、 GazeButtonオブジェクトで、階層パネル、追加、空の GameObject (として追加されます、オブジェクトの場合)。Right-click on the GazeButton object, in the Hierarchy Panel, and add an Empty GameObject (which will be added as a child object).

  5. 新しいオブジェクトを選択し、名前変更ShapeSpawnPointします。Select the new object and rename it ShapeSpawnPoint.

    1. 次のパラメーターを変更、インスペクター パネル:Change the following parameters in the Inspector Panel:

      変換の位置TRANSFORM - POSITION
      XX YY ZZ
      00 -1-1 00

      図形の生成のポイントの変換を更新します。

      図形の起動ポイント シーン ビュー

  6. 次に作成、 3D テキストAzure サービスの状態に関するフィードバックを提供するオブジェクト。Next you will create a 3D Text object to provide feedback on the status of the Azure service.

    右クリックして、 GazeButton階層でもう一度 パネルを追加、 3D オブジェクト > 3D テキストオブジェクトとして、します。Right click on the GazeButton in the Hierarchy Panel again and add a 3D Object > 3D Text object as a child.

    新しい 3D テキスト オブジェクトを作成します。

  7. 名前の変更、 3D テキストオブジェクトをAzureStatusTextします。Rename the 3D Text object to AzureStatusText.

  8. 変更、 AzureStatusTextオブジェクトの次のように変換します。Change the AzureStatusText object Transform as follows:

    変換の位置TRANSFORM - POSITION
    XX YY ZZ
    00 00 -0.6-0.6
    変換のスケールTRANSFORM - SCALE
    XX YY ZZ
    0.10.1 0.10.1 0.10.1

    注意

    センターをオフにこれは修正される場合に表示される場合も心配はありません、以下のテキストのメッシュ コンポーネントが更新されます。Do not worry if it appears to be off-centre, as this will be fixed when the below Text Mesh component is updated.

  9. 変更、テキスト メッシュと一致するコンポーネントの下。Change the Text Mesh component to match the below:

    テキストの設定のメッシュ コンポーネント

    ヒント

    ここで選択した色は、16 進数の色を示します。000000FF、ただし、自由に独自の選択、それを読み取ることが確認します。The selected color here is Hex color: 000000FF, though feel free to choose your own, just ensure it is readable.

  10. パネルの階層構造は、次のようになります。Your Hierarchy Panel structure should now look like this:

    テキストは、シーン ビューでメッシュします。

  11. シーンは、次のようになります。Your scene should now look like this:

    テキストは、シーン ビューでメッシュします。

第 6 章 - Unity 用の Azure Storage のインポートChapter 6 - Import Azure Storage for Unity

Unity の Azure ストレージを使用する (それ自体を活用して、.Net SDK for Azure)。You will be using Azure Storage for Unity (which itself leverages the .Net SDK for Azure). 詳細について、 Unity 記事用の Azure Storageします。You can read more about this at the Azure Storage for Unity article.

インポート後に再構成するプラグインを必要とする 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.

独自のプロジェクトに SDK をインポートすることを最新バージョンをダウンロードしていることを確認してGitHub からの '.unitypackage'します。To import the SDK into your own project, make sure you have downloaded the latest '.unitypackage' from GitHub. 次に、次の操作を行います。Then, do the following:

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

  2. *Unity パッケージのインポート* ポップアップ、選択できることの下のすべてのボックス *プラグイン > *ストレージ。In the Import Unity Package box that pops up, you can select everything under *Plugin > *Storage**. このコースの必要がないと、その他のすべてをオフにします。Uncheck everything else, as it is not needed for this course.

    パッケージへのインポートします。

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

  4. 移動して、ストレージの下のフォルダープラグイン、プロジェクトのビューを選び、次のプラグインのみ:Go to the Storage folder under Plugins, in the Project view, and select the following plugins only:

    • Microsoft.Data.EdmMicrosoft.Data.Edm

    • Microsoft.Data.ODataMicrosoft.Data.OData

    • Microsoft.WindowsAzure.StorageMicrosoft.WindowsAzure.Storage

    • Newtonsoft.JsonNewtonsoft.Json

    • System.SpatialSystem.Spatial

      任意のプラットフォームをオフにします。

  5. これら特定のプラグイン選択すると、をオフに Any プラットフォームをオフに WSAPlayerクリックして適用します。With these specific plugins selected, uncheck Any Platform and uncheck WSAPlayer then click Apply.

    プラットフォームの dll を適用します。

    注意

    Unity エディターでのみ使用するこれらの特定のプラグインをマークするされます。We are marking these particular plugins to only be used in the Unity Editor. WSA フォルダー Unity からプロジェクトはエクスポート後に使用される同じプラグインのさまざまなバージョンがあるためにです。This is because there are different versions of the same plugins in the WSA folder that will be used after the project is exported from Unity.

  6. ストレージプラグイン フォルダーのみを選択します。In the Storage plugin folder, select only:

    • Microsoft.Data.Services.ClientMicrosoft.Data.Services.Client

      dll のセットを処理しません。

  7. チェック、しないプロセスボックスプラットフォームの設定 をクリック適用します。Check the Don't Process box under Platform Settings and click Apply.

    処理は適用されません。

    注意

    私たちはマークするこのプラグイン「プロセスはありません」Unity アセンブリのパッチャがあるこのプラグインを処理できないのためです。We are marking this plugin "Don't process" because the Unity assembly patcher has difficulty processing this plugin. このプラグインは処理されていない場合でも機能します。The plugin will still work even though it is not processed.

7 -」の章の azure サービス クラスを作成します。Chapter 7 - Create the AzureServices class

最初のクラスを作成するには、 AzureServicesクラス。The first class you are going to create is the AzureServices class.

AzureServicesを担当するクラス。The AzureServices class will be responsible for:

  • Azure アカウントの資格情報を格納します。Storing Azure Account credentials.

  • Azure アプリ関数を呼び出しています。Calling your Azure App Function.

  • アップロードと Azure のクラウド ストレージにデータ ファイルのダウンロード。The upload and download of the data file in your Azure Cloud Storage.

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

  1. 右クリックし、資産フォルダーで、[プロジェクト] パネルにある作成 > フォルダーします。Right-click in the Asset Folder, located in the Project Panel, Create > Folder. フォルダーの名前スクリプトします。Name the folder Scripts.

    新しいフォルダーを作成します。

    フォルダーのスクリプトを呼び出す

  2. 先ほど作成した、開くフォルダーをダブルクリックします。Double click on the folder just created, to open it.

  3. フォルダー内を右クリックして作成 >C#スクリプトします。Right-click inside the folder, Create > C# Script. スクリプトを呼び出すAzureServicesします。Call the script AzureServices.

  4. 新しいをダブルクリックします。 AzureServicesクラス ファイルを開くVisual Studioします。Double click on the new AzureServices class to open it with Visual Studio.

  5. 先頭に次の名前空間を追加、 AzureServices:Add the following namespaces to the top of the AzureServices:

        using System;
        using System.Threading.Tasks;
        using UnityEngine;
        using Microsoft.WindowsAzure.Storage;
        using Microsoft.WindowsAzure.Storage.File;
        using System.IO;
        using System.Net;
    
  6. 内で、次のインスペクター フィールドを追加、 AzureServicesクラス。Add the following Inspector Fields inside the AzureServices class:

        /// <summary>
        /// Provides Singleton-like behavior to this class.
        /// </summary>
        public static AzureServices instance;
    
        /// <summary>
        /// Reference Target for AzureStatusText Text Mesh object
        /// </summary>
        public TextMesh azureStatusText;
    
  7. 内の次のメンバー変数を追加し、 AzureServicesクラス。Then add the following member variables inside the AzureServices class:

        /// <summary>
        /// Holds the Azure Function endpoint - Insert your Azure Function
        /// Connection String here.
        /// </summary>
    
        private readonly string azureFunctionEndpoint = "--Insert here you AzureFunction Endpoint--";
    
        /// <summary>
        /// Holds the Storage Connection String - Insert your Azure Storage
        /// Connection String here.
        /// </summary>
        private readonly string storageConnectionString = "--Insert here you AzureStorage Connection String--";
    
        /// <summary>
        /// Name of the Cloud Share - Hosts directories.
        /// </summary>
        private const string fileShare = "fileshare";
    
        /// <summary>
        /// Name of a Directory within the Share
        /// </summary>
        private const string storageDirectory = "storagedirectory";
    
        /// <summary>
        /// The Cloud File
        /// </summary>
        private CloudFile shapeIndexCloudFile;
    
        /// <summary>
        /// The Linked Storage Account
        /// </summary>
        private CloudStorageAccount storageAccount;
    
        /// <summary>
        /// The Cloud Client
        /// </summary>
        private CloudFileClient fileClient;
    
        /// <summary>
        /// The Cloud Share - Hosts Directories
        /// </summary>
        private CloudFileShare share;
    
        /// <summary>
        /// The Directory in the share that will host the Cloud file
        /// </summary>
        private CloudFileDirectory dir;
    

    重要

    置換するかどうかを確認、エンドポイント接続文字列値と、Azure storage からの値が、Azure ポータルで確認Make sure you replace the endpoint and connection string values with the values from your Azure storage, found in the Azure Portal

  8. コードをAwake()Start() 今すぐメソッドを追加する必要があります。Code for Awake() and Start() methods now needs to be added. これらのメソッドが、クラスの初期化時に呼び出されます。These methods will be called when the class initializes:

        private void Awake()
        {
            instance = this;
        }
    
        // Use this for initialization
        private void Start()
        {
            // Set the Status text to loading, whilst attempting connection to Azure.
            azureStatusText.text = "Loading...";
        }
    
        /// <summary>
        /// Call to the Azure Function App to request a Shape.
        /// </summary>
        public async void CallAzureFunctionForNextShape()
        {
    
        }
    

    重要

    コードの入力はCallAzureFunctionForNextShape() で、将来章します。We will fill in the code for CallAzureFunctionForNextShape() in a future Chapter.

  9. 削除、 Update() メソッドのため、このクラスは使用されません。Delete the Update() method since this class will not use it.

  10. Visual Studio で、変更を保存し、Unity に戻ります。Save your changes in Visual Studio, and then return to Unity.

  11. クリックしてドラッグし、 AzureServices Scripts フォルダーからクラスの Main Camera オブジェクトを階層パネルします。Click and drag the AzureServices class from the Scripts folder to the Main Camera object in the Hierarchy Panel.

  12. メイン カメラを選択し、取得、 AzureStatusTextから下に子オブジェクト、 GazeButtonオブジェクト、および配置内で、 AzureStatusText参照先フィールドに、インスペクターへの参照を提供する、 AzureServicesスクリプト。Select the Main Camera, then grab the AzureStatusText child object from beneath the GazeButton object, and place it within the AzureStatusText reference target field, in the Inspector, to provide the reference to the AzureServices script.

    テキストの参照先の azure の状態を割り当てる

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

次のスクリプトを作成するには、 ShapeFactoryクラス。The next script to create, is the ShapeFactory class. このクラスの役割は、要求されたときに、新しい図形を作成しで作成した図形の履歴を保持する図形履歴リストします。The role of this class is to create a new shape, when requested, and keep a history of the shapes created in a Shape History List. 図形が作成されるたびに、図形履歴リストで更新、 AzureServiceクラス、およびに格納し、 Azure Storageします。Every time a shape is created, the Shape History list is updated in the AzureService class, and then stored in your Azure Storage. アプリケーションの起動時、格納されているファイルが見つかった場合、 Azure Storage図形履歴リストが取得され、再生で、 3D テキストオブジェクトを提供します。生成された図形がストレージから、または新しいかどうか。When the application starts, if a stored file is found in your Azure Storage, the Shape History list is retrieved and replayed, with the 3D Text object providing whether the generated shape is from storage, or new.

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

  1. 移動して、スクリプト以前に作成したフォルダーです。Go to the Scripts folder you created previously.

  2. フォルダー内を右クリックして作成 >C#スクリプトします。Right-click inside the folder, Create > C# Script. スクリプトを呼び出すShapeFactoryします。Call the script ShapeFactory.

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

  4. 確認、 ShapeFactoryクラスには、次の名前空間が含まれています。Ensure the ShapeFactory class includes the following namespaces:

        using System.Collections.Generic;
        using UnityEngine;
    
  5. 次に示す変数を追加、 ShapeFactoryクラスし、置換、 Start()Awake() と次の関数。Add the variables shown below to the ShapeFactory class, and replace the Start() and Awake() functions with those below:

        /// <summary>
        /// Provide this class Singleton-like behaviour
        /// </summary>
        [HideInInspector]
        public static ShapeFactory instance;
    
        /// <summary>
        /// Provides an Inspector exposed reference to ShapeSpawnPoint
        /// </summary>
        [SerializeField]
        public Transform spawnPoint;
    
        /// <summary>
        /// Shape History Index
        /// </summary>
        [HideInInspector]
        public List<int> shapeHistoryList;
    
        /// <summary>
        /// Shapes Enum for selecting required shape
        /// </summary>
        private enum Shapes { Cube, Sphere, Cylinder }
    
        private void Awake()
        {
            instance = this;
        }
    
        private void Start()
        {
            shapeHistoryList = new List<int>();
        }
    
  6. CreateShape() メソッドに基づいて、指定したプリミティブ図形は生成整数パラメーター。The CreateShape() method generates the primitive shapes, based upon the provided integer parameter. ブール型パラメーターは、現在作成されている図形は、ストレージからかどうかを指定するために使用または新しいです。The Boolean parameter is used to specify whether the currently created shape is from storage, or new. 次のコードを配置、 ShapeFactoryクラスは、前のメソッドの下。Place the following code in your ShapeFactory class, below the previous methods:

        /// <summary>
        /// Use the Shape Enum to spawn a new Primitive object in the scene
        /// </summary>
        /// <param name="shape">Enumerator Number for Shape</param>
        /// <param name="storageShape">Provides whether this is new or old</param>
        internal void CreateShape(int shape, bool storageSpace)
        {
            Shapes primitive = (Shapes)shape;
            GameObject newObject = null;
            string shapeText = storageSpace == true ? "Storage: " : "New: ";
    
            AzureServices.instance.azureStatusText.text = string.Format("{0}{1}", shapeText, primitive.ToString());
    
            switch (primitive)
            {
                case Shapes.Cube:
                newObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
                break;
    
                case Shapes.Sphere:
                newObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                break;
    
                case Shapes.Cylinder:
                newObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                break;
            }
    
            if (newObject != null)
            {
                newObject.transform.position = spawnPoint.position;
    
                newObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    
                newObject.AddComponent<Rigidbody>().useGravity = true;
    
                newObject.GetComponent<Renderer>().material.color = UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
            }
        }
    
  7. Visual Studio で Unity に戻る前に変更を保存することを確認します。Be sure to save your changes in Visual Studio before returning to Unity.

  8. 戻る Unity エディターで、をクリックし、ドラッグ、 ShapeFactoryクラスから、スクリプトフォルダーをMain Cameraオブジェクト、階層パネル.Back in the Unity Editor, click and drag the ShapeFactory class from the Scripts folder to the Main Camera object in the Hierarchy Panel.

  9. 選択したメイン カメラで表示されます、 ShapeFactoryスクリプト コンポーネントが不足している、 Spawn ポイント参照。With the Main Camera selected you will notice the ShapeFactory script component is missing the Spawn Point reference. これを修正するには、ドラッグ、 ShapeSpawnPointオブジェクトから、階層パネルSpawn ポイント参照先。To fix it, drag the ShapeSpawnPoint object from the Hierarchy Panel to the Spawn Point reference target.

    セット図形工場出荷時の参照先

9 - 章視線の先クラスを作成します。Chapter 9 - Create the Gaze class

最後のスクリプトを作成する必要がありますが、視線クラス。The last script you need to create is the Gaze class.

作成するため、このクラスは、 Raycastユーザーを見て、どのオブジェクトを検出するために、メイン カメラから転送投影されます。This class 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 の必要があります、ユーザーが見る場合を識別するためにここで、 GazeButtonシーン内のオブジェクトし、動作をトリガーします。In this case, the Raycast will need to identify if the user is looking at the GazeButton object in the scene and trigger a behavior.

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

  1. 移動して、スクリプト以前に作成したフォルダーです。Go to the Scripts folder you created previously.

  2. プロジェクト パネルで、右クリックして作成 >C#スクリプトします。Right-click in the Project Panel, Create > C# Script. スクリプトを呼び出す視線します。Call the script Gaze.

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

  4. 次の名前空間が、スクリプトの先頭に含まれることを確認するには。Ensure the following namespace is included at the top of the script:

        using UnityEngine;
    
  5. 内で、次の変数を追加し、視線クラス。Then add the following variables inside the Gaze class:

        /// <summary>
        /// Provides Singleton-like behavior to this class.
        /// </summary>
        public static Gaze instance;
    
        /// <summary>
        /// The Tag which the Gaze will use to interact with objects. Can also be set in editor.
        /// </summary>
        public string InteractibleTag = "GazeButton";
    
        /// <summary>
        /// The layer which will be detected by the Gaze ('~0' equals everything).
        /// </summary>
        public LayerMask LayerMask = ~0;
    
        /// <summary>
        /// The Max Distance the gaze should travel, if it has not hit anything.
        /// </summary>
        public float GazeMaxDistance = 300;
    
        /// <summary>
        /// The size of the cursor, which will be created.
        /// </summary>
        public Vector3 CursorSize = new Vector3(0.05f, 0.05f, 0.05f);
    
        /// <summary>
        /// The color of the cursor - can be set in editor.
        /// </summary>
        public Color CursorColour = Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
    
        /// <summary>
        /// Provides when the gaze is ready to start working (based upon whether
        /// Azure connects successfully).
        /// </summary>
        internal bool GazeEnabled = false;
    
        /// <summary>
        /// The currently focused object.
        /// </summary>
        internal GameObject FocusedObject { get; private set; }
    
        /// <summary>
        /// The object which was last focused on.
        /// </summary>
        internal GameObject _oldFocusedObject { get; private set; }
    
        /// <summary>
        /// The info taken from the last hit.
        /// </summary>
        internal RaycastHit HitInfo { get; private set; }
    
        /// <summary>
        /// The cursor object.
        /// </summary>
        internal GameObject Cursor { get; private set; }
    
        /// <summary>
        /// Provides whether the raycast has hit something.
        /// </summary>
        internal bool Hit { get; private set; }
    
        /// <summary>
        /// This will store the position which the ray last hit.
        /// </summary>
        internal Vector3 Position { get; private set; }
    
        /// <summary>
        /// This will store the normal, of the ray from its last hit.
        /// </summary>
        internal Vector3 Normal { get; private set; }
    
        /// <summary>
        /// The start point of the gaze ray cast.
        /// </summary>
        private Vector3 _gazeOrigin;
    
        /// <summary>
        /// The direction in which the gaze should be.
        /// </summary>
        private Vector3 _gazeDirection;
    

重要

これらの変数の一部では編集できなく、エディターします。Some of these variables will be able to be edited in the Editor.

  1. コードをAwake()Start() 今すぐメソッドを追加する必要があります。Code for the Awake() and Start() methods now needs to be added.

        /// <summary>
        /// The method used after initialization of the scene, though before Start().
        /// </summary>
        private void Awake()
        {
            // Set this class to behave similar to singleton
            instance = this;
        }
    
        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        private void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  2. と共に開始位置でカーソル オブジェクトを作成する次のコードを追加、 Update() GazeEnabled ブール値を切り替えると、Raycast メソッドを実行するメソッド。Add the following code, which will create a cursor object at start, along with the Update() method, which will run the Raycast method, along with being where the GazeEnabled boolean is toggled:

        /// <summary>
        /// Method to create a cursor object.
        /// </summary>
        /// <returns></returns>
        private GameObject CreateCursor()
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            newCursor.SetActive(false);
    
            // Remove the collider, so it doesn't block raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
            newCursor.transform.localScale = CursorSize;
    
            newCursor.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Diffuse"))
            {
                color = CursorColour
            };
    
            newCursor.name = "Cursor";
    
            newCursor.SetActive(true);
    
            return newCursor;
        }
    
        /// <summary>
        /// Called every frame
        /// </summary>
        private void Update()
        {
            if(GazeEnabled == true)
            {
                _gazeOrigin = Camera.main.transform.position;
    
                _gazeDirection = Camera.main.transform.forward;
    
                UpdateRaycast();
            }
        }
    
  3. 次を追加、 UpdateRaycast() メソッドでは、プロジェクト、Raycast され、ヒットのターゲットを検出します。Next add the UpdateRaycast() method, which will project a Raycast and detect the hit target.

        private void UpdateRaycast()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedObject;
    
            RaycastHit hitInfo;
    
            // Initialise Raycasting.
            Hit = Physics.Raycast(_gazeOrigin,
                _gazeDirection,
                out hitInfo,
                GazeMaxDistance, LayerMask);
    
            HitInfo = hitInfo;
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                Position = hitInfo.point;
    
                Normal = hitInfo.normal;
    
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedObject = hitInfo.collider.gameObject;
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedObject = null;
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedObject = null;
    
                // Provide default position for cursor.
                Position = _gazeOrigin + (_gazeDirection * GazeMaxDistance);
    
                // Provide a default normal.
                Normal = _gazeDirection;
            }
    
            // Lerp the cursor to the given position, which helps to stabilize the gaze.
            Cursor.transform.position = Vector3.Lerp(Cursor.transform.position, Position, 0.6f);
    
            // Check whether the previous focused object is this same 
            //    object. If so, reset the focused object.
            if (FocusedObject != _oldFocusedObject)
            {
                ResetFocusedObject();
    
                if (FocusedObject != null)
                {
                if (FocusedObject.CompareTag(InteractibleTag.ToString()))
                {
                        // Set the Focused object to green - success!
                        FocusedObject.GetComponent<Renderer>().material.color = Color.green;
    
                        // Start the Azure Function, to provide the next shape!
                        AzureServices.instance.CallAzureFunctionForNextShape();
                    }
                }
            }
        }
    
  4. 最後に、追加、 ResetFocusedObject() メソッドで、GazeButton オブジェクトの現在色、かどうか、新しい図形を作成しているかどうかを示すとオフが切り替わります。Lastly, add the ResetFocusedObject() method, which will toggle the GazeButton objects current color, indicating whether it is creating a new shape or not.

        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        private void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                if (_oldFocusedObject.CompareTag(InteractibleTag.ToString()))
                {
                    // Set the old focused object to red - its original state.
                    _oldFocusedObject.GetComponent<Renderer>().material.color = Color.red;
                }
            }
        }
    
  5. Visual Studio で Unity に戻る前に、変更を保存します。Save your changes in Visual Studio before returning to Unity.

  6. クリックしてドラッグし、視線Scripts フォルダーからのクラス、 Main Cameraオブジェクト、階層パネルします。Click and drag the Gaze class from the Scripts folder to the Main Camera object in the Hierarchy Panel.

第 10 章 – AzureServices クラスの完了Chapter 10 - Completing the AzureServices class

場所にその他のスクリプトを使用して行うことが今すぐ完了AzureServicesクラス。With the other scripts in place, it is now possible to complete the AzureServices class. これは、によって実現されます。This will be achieved through:

  1. という名前の新しいメソッドを追加するCreateCloudIdentityAsync() Azure と通信するために必要な認証の変数を設定します。Adding a new method named CreateCloudIdentityAsync(), to set up the authentication variables needed for communicating with Azure.

    このメソッドは図形の一覧を含んでいる以前に格納されているファイルが存在することも確認します。This method will also check for the existence of a previously stored File containing the Shape List.

    ファイルが見つかった場合、ユーザーを無効にするには、視線に格納されている、図形のパターンに従って、図形の作成をトリガーし、 Azure Storage ファイルします。If the file is found, it will disable the user Gaze, and trigger Shape creation, according to the pattern of shapes, as stored in the Azure Storage file. ユーザーが、これとして表示、テキスト メッシュ表示が提供されます 'Storage' または図形の送信元によって ' New' をします。The user can see this, as the Text Mesh will provide display 'Storage' or 'New', depending on the shapes origin.

    ファイルが見つからない場合が有効になります、視線、見る際に図形を作成するユーザーを有効にすると、 GazeButtonシーン内のオブジェクト。If no file is found, it will enable the Gaze, enabling the user to create shapes when looking at the GazeButton object in the scene.

        /// <summary>
        /// Create the references necessary to log into Azure
        /// </summary>
        private async void CreateCloudIdentityAsync()
        {
            // Retrieve storage account information from connection string
            storageAccount = CloudStorageAccount.Parse(storageConnectionString);
    
            // Create a file client for interacting with the file service.
            fileClient = storageAccount.CreateCloudFileClient();
    
            // Create a share for organizing files and directories within the storage account.
            share = fileClient.GetShareReference(fileShare);
    
            await share.CreateIfNotExistsAsync();
    
            // Get a reference to the root directory of the share.
            CloudFileDirectory root = share.GetRootDirectoryReference();
    
            // Create a directory under the root directory
            dir = root.GetDirectoryReference(storageDirectory);
    
            await dir.CreateIfNotExistsAsync();
    
            //Check if the there is a stored text file containing the list
            shapeIndexCloudFile = dir.GetFileReference("TextShapeFile");
    
            if (!await shapeIndexCloudFile.ExistsAsync())
            {
                // File not found, enable gaze for shapes creation
                Gaze.instance.GazeEnabled = true;
    
                azureStatusText.text = "No Shape\nFile!";
            }
            else
            {
                // The file has been found, disable gaze and get the list from the file
                Gaze.instance.GazeEnabled = false;
    
                azureStatusText.text = "Shape File\nFound!";
    
                await ReplicateListFromAzureAsync();
            }
        }
    
  2. 次のコード スニペットは、内から、 Start() メソッドは、呼び出しができる、 CreateCloudIdentityAsync() メソッド。The next code snippet is from within the Start() method; wherein a call will be made to the CreateCloudIdentityAsync() method. 現在経由でコピーする自由Start() メソッドの下。Feel free to copy over your current Start() method, with the below:

        private void Start()
        {
            // Disable TLS cert checks only while in Unity Editor (until Unity adds support for TLS)
    #if UNITY_EDITOR
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    #endif
    
            // Set the Status text to loading, whilst attempting connection to Azure.
            azureStatusText.text = "Loading...";
    
            //Creating the references necessary to log into Azure and check if the Storage Directory is empty
            CreateCloudIdentityAsync();
        }
    
  3. メソッドのコードを入力CallAzureFunctionForNextShape() します。Fill in the code for the method CallAzureFunctionForNextShape(). 使用前に作成したAzure Function App図形のインデックスを要求します。You will use the previously created Azure Function App to request a shape index. このメソッドが図形を送信する新しい図形を受信すると、 ShapeFactoryシーン内に新しい図形を作成するクラス。Once the new shape is received, this method will send the shape to the ShapeFactory class to create the new shape in the scene. 完了の本文を次のコードを使用してCallAzureFunctionForNextShape() します。Use the code below to complete the body of CallAzureFunctionForNextShape().

        /// <summary>
        /// Call to the Azure Function App to request a Shape.
        /// </summary>
        public async void CallAzureFunctionForNextShape()
        {
            int azureRandomInt = 0;
    
            // Call Azure function
            HttpWebRequest webRequest = WebRequest.CreateHttp(azureFunctionEndpoint);
    
            WebResponse response = await webRequest.GetResponseAsync();
    
            // Read response as string
            using (Stream stream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream);
    
                String responseString = reader.ReadToEnd();
    
                //parse result as integer
                Int32.TryParse(responseString, out azureRandomInt);
            }
    
            //add random int from Azure to the ShapeIndexList
            ShapeFactory.instance.shapeHistoryList.Add(azureRandomInt);
    
            ShapeFactory.instance.CreateShape(azureRandomInt, false);
    
            //Save to Azure storage
            await UploadListToAzureAsync();
        }
    
  4. 保存することで、図形の履歴リストに格納する整数を連結して文字列を作成するメソッドを追加、 Azure Storage ファイルします。Add a method to create a string, by concatenating the integers stored in the shape history list, and saving it in your Azure Storage File.

        /// <summary>
        /// Upload the locally stored List to Azure
        /// </summary>
        private async Task UploadListToAzureAsync()
        {
            // Uploading a local file to the directory created above
            string listToString = string.Join(",", ShapeFactory.instance.shapeHistoryList.ToArray());
    
            await shapeIndexCloudFile.UploadTextAsync(listToString);
        }
    
  5. あるファイルに格納されているテキストを取得するメソッドを追加、 Azure Storage ファイル逆シリアル化一覧にします。Add a method to retrieve the text stored in the file located in your Azure Storage File and deserialize it into a list.

  6. このプロセスが完了すると、メソッドを再度有効に、視線の先、ユーザーが図形をシーンに追加できるようにします。Once this process is completed, the method re-enables the gaze so that the user can add more shapes to the scene.

        ///<summary>
        /// Get the List stored in Azure and use the data retrieved to replicate 
        /// a Shape creation pattern
        ///</summary>
        private async Task ReplicateListFromAzureAsync()
        {
            string azureTextFileContent = await shapeIndexCloudFile.DownloadTextAsync();
    
            string[] shapes = azureTextFileContent.Split(new char[] { ',' });
    
            foreach (string shape in shapes)
            {
                int i;
    
                Int32.TryParse(shape.ToString(), out i);
    
                ShapeFactory.instance.shapeHistoryList.Add(i);
    
                ShapeFactory.instance.CreateShape(i, true);
    
                await Task.Delay(500);
            }
    
            Gaze.instance.GazeEnabled = true;
    
            azureStatusText.text = "Load Complete!";
        }
    
  7. Visual Studio で Unity に戻る前に、変更を保存します。Save your changes in Visual Studio before returning to Unity.

第 11 章 – UWP ソリューションのビルドChapter 11 - Build the UWP Solution

ビルド プロセスを開始します。To begin the Build process:

  1. 移動してファイル > のビルド設定します。Go to File > Build Settings.

    アプリをビルドします

  2. [Build] をクリックします。Click Build. Unity を起動、ファイル エクスプ ローラーウィンドウを作成しにアプリをビルドするフォルダーを選択する必要があります。Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. ここで、そのフォルダーを作成し、名前アプリします。Create that folder now, and name it App. 使用し、アプリフォルダーを選択すると、キーを押してフォルダーの選択します。Then with the App folder selected, press Select Folder.

  3. Unity にプロジェクトをビルドを開始、アプリフォルダー。Unity will begin building your project to the App folder.

  4. 1 回 Unity には、(少し時間がかかる場合があります) ビルドが完了したが開き、ファイル エクスプ ローラービルドの位置にあるウィンドウ (上の windows では、常に表示されないの新しい追加の通知をタスク バーを確認ウィンドウ)。Once Unity has finished building (it might take some time), it will open a File Explorer window at the location of your build (check your task bar, as it may not always appear above your windows, but will notify you of the addition of a new window).

第 12 章 - アプリケーションのデプロイChapter 12 - Deploying your application

アプリケーションを配置します。To deploy your application:

  1. 移動し、アプリで作成されたフォルダー、最後の章します。Navigate to the App folder which was created in the last Chapter. アプリ名に '.sln' の拡張機能は、する必要がありますをダブルクリックすると、ファイルが表示されます、内で開くためにVisual Studioします。You will see a file with your apps name, with the '.sln' extension, which you should double-click, so to open it within Visual Studio.

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

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

    Microsoft HoloLens にすることがあります方が簡単なこれを設定するリモート マシン、するは、コンピューターにテザリングされたしないようにします。For the Microsoft HoloLens, you may find it easier to set this to Remote Machine, so that you are not tethered to your computer. ただし、次の操作も必要があります。Though, you will need to also do the following:

    • 把握、 IP アドレス内では、HoloLens の設定 > ネットワークとインターネット > Wi-fi > 詳細オプション;、IPv4 では、アドレスを使用する必要があります。Know the IP Address of your HoloLens, which can be found within the Settings > Network & Internet > Wi-Fi > Advanced Options; the IPv4 is the address you should use.
    • 確認開発者モード; で見つかった設定 > 更新とセキュリティ > 開発者向けします。Ensure Developer Mode is On; found in Settings > Update & Security > For developers.

    ソリューションを配置します。

  4. 移動して、ビルドメニューをクリックしますソリューションの配置をコンピューターにアプリケーションをサイドローディングします。Go to the 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 and tested!

完成した、Azure Functions と Storage アプリケーションYour finished Azure Functions and Storage Application

これで、Azure Functions と Azure Storage の両方のサービスを利用している mixed reality アプリを構築します。Congratulations, you built a mixed reality app that leverages both the Azure Functions and Azure Storage services. アプリは格納されたデータは、上に描画し、そのデータに基づいてアクションを提供することになります。Your app will be able to draw on stored data, and provide an action based on that data.

最終的な製品-終了

ボーナスの演習Bonus exercises

手順 1Exercise 1

ポイントとから作成されたオブジェクトの状態を生成するレコードは、2 つ目の生成を作成します。Create a second spawn point and record which spawn point an object was created from. データ ファイルを読み込むときに、もともと作成された場所から子の図形を再生します。When you load the data file, replay the shapes being spawned from the location they originally were created.

手順 2Exercise 2

毎回を再び開くにせずに、アプリを再起動する方法を作成します。Create a way to restart the app, rather than having to re-open it each time. シーンを読み込むは適切なスポットを開始します。Loading Scenes is a good spot to start. 格納リストをクリアする方法を作成した後、 Azure Storage、アプリから簡単にリセットできるようにします。After doing that, create a way to clear the stored list in Azure Storage, so that it can be easily reset from your app.