注意

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 312:ボットの統合MR and Azure 312: Bot integration

このコースでは、作成して、Microsoft Bot Framework V4 を使用してボットをデプロイし、Windows Mixed Reality アプリケーションを介して通信する方法を学びます。In this course, you will learn how to create and deploy a bot using the Microsoft Bot Framework V4 and communicate with it through a Windows Mixed Reality application.

Microsoft Bot Framework V4一連の Api は、拡張可能かつスケーラブルなボットをビルドするツールを開発者に提供するように設計されてアプリケーション。The Microsoft Bot Framework V4 is a set of APIs designed to provide developers with the tools to build an extensible and scalable bot application. 詳細については、次を参照してください。、 Microsoft Bot Framework ページまたはV4 の Git リポジトリします。For more information, visit the Microsoft Bot Framework page or the V4 Git Repository.

このコースを完了するは、次のことが Windows Mixed Reality アプリケーションを構築したは。After completing this course, you will have built a Windows Mixed Reality application, which will be able to do the following:

  1. 使用して、タップ ジェスチャボット ユーザー ボイスのリッスンを開始します。Use a Tap Gesture to start the bot listening for the users voice.
  2. 何か、ユーザーが話したが、ボットは、応答を提供しようとします。When the user has said something, the bot will attempt to provide a response.
  3. Unity シーンでボットに近くに配置されたテキストとしてボットの応答を表示します。Display the bots reply as text, positioned near the bot, in the Unity Scene.

アプリケーションでは、責任ですが、設計と、結果を統合する方法について。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 312:ボットの統合MR and Azure 312: Bot integration ✔️✔️ ✔️✔️

注意

このコースは、HoloLens で主にフォーカスします、Windows Mixed Reality 没入型 (VR) ヘッドセットには、このコースで学習する内容を適用することもできます。While this course primarily focuses on HoloLens, you can also apply what you learn in this course to Windows Mixed Reality immersive (VR) headsets. (VR) のイマーシブ ヘッドセットはアクセス可能な cameras があるないため、外部のカメラを PC に接続されている必要があります。Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. コースを実行するとき、没入型の (VR) ヘッドセットをサポートするために使用する必要があります変更でノートが表示されます。As you follow along with the course, you will see notes on any changes you might need to employ to support immersive (VR) headsets.

前提条件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

  1. このプロジェクトのビルドの問題の発生を避けるため、強くお勧めのルートまたはルート近くフォルダーでこのチュートリアルで説明したようにプロジェクトを作成すること (長いフォルダー パスはビルド時に問題を発生できます)。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).
  2. 設定して、HoloLens をテストします。Set up and test your HoloLens. 場合は、HoloLens の設定をサポートする必要があるHoloLens のセットアップ記事を参照してください。 確認します。If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. (場合によって役立ちますユーザーごとにこれらのタスクを実行する) 新しい HoloLens アプリの開発を始めるときに、調整とセンサーのチューニングを実行することをお勧めします。It is a good idea to perform Calibration and Sensor Tuning when beginning developing a new HoloLens app (sometimes it can help to perform those tasks for each user).

調整に関するヘルプを参照するに従ってくださいこのHoloLens 調整記事へのリンクします。For help on Calibration, please follow this link to the HoloLens Calibration article.

センサーの調整に関する詳細についてに従ってくださいこのHoloLens センサー チューニング記事へのリンクします。For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

第 1 章 – ボット アプリケーションを作成します。Chapter 1 – Create the Bot application

最初の手順では、ローカル ASP.Net Core Web アプリケーションとしてのお客様のボットを作成します。The first step is to create your bot as a local ASP.Net Core Web application. 完了し、テストが、Azure ポータルに発行します。Once you have finished and tested it, you will publish it to the Azure Portal.

  1. Visual Studio を開きます。Open Visual Studio. 新しいプロジェクトを作成ASP NET Core Web アプリケーション(は検索、.NET Core のサブセクションの下) プロジェクトの種類として、呼び出すMyBotします。Create a new project, select ASP NET Core Web Application as the project type (you will find it under the subsection .NET Core) and call it MyBot. [OK] をクリックします。Click OK.

  2. 表示されるウィンドウでします。In the Window that will appear select Empty. またことを確認して、ターゲットに設定されてASP NET Core 2.0 、認証に設定されてと認証なしAlso make sure the target is set to ASP NET Core 2.0 and the Authentication is set to No Authentication. [OK] をクリックします。Click OK.

    ボット アプリケーションを作成します。

  3. ソリューションを開きます。The solution will now open. ソリューションを右クリックしてMybotで、ソリューション エクスプ ローラー をクリックソリューションの NuGet パッケージの管理します。Right-click on Solution Mybot in the Solution Explorer and click on Manage NuGet Packages for Solution.

    ボット アプリケーションを作成します。

  4. 参照 タブで、検索Microsoft.Bot.Builder.Integration.AspNet.Core (があるかどうかを確認プレリリースを含めるチェック)。In the Browse tab, search for Microsoft.Bot.Builder.Integration.AspNet.Core (make sure you have Include pre-release checked). パッケージのバージョンを選択します。 4.0.1-preview、し、プロジェクトのボックスをオンにします。Select the package version 4.0.1-preview, and tick the project boxes. をクリックしてインストールします。Then click on Install. 必要なライブラリがインストールされているようになりました、 Bot Framework v4します。You have now installed the libraries needed for the Bot Framework v4. NuGet ページを閉じます。Close the NuGet page.

    ボット アプリケーションを作成します。

  5. 右クリックし、プロジェクトMyBotソリューション エクスプ ローラー をクリック 追加 | クラスします。Right-click on your Project, MyBot, in the Solution Explorer and click on Add | Class.

    ボット アプリケーションを作成します。

  6. クラスの名前MyBot をクリック追加します。Name the class MyBot and click on Add.

    ボット アプリケーションを作成します。

  7. という名前の別のクラスを作成する前のポイントを繰り返してConversationContextします。Repeat the previous point, to create another class named ConversationContext.

  8. 右クリックしてwwwrootで、ソリューション エクスプ ローラー ] をクリック追加 | [新しい項目.Right-click on wwwroot in the Solution Explorer and click on Add | New Item. 選択HTML ページ(が見つかったら Web サブセクションの下)。Select HTML Page (you will find it under the subsection Web). ファイルに名前をdefault.htmlします。Name the file default.html. [追加] をクリックします。Click Add.

    ボット アプリケーションを作成します。

  9. クラスの一覧内のオブジェクト/、ソリューション エクスプ ローラー次の図のようになります。The list of classes / objects in the Solution Explorer should look like the image below.

    ボット アプリケーションを作成します。

  10. ダブルクリックして、 ConversationContextクラス。Double-click on the ConversationContext class. このクラスは、メッセージ交換のコンテキストを維持するために、ボットで使用される変数を保持する責任を負います。This class is responsible for holding the variables used by the bot to maintain the context of the conversation. ため、これらのメッセージ交換コンテキスト値が、このクラスのインスタンスで保持されるの任意のインスタンス、 MyBotクラスは、アクティビティが受信されるたびに更新されます。These conversation context values are maintained in an instance of this class, because any instance of the MyBot class will refresh each time an activity is received. このクラスに次のコードを追加します。Add the following code to the class:

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. ダブルクリックして、 MyBotクラス。Double-click on the MyBot class. このクラスは、顧客から任意の受信アクティビティによって呼び出されるハンドラーをホストします。This class will host the handlers called by any incoming activity from the customer. このクラスは、ボットと顧客の間でメッセージ交換を構築するために使用するコードを追加します。In this class you will add the code used to build the conversation between the bot and the customer. 前述のように、このクラスのインスタンスはアクティビティが受信されるたびに初期化されます。As mentioned earlier, an instance of this class is initialized each time an activity is received. このクラスには、次のコードを追加します。Add the following code to this class:

    using Microsoft.Bot;
    using Microsoft.Bot.Builder;
    using Microsoft.Bot.Schema;
    using System.Threading.Tasks;
    
    namespace MyBot
    {
        public class MyBot : IBot
        {       
            public async Task OnTurn(ITurnContext context)
            {
                ConversationContext.userMsg = context.Activity.Text;
    
                if (context.Activity.Type is ActivityTypes.Message)
                {
                    if (string.IsNullOrEmpty(ConversationContext.userName))
                    {
                        ConversationContext.userName = ConversationContext.userMsg;
                        await context.SendActivity($"Hello {ConversationContext.userName}. Looks like today it is going to rain. \nLuckily I have umbrellas and waterproof jackets to sell!");
                    }
                    else
                    {
                        if (ConversationContext.userMsg.Contains("how much"))
                        {
                            if (ConversationContext.userMsg.Contains("umbrella")) await context.SendActivity($"Umbrellas are $13.");
                            else if (ConversationContext.userMsg.Contains("jacket")) await context.SendActivity($"Waterproof jackets are $30.");
                            else await context.SendActivity($"Umbrellas are $13. \nWaterproof jackets are $30.");
                        }
                        else if (ConversationContext.userMsg.Contains("color") || ConversationContext.userMsg.Contains("colour"))
                        {
                            await context.SendActivity($"Umbrellas are black. \nWaterproof jackets are yellow.");
                        }
                        else
                        {
                            await context.SendActivity($"Sorry {ConversationContext.userName}. I did not understand the question");
                        }
                    }
                }
                else
                {
    
                    ConversationContext.userMsg = string.Empty;
                    ConversationContext.userName = string.Empty;
                    await context.SendActivity($"Welcome! \nI am the Weather Shop Bot \nWhat is your name?");
                }
    
            }
        }
    }
    
  12. ダブルクリックして、スタートアップクラス。Double-click on the Startup class. このクラスは、ボットを初期化します。This class will initialize the bot. このクラスに次のコードを追加します。Add the following code to the class:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Bot.Builder.BotFramework;
    using Microsoft.Bot.Builder.Integration.AspNet.Core;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace MyBot
    {
    public class Startup
        {
            public IConfiguration Configuration { get; }
    
            public Startup(IHostingEnvironment env)
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
                Configuration = builder.Build();
            }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddSingleton(_ => Configuration);
                services.AddBot<MyBot>(options =>
                {
                    options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);
                });
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseDefaultFiles();
                app.UseStaticFiles();
                app.UseBotFramework();
            }
        }
    }
    
  13. 開く、プログラムクラス ファイルおよび内のコードは、次の場合と同じことを確認します。Open the Program class file and verify the code in it is the same as the following:

    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    
    namespace MyBot
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                BuildWebHost(args).Run();
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .Build();
        }
    }
    
  14. 移動するためには、変更を保存するファイル > すべて保存、Visual Studio の上部にあるツールバーから。Remember to save your changes, to do so, go to File > Save All, from the toolbar at the top of Visual Studio.

Chapter 2 - Azure Bot Service を作成します。Chapter 2 - Create the Azure Bot Service

インスタンスに公開がお客様のボットのコードを作成したら、これで、 Web App Bot Azure Portal でのサービスです。Now that you have built the code for your bot, you have to publish it to an instance of the Web App Bot Service, on the Azure Portal. この章では、作成、azure Bot Service を構成して、コードを発行する方法を示します。This Chapter will show you how to create and configure the Bot Service on Azure and then publish your code to it.

  1. 最初に、Azure ポータルにログイン (https://portal.azure.com)します。First, log in to the Azure Portal (https://portal.azure.com).

    1. 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. ログインした後は、をクリックしてリソースの作成左上隅にある検索してWeb App bot、 をクリックEnterします。Once you are logged in, click on Create a resource in the top left corner, and search for Web App bot, and click Enter.

    Azure Bot Service を作成します。

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

    Azure Bot Service を作成します。

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

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

    2. 選択、サブスクリプションします。Select a 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 courses) under a common resource group).

      詳細にする場合、Azure リソース グループについてこのリンクに従ってくださいIf you wish to read more about Azure Resource Groups, please follow this link

    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. 選択、価格レベル場合、これは、最初に、適切な時間を作成する、 Web App Botサービス、(F0 という名前)、free レベルを使用可能にする必要がありますSelect the Pricing Tier appropriate for you, if this is the first time creating a Web App Bot Service, a free tier (named F0) should be available to you

    6. アプリ名だけおくことができますと同じ、ボット名します。App name can just be left the same as the Bot name.

    7. ままに、 Bot テンプレートとして基本的な (C#) します。Leave the Bot template as Basic (C#).

    8. App service プラン/場所アカウントに自動的に入力されている必要があります。App service plan/Location should have been auto-filled for your account.

    9. 設定、 Azure Storageを使用して、ボットをホストします。Set the Azure Storage that you wish to use to host your Bot. 既にいずれかがあるない場合、ここで作成することができます。If you dont have one already, you can create it here.

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

    11. [作成] をクリックします。Click Create.

      Azure Bot Service を作成します。

  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 Bot Service を作成します。

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

    Azure Bot Service を作成します。

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

    Azure Bot Service を作成します。

  9. この時点でと呼ばれる機能をセットアップする必要がありますDirect Lineこのボット サービスと通信するクライアント アプリケーションを許可します。At this point you need to setup a feature called Direct Line to allow your client application to communicate with this Bot Service. をクリックしてチャネル、次に、おすすめチャンネルの追加セクションで、をクリックして構成 Direct Line channelします。Click on Channels, then in the Add a featured channel section, click on Configure Direct Line channel.

    Azure Bot Service を作成します。

  10. このページでは紹介、秘密鍵クライアント アプリ、ボットと認証を行うことができます。In this page you will find the Secret keys that will allow your client app to authenticate with the bot. をクリックして、表示ボタンをクリックし、プロジェクトの後半で必要になるように、表示されているキーの 1 つのコピーを作成します。Click on the Show button and take a copy of one of the displayed Keys, as you will need this later in your project.

    Azure Bot Service を作成します。

第 3 章 – ボットを Azure Web App Bot のサービスに発行します。Chapter 3 – Publish the Bot to the Azure Web App Bot Service

準備ができたら、サービス、以前は、新しく作成された Web App Bot Service を作成したボット コードを発行する必要があります。Now that your Service is ready, you need to publish your Bot code, that you built previously, to your newly created Web App Bot Service.

注意

ボットのソリューションに変更を加えるたびに、Azure サービスにお客様のボットを発行する必要があります/コードします。You will have to publish your Bot to the Azure Service every time you make changes to the Bot solution / code.

  1. 以前作成した Visual Studio ソリューションに戻ります。Go back to your Visual Studio Solution that you created previously.

  2. 右クリックし、 MyBotプロジェクトのソリューション エクスプ ローラー発行します。Right-click on your MyBot project, in the Solution Explorer, then click on Publish.

    ボットを Azure Web App Bot Service に発行します。

  3. 発行先を選択 ページで App Service、し既存の、最後に、をクリックしてプロファイルの作成(する必要があります横のドロップダウン矢印をクリックして、発行ボタンが表示されない場合)。On the Pick a publish target page, click App Service, then Select Existing, lastly click on Create Profile (you may need to click on the dropdown arrow alongside the Publish button, if this is not visible).

    ボットを Azure Web App Bot Service に発行します。

  4. まだログインいない Microsoft アカウントに場合に、ここで行う必要。If you are not yet logged in into your Microsoft Account, you have to do it here.

  5. 発行ページには、同じように設定する必要があるサブスクリプションに使用した、 Web App Botサービスの作成。On the Publish page you will find you have to set the same Subscription that you used for the Web App Bot Service creation. 設定し、ビューとしてリソース グループし、フォルダー構造ドロップダウンで選択、リソース グループ以前に作成しました。Then set the View as Resource Group and, in the drop down folder structure, select the Resource Group you have created previously. [OK] をクリックします。Click OK.

    ボットを Azure Web App Bot Service に発行します。

  6. ここでをクリックして、発行ボタンをクリックし、ボットを発行するまで待ちます (少し時間がかかる場合があります)。Now click on the Publish button, and wait for the Bot to be published (it might take a few minutes).

    ボットを Azure Web App Bot Service に発行します。

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

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

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

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

  2. これで、Unity プロジェクトの名前を指定する必要があります。You will now need to provide a Unity project name. 挿入Hololens ボットします。Insert Hololens Bot. 必ず、プロジェクト テンプレートに設定されて3Dします。Make sure the project 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 select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

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

  5. ファイル > Build Settingsことを確認してください。While still in File > Build Settings and make sure that:

    1. デバイスを対象にに設定されているHololensTarget Device is set to Hololens

      イマーシブ ヘッドセット、設定ターゲット デバイス任意のデバイスします。For the immersive headsets, set Target Device to Any Device.

    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.

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

      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.

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

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

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

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

  6. 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 プロジェクトを設定します。

  7. このパネルは、いくつかの設定を確認する必要があります。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); changing this will require a restart of 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

      • マイクMicrophone

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

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

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

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

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

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

第 5 章 – カメラのセットアップChapter 5 – Camera setup

重要

スキップする場合、 Unity を設定するコンポーネントのこのコースで、コードにまっすぐコンティニュし、自由にこれをダウンロードAzure MR 312 Package.unitypackage、としてプロジェクトにインポートカスタム パッケージから続けて第 7 章します。If you wish to skip the Unity Set up component of this course, and continue straight into code, feel free to download this Azure-MR-312-Package.unitypackage, import it into your project as a Custom Package, and then continue from Chapter 7.

  1. 階層パネルを選択、 Main Cameraします。In the Hierarchy panel, select the Main Camera.

  2. すべてのコンポーネントを参照してください。 選択すると、ができる、 Main Cameraで、インスペクター パネルします。Once selected, you will be able to see all the components of the Main Camera in the Inspector panel.

    1. Camera オブジェクト名前を指定する必要がありますMain Camera (スペルに注意してください)The Camera object must be named Main Camera (note the spelling)
    2. Main Cameraタグに設定する必要がありますMainCamera (スペルに注意してください)The Main Camera Tag must be set to MainCamera (note the spelling)
    3. 必ず、変換位置に設定されている0, 0, 0Make sure the Transform Position is set to 0, 0, 0
    4. 設定フラグをクリア単色します。Set Clear Flags to Solid Color.
    5. 設定、バック グラウンドにカメラのコンポーネントの色黒、アルファ 0 (16 進コード: #00000000)Set the Background Color of the Camera component to Black, Alpha 0 (Hex Code: #00000000)

    カメラのセットアップ

第 6 章 – Newtonsoft ライブラリのインポートChapter 6 – Import the Newtonsoft library

逆シリアル化し、Bot Service の送受信にオブジェクトをシリアル化するのに役立つダウンロードする必要があります、 Newtonsoftライブラリ。To help you deserialize and serialize objects received and sent to the Bot Service you need to download the Newtonsoft library. 互換性のあるバージョンが既に適切な Unity のフォルダー構造を持つ編成します。You will find a compatible version already organized with the correct Unity folder structure here.

プロジェクトに Newtonsoft ライブラリをインポートするには、このコースに付属する Unity パッケージを使用します。To import the Newtonsoft library into your project, use the Unity Package which came with this course.

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

    Newtonsoft ライブラリをインポートします。

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

    Newtonsoft ライブラリをインポートします。

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

  4. 移動して、 Newtonsoftの下のフォルダープラグインプロジェクト ビューと、Newtonsoft のプラグインを選びます。Go to the Newtonsoft folder under Plugins in the project view and select the Newtonsoft plugin.

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

    注意

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

  6. 次を開く必要があります、 WSAフォルダー内で、 Newtonsoftフォルダー。Next, you need to open the WSA folder, within the Newtonsoft folder. 構成した同じファイルのコピーが表示されます。You will see a copy of the same file you just configured. ファイルを選択し、インスペクターのことを確認しますSelect the file, and then in the inspector, ensure that

    • 任意のプラットフォームオフAny Platform is unchecked
    • のみ WSAPlayerチェックonly WSAPlayer is checked
    • 処理されないようにチェックDont process is checked

第 7 – 章、BotTag を作成します。Chapter 7 – Create the BotTag

  1. 新規作成タグと呼ばれるオブジェクトBotTagします。Create a new Tag object called BotTag. シーンでは、メイン カメラを選択します。Select the Main Camera in the scene. タグのドロップダウン インスペクターのパネルでメニューをクリックします。Click on the Tag drop down menu in the Inspector panel. をクリックしてタグを追加します。Click on Add Tag.

    カメラのセットアップ

  2. をクリックして、 + シンボル。Click on the + symbol. 新しい名前タグとしてBotTag保存します。Name the new Tag as BotTag, Save.

    カメラのセットアップ

警告

しない適用、 BotTagメイン カメラにします。Do not apply the BotTag to the Main Camera. 誤ってこれを実行して場合、タグを Main Camera の変更を必ずMainCameraします。If you have accidentally done this, make sure to change the Main Camera tag back to MainCamera.

第 8 章 – BotObjects クラスを作成します。Chapter 8 – Create the BotObjects class

最初のスクリプトを作成する必要がありますが、 BotObjectsクラスは、空のクラスと同じスクリプト内で、一連の他のクラス オブジェクトを格納できるように、作成し、シーン内の他のスクリプトでアクセスします。The first script you need to create is the BotObjects class, which is an empty class created so that a series of other class objects can be stored within the same script and accessed by other scripts in the scene.

このクラスの作成はアーキテクチャの選択肢では純粋で、これらのオブジェクトは、このコースの後半で作成するボット スクリプトでホストされる代わりに可能性があります。The creation of this class is purely an architectural choice, these objects could instead be hosted in the Bot script that you will create later in this course.

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

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

    [スクリプト] フォルダーを作成します。

  2. ダブルクリックして、スクリプトフォルダーを開きます。Double-click on the Scripts folder to open it. そのフォルダーを右クリックし、内作成 >C#スクリプトします。Then within that folder, right-click, and select Create > C# Script. スクリプトの名前BotObjectsします。Name the script BotObjects.

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

  4. スクリプトの内容を削除し、次のコードに置き換えます。Delete the content of the script and replace it with the following code:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BotObjects : MonoBehaviour{}
    
    /// <summary>
    /// Object received when first opening a conversation
    /// </summary>
    [Serializable]
    public class ConversationObject
    {
        public string ConversationId;
        public string token;
        public string expires_in;
        public string streamUrl;
        public string referenceGrammarId;
    }
    
    /// <summary>
    /// Object including all Activities
    /// </summary>
    [Serializable]
    public class ActivitiesRootObject
    {
        public List<Activity> activities { get; set; }
        public string watermark { get; set; }
    }
    [Serializable]
    public class Conversation
    {
        public string id { get; set; }
    }
    [Serializable]
    public class From
    {
        public string id { get; set; }
        public string name { get; set; }
    }
    [Serializable]
    public class Activity
    {
        public string type { get; set; }
        public string channelId { get; set; }
        public Conversation conversation { get; set; }
        public string id { get; set; }
        public From from { get; set; }
        public string text { get; set; }
        public string textFormat { get; set; }
        public DateTime timestamp { get; set; }
        public string serviceUrl { get; set; }
    }
    
  5. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

第 9 章 – GazeInput クラスを作成します。Chapter 9 – Create the GazeInput class

次のクラスを作成することには、 GazeInputクラス。The next class you are going to create is the GazeInput class. このクラスは、責任を負います。This class is responsible for:

  • カーソルの作成を表す、視線プレーヤーの。Creating a cursor that will represent the gaze of the player.
  • ヒットして、player の視線入力オブジェクトを検出して、検出されたオブジェクトへの参照を保持しています。Detecting objects hit by the gaze of the player, and holding a reference to detected objects.

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

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

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

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

  4. クラス名の右側で最上位の次の行を挿入します。Insert the following line right on top of the class name:

    /// <summary>
    /// Class responsible for the User's gaze interactions
    /// </summary>
    [System.Serializable]
    public class GazeInput : MonoBehaviour
    
  5. 内で、次の変数を追加し、 GazeInputクラス上、 Start() メソッド。Then add the following variables inside the GazeInput class, above the Start() method:

        [Tooltip("Used to compare whether an object is to be interacted with.")]
        internal string InteractibleTag = "BotTag";
    
        /// <summary>
        /// Length of the gaze
        /// </summary>
        internal float GazeMaxDistance = 300;
    
        /// <summary>
        /// Object currently gazed
        /// </summary>
        internal GameObject FocusedObject { get; private set; }
    
        internal GameObject _oldFocusedObject { get; private set; }
    
        internal RaycastHit HitInfo { get; private set; }
    
        /// <summary>
        /// Cursor object visible in the scene
        /// </summary>
        internal GameObject Cursor { get; private set; }
    
        internal bool Hit { get; private set; }
    
        internal Vector3 Position { get; private set; }
    
        internal Vector3 Normal { get; private set; }
    
        private Vector3 _gazeOrigin;
    
        private Vector3 _gazeDirection;
    
  6. コードをStart() メソッドを追加する必要があります。Code for Start() method should be added. これが、クラスの初期化時に呼び出されます。This will be called when the class initializes:

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. インスタンス化し、視線の先のカーソルを設定するメソッドを実装します。Implement a method that will instantiate and setup the gaze cursor:

        /// <summary>
        /// Method to create a cursor object.
        /// </summary>
        internal GameObject CreateCursor()
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            newCursor.SetActive(false);
            // Remove the collider, so it does not block Raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
            newCursor.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
            Material mat = new Material(Shader.Find("Diffuse"));
            newCursor.GetComponent<MeshRenderer>().material = mat;
            mat.color = Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
            newCursor.SetActive(true);
    
            return newCursor;
        }
    
  8. メイン カメラから Raycast をセットアップしはの追跡、現在フォーカスがあるオブジェクト メソッドを実装します。Implement the methods that will setup the Raycast from the Main Camera and will keep track of the current focused object.

        /// <summary>
        /// Called every frame
        /// </summary>
        internal virtual void Update()
        {
            _gazeOrigin = Camera.main.transform.position;
    
            _gazeDirection = Camera.main.transform.forward;
    
            UpdateRaycast();
        }
    
    
        /// <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))
                {
                    // Provide the OnGazeExited event.
                    _oldFocusedObject.SendMessage("OnGazeExited", 
                        SendMessageOptions.DontRequireReceiver);
                }
            }
        }
    
    
        private void UpdateRaycast()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedObject;
            RaycastHit hitInfo;
    
            // Initialize Raycasting.
            Hit = Physics.Raycast(_gazeOrigin,
                _gazeDirection,
                out hitInfo,
                GazeMaxDistance);
            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. If so, reset the focused object.
            if (FocusedObject != _oldFocusedObject)
            {
                ResetFocusedObject();
                if (FocusedObject != null)
                {
                    if (FocusedObject.CompareTag(InteractibleTag))
                    {
                        // Provide the OnGazeEntered event.
                        FocusedObject.SendMessage("OnGazeEntered",
                            SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
        }
    
  9. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

第 10 章 – ボット クラスを作成します。Chapter 10 – Create the Bot class

作成しようとするスクリプトを呼び出すようになりましたボットします。The script you are going to create now is called Bot. これは、アプリケーションのコア クラス、格納されます。This is the core class of your application, it stores:

  • Web App Bot 資格情報Your Web App Bot credentials
  • ユーザーの音声コマンドを収集する方法The method that collects the user voice commands
  • Web アプリのボットと会話を開始するために必要なメソッドThe method necessary to initiate conversations with your Web App Bot
  • Web アプリのお客様のボットにメッセージを送信するために必要なメソッドThe method necessary to send messages to your Web App Bot

ボット サービスにメッセージを送信する、 SendMessageToBot() コルーチンは、ユーザーによって送信されるデータとして、Bot Framework によって認識されるオブジェクトでは、アクティビティを作成します。To send messages to the Bot Service, the SendMessageToBot() coroutine will build an activity, which is an object recognized by the Bot Framework as data sent by the user.

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

  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 Bot.

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

  4. 上部にある、次と同じである名前空間の更新、ボットクラス。Update the namespaces to be the same as the following, at the top of the Bot class:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using UnityEngine;
    using UnityEngine.Networking;
    using UnityEngine.Windows.Speech;
    
  5. 内で、ボットクラスは、次の変数を追加します。Inside the Bot class add the following variables:

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static Bot Instance;
    
        /// <summary>
        /// Material of the sphere representing the Bot in the scene
        /// </summary>
        internal Material botMaterial;
    
        /// <summary>
        /// Speech recognizer class reference, which will convert speech to text.
        /// </summary>
        private DictationRecognizer dictationRecognizer;
    
        /// <summary>
        /// Use this variable to identify the Bot Id
        /// Can be any value
        /// </summary>
        private string botId = "MRBotId";
    
        /// <summary>
        /// Use this variable to identify the Bot Name
        /// Can be any value
        /// </summary>
        private string botName = "MRBotName";
    
        /// <summary>
        /// The Bot Secret key found on the Web App Bot Service on the Azure Portal
        /// </summary>
        private string botSecret = "-- Add your Secret Key here --"; 
    
        /// <summary>
        /// Bot Endpoint, v4 Framework uses v3 endpoint at this point in time
        /// </summary>
        private string botEndpoint = "https://directline.botframework.com/v3/directline";
    
        /// <summary>
        /// The conversation object reference
        /// </summary>
        private ConversationObject conversation;
    
        /// <summary>
        /// Bot states to regulate the application flow
        /// </summary>
        internal enum BotState {ReadyToListen, Listening, Processing}
    
        /// <summary>
        /// Flag for the Bot state
        /// </summary>
        internal BotState botState;
    
        /// <summary>
        /// Flag for the conversation status
        /// </summary>
        internal bool conversationStarted = false;
    

    注意

    挿入することを確認、ボットのシークレット キーに、 botSecret変数。Make sure you insert your Bot Secret Key into the botSecret variable. メモは、 ボットのシークレット キー のこのコースでは、先頭に 第 2 章、手順 10You will have noted your Bot Secret Key at the beginning of this course, in Chapter 2, step 10.

  6. コードをAwake()Start() を追加する必要があります。Code for Awake() and Start() now needs to be added.

        /// <summary>
        /// Called on Initialization
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start()
        {
            botState = BotState.ReadyToListen;
        }
    
  7. 音声のキャプチャの開始し、終了時に、音声ライブラリによって呼び出される 2 つのハンドラーを追加します。Add the two handlers that are called by the speech libraries when voice capture begins and ends. DictationRecognizer言うと、ユーザーが停止したときに、ユーザーの声をキャプチャが自動的に停止します。The DictationRecognizer will automatically stop capturing the user voice when the user stops speaking.

        /// <summary>
        /// Start microphone capture.
        /// </summary>
        public void StartCapturingAudio()
        {
            botState = BotState.Listening;
            botMaterial.color = Color.red;
    
            // Start dictation
            dictationRecognizer = new DictationRecognizer();
            dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
            dictationRecognizer.Start();
        }
    
    
        /// <summary>
        /// Stop microphone capture.
        /// </summary>
        public void StopCapturingAudio()
        {
            botState = BotState.Processing;
            dictationRecognizer.Stop();
        }
    
    
  8. 次のハンドラーでは、ユーザーの音声入力の結果を収集し、Web アプリのボット サービスにメッセージを送信、コルーチンを呼び出します。The following handler collects the result of the user voice input and calls the coroutine responsible for sending the message to the Web App Bot Service.

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// </summary>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // Update UI with dictation captured
            Debug.Log($"User just said: {text}");      
    
            // Send dictation to Bot
            StartCoroutine(SendMessageToBot(text, botId, botName, "message"));
            StopCapturingAudio();
        }     
    
  9. 次のコルーチンがボットとのメッセージ交換を開始すると呼ばれます。The following coroutine is called to begin a conversation with the Bot. メッセージ交換の呼び出しが完了したら、それを呼び出すことがわかります、 SendMessageToCoroutine() 一連の空のメッセージとして、Bot Service に送信するアクティビティを設定するパラメーターを渡すことによって。You will notice that once the conversation call is complete, it will call the SendMessageToCoroutine() by passing a series of parameters that will set the activity to be sent to the Bot Service as an empty message. これは、ダイアログを開始するボット サービスを要求します。This is done to prompt the Bot Service to initiate the dialogue.

        /// <summary>
        /// Request a conversation with the Bot Service
        /// </summary>
        internal IEnumerator StartConversation()
        {
            string conversationEndpoint = string.Format("{0}/conversations", botEndpoint);
    
            WWWForm webForm = new WWWForm();
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(conversationEndpoint, webForm))
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + botSecret);
                unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
    
                yield return unityWebRequest.SendWebRequest();
                string jsonResponse = unityWebRequest.downloadHandler.text;
    
                conversation = new ConversationObject();
                conversation = JsonConvert.DeserializeObject<ConversationObject>(jsonResponse);
                Debug.Log($"Start Conversation - Id: {conversation.ConversationId}");
                conversationStarted = true; 
            }
    
            // The following call is necessary to create and inject an activity of type //"conversationUpdate" to request a first "introduction" from the Bot Service.
            StartCoroutine(SendMessageToBot("", botId, botName, "conversationUpdate"));
        }    
    
  10. 次のコルーチンは、Bot Service に送信するアクティビティを構築すると呼ばれます。The following coroutine is called to build the activity to be sent to the Bot Service.

        /// <summary>
        /// Send the user message to the Bot Service in form of activity
        /// and call for a response
        /// </summary>
        private IEnumerator SendMessageToBot(string message, string fromId, string fromName, string activityType)
        {
            Debug.Log($"SendMessageCoroutine: {conversation.ConversationId}, message: {message} from Id: {fromId} from name: {fromName}");
    
            // Create a new activity here
            Activity activity = new Activity();
            activity.from = new From();
            activity.conversation = new Conversation();
            activity.from.id = fromId;
            activity.from.name = fromName;
            activity.text = message;
            activity.type = activityType;
            activity.channelId = "DirectLineChannelId";
            activity.conversation.id = conversation.ConversationId;     
    
            // Serialize the activity
            string json = JsonConvert.SerializeObject(activity);
    
            string sendActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId);
    
            // Send the activity to the Bot
            using (UnityWebRequest www = new UnityWebRequest(sendActivityEndpoint, "POST"))
            {
                www.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json));
    
                www.downloadHandler = new DownloadHandlerBuffer();
                www.SetRequestHeader("Authorization", "Bearer " + botSecret);
                www.SetRequestHeader("Content-Type", "application/json");
    
                yield return www.SendWebRequest();
    
                // extrapolate the response Id used to keep track of the conversation
                string jsonResponse = www.downloadHandler.text;
                string cleanedJsonResponse = jsonResponse.Replace("\r\n", string.Empty);
                string responseConvId = cleanedJsonResponse.Substring(10, 30);
    
                // Request a response from the Bot Service
                StartCoroutine(GetResponseFromBot(activity));
            }
        }
    
  11. 次のコルーチンがアクティビティ ボット サービスに送信される応答を要求すると呼ばれます。The following coroutine is called to request a response after sending an activity to the Bot Service.

        /// <summary>
        /// Request a response from the Bot by using a previously sent activity
        /// </summary>
        private IEnumerator GetResponseFromBot(Activity activity)
        {
            string getActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId);
    
            using (UnityWebRequest unityWebRequest1 = UnityWebRequest.Get(getActivityEndpoint))
            {
                unityWebRequest1.downloadHandler = new DownloadHandlerBuffer();
                unityWebRequest1.SetRequestHeader("Authorization", "Bearer " + botSecret);
    
                yield return unityWebRequest1.SendWebRequest();
    
                string jsonResponse = unityWebRequest1.downloadHandler.text;
    
                ActivitiesRootObject root = new ActivitiesRootObject();
                root = JsonConvert.DeserializeObject<ActivitiesRootObject>(jsonResponse);
    
                foreach (var act in root.activities)
                {
                    Debug.Log($"Bot Response: {act.text}");
                    SetBotResponseText(act.text);
                }
    
                botState = BotState.ReadyToListen;
                botMaterial.color = Color.blue;
            }
        } 
    
  12. シーン内のメッセージを表示するには、このクラスは、追加する最後のメソッドが必要です。The last method to be added to this class, is required to display the message in the scene:

        /// <summary>
        /// Set the UI Response Text of the bot
        /// </summary>
        internal void SetBotResponseText(string responseString)
        {        
            SceneOrganiser.Instance.botResponseText.text =  responseString;
        }
    

    注意

    見つからない場合の Unity エディターのコンソール内でエラーが生じる、 SceneOrganiserクラス。You may see an error within the Unity Editor Console, about missing the SceneOrganiser class. チュートリアルの後半でこのクラスを作成すると、このメッセージを無視してください。Disregard this message, as you will create this class later in the tutorial.

  13. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

第 11 章 – 相互作用クラスを作成します。Chapter 11 – Create the Interactions class

作成しようとするクラスを今すぐ呼びますの相互作用します。The class you are going to create now is called Interactions. このクラスは、ユーザーから、HoloLens をタップして入力を検出するために使用されます。This class is used to detect the HoloLens Tap Input from the user.

見ながら、ユーザーがタップした場合、ボットボット、シーン内のオブジェクトが音声入力をリッスンする準備ができて、ボットのオブジェクトが色を変更赤いおよび音声入力のリッスンを開始します。If the user taps while looking at the Bot object in the scene, and the Bot is ready to listen for voice inputs, the Bot object will change color to red and begin listening for voice inputs.

このクラスから継承、 GazeInputクラス、およびそのため、参照できるように、 Start() メソッドと変数を使用して示される、そのクラスから基本します。This class inherits from the GazeInput class, and so is able to reference the Start() method and variables from that class, denoted by the use of base.

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

  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 Interactions.

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

  4. 名前空間と同一の上部にある、次のようにするクラスの継承を更新、の相互作用クラス。Update the namespaces and the class inheritance to be the same as the following, at the top of the Interactions class:

    using UnityEngine.XR.WSA.Input;
    
    public class Interactions : GazeInput
    {
    
  5. 内で、の相互作用クラスは、次の変数を追加します。Inside the Interactions class add the following variable:

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. 追加し、 Start() メソッド。Then add the Start() method:

        /// <summary>
        /// Called on initialization, after Awake
        /// </summary>
        internal override void Start()
        {
            base.Start();
    
            //Register the application to recognize HoloLens user inputs
            _gestureRecognizer = new GestureRecognizer();
            _gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap);
            _gestureRecognizer.Tapped += GestureRecognizer_Tapped;
            _gestureRecognizer.StartCapturingGestures();
        }
    
  7. ユーザーは、HoloLens のカメラの前に、タップ ジェスチャを実行するときにトリガーされるハンドラーを追加します。Add the handler that will be triggered when the user performs the tap gesture in front of the HoloLens camera

        /// <summary>
        /// Detects the User Tap Input
        /// </summary>
        private void GestureRecognizer_Tapped(TappedEventArgs obj)
        {
            // Ensure the bot is being gazed upon.
            if(base.FocusedObject != null)
            {
                // If the user is tapping on Bot and the Bot is ready to listen
                if (base.FocusedObject.name == "Bot" && Bot.Instance.botState == Bot.BotState.ReadyToListen)
                {
                    // If a conversation has not started yet, request one
                    if(Bot.Instance.conversationStarted)
                    {
                        Bot.Instance.SetBotResponseText("Listening...");
                        Bot.Instance.StartCapturingAudio();
                    }
                    else
                    {
                        Bot.Instance.SetBotResponseText("Requesting Conversation...");
                        StartCoroutine(Bot.Instance.StartConversation());
                    }                                  
                }
            }
        }
    
  8. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

第 12 章 – SceneOrganiser クラスを作成します。Chapter 12 – Create the SceneOrganiser class

このラボで必要な最後のクラスと呼びますSceneOrganiserします。The last class required in this Lab is called SceneOrganiser. このクラスは、メイン カメラをコンポーネントとスクリプトを追加し、シーン内の適切なオブジェクトを作成するプログラムでは、シーンがセットアップされます。This class will setup the scene programmatically, by adding components and scripts to the Main Camera, and creating the appropriate objects in the scene.

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

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

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

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

  4. 内で、 SceneOrganiserクラスは、次の変数を追加します。Inside the SceneOrganiser class add the following variables:

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static SceneOrganiser Instance;
    
        /// <summary>
        /// The 3D text representing the Bot response
        /// </summary>
        internal TextMesh botResponseText;
    
  5. 追加し、 Awake()Start() メソッド。Then add the Awake() and Start() methods:

        /// <summary>
        /// Called on Initialization
        /// </summary>
        private void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start ()
        {
            // Add the GazeInput class to this object
            gameObject.AddComponent<GazeInput>();
    
            // Add the Interactions class to this object
            gameObject.AddComponent<Interactions>();
    
            // Create the Bot in the scene
            CreateBotInScene();
        }
    
  6. シーンでボット オブジェクトを作成し、パラメーターとコンポーネントを設定する責任を負いますの次のメソッドを追加します。Add the following method, responsible for creating the Bot object in the scene and setting up the parameters and components:

        /// <summary>
        /// Create the Sign In button object in the scene
        /// and sets its properties
        /// </summary>
        private void CreateBotInScene()
        {
            GameObject botObjInScene = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            botObjInScene.name = "Bot";
    
            // Add the Bot class to the Bot GameObject
            botObjInScene.AddComponent<Bot>();
    
            // Create the Bot UI
            botResponseText = CreateBotResponseText();
    
            // Set properties of Bot GameObject
            Bot.Instance.botMaterial = new Material(Shader.Find("Diffuse"));
            botObjInScene.GetComponent<Renderer>().material = Bot.Instance.botMaterial;
            Bot.Instance.botMaterial.color = Color.blue;
            botObjInScene.transform.position = new Vector3(0f, 2f, 10f);
            botObjInScene.tag = "BotTag";
        }
    
  7. ボットからの応答を表す、シーン内の UI オブジェクトの作成を担当する次のメソッドを追加します。Add the following method, responsible for creating the UI object in the scene, representing the responses from the Bot:

        /// <summary>
        /// Spawns cursor for the Main Camera
        /// </summary>
        private TextMesh CreateBotResponseText()
        {
            // Create a sphere as new cursor
            GameObject textObject = new GameObject();
            textObject.transform.parent = Bot.Instance.transform;
            textObject.transform.localPosition = new Vector3(0,1,0);
    
            // Resize the new cursor
            textObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    
            // Creating the text of the Label
            TextMesh textMesh = textObject.AddComponent<TextMesh>();
            textMesh.anchor = TextAnchor.MiddleCenter;
            textMesh.alignment = TextAlignment.Center;
            textMesh.fontSize = 50;
            textMesh.text = "Hi there, tap on me and I will start listening.";
    
            return textMesh;
        }
    
  8. 変更を保存することを確認するVisual Studioに戻る前にUnityします。Be sure to save your changes in Visual Studio before returning to Unity.

  9. Unity エディターで、ドラッグ、 SceneOrganiser Main Camera をスクリプト フォルダーのスクリプト。In the Unity Editor, drag the SceneOrganiser script from the Scripts folder to the Main Camera. シーンの開催者のコンポーネントは、次の図に示すようにようになりました、Main Camera オブジェクトに表示されます。The Scene Organiser component should now appear on the Main Camera object, as shown in the image below.

    Azure Bot Service を作成します。

ビルド前に第 13 章Chapter 13 – Before building

アプリケーションの徹底的なテストを実行するには、必要がありますをサイドロードすること、HoloLens にします。To perform a thorough test of your application you will need to sideload it onto your HoloLens. 実行する前にいることを確認します。Before you do, ensure that:

  • 説明されているすべての設定、 第 4 章が正しく設定されています。All the settings mentioned in the Chapter 4 are set correctly.
  • スクリプトSceneOrganiserにアタッチされて、 Main Cameraオブジェクト。The script SceneOrganiser is attached to the Main Camera object.
  • ボットクラスを挿入したかどうかを確認、ボットのシークレット キーに、 botSecret変数。In the Bot class, make sure you have inserted your Bot Secret Key into the botSecret variable.

第 14 章 – ビルドと、HoloLens へのサイドロードChapter 14 – Build and Sideload to the HoloLens

このプロジェクトの 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.

    Unity からのアプリの構築

  3. まだ行っていない場合、ティックUnityC#プロジェクトします。If not already, tick Unity C# Projects.

  4. [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, click Select Folder.

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

  6. 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).

HoloLens に章 – 15 をデプロイします。Chapter 15 – Deploy to HoloLens

HoloLens の展開。To deploy on HoloLens:

  1. 必要になります、HoloLens の IP アドレス (リモート) を展開し、HoloLens をことを確認するには開発者モードします。You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. これには、次の手順を実行します。To do this:

    1. ソックスを着けずに、HoloLens 中を開く、設定します。Whilst wearing your HoloLens, open the Settings.
    2. 移動してネットワークとインターネット > Wi-fi > 詳細オプションGo to Network & Internet > Wi-Fi > Advanced Options
    3. 注、 IPv4アドレス。Note the IPv4 address.
    4. 次に移動します設定、し更新とセキュリティ > 開発者向けNext, navigate back to Settings, and then to Update & Security > For Developers
    5. 開発者モードを設定します。Set Developer Mode On.
  2. 新しい Unity ビルドに移動します (、アプリフォルダー) とソリューション ファイルを開くとVisual Studioします。Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

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

  4. ソリューション プラットフォームx86リモート マシンします。In the Solution Platform, select x86, Remote Machine.

    Visual Studio からソリューションをデプロイします。

  5. 移動して、ビルド メニューの をクリックソリューションの配置サイドロード、HoloLens をアプリケーションにします。Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

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

    注意

    イマーシブ ヘッドセットを展開するには、設定、ソリューション プラットフォームローカル マシン、設定と、構成デバッグx86として、プラットフォームします。To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. ローカルにデプロイし、machine を使用して、ビルド メニューの選択ソリューションの配置します。Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

第 16 章 –、HoloLens でアプリケーションを使用します。Chapter 16 – Using the application on the HoloLens

  • アプリケーションを起動するとする前にある青い球としてボットが表示されます。Once you have launched the application, you will see the Bot as a blue sphere in front of you.

  • 使用して、タップ ジェスチャメッセージ交換を開始する球体に gazing は中です。Use the Tap Gesture while you are gazing at the sphere to initiate a conversation.

  • メッセージ交換を開始するまで待ちます (UI メッセージが表示されます、そのような場合)。Wait for the conversation to start (The UI will display a message when it happens). ボットから最初のメッセージが表示されたら、もう一度タップ ボットで赤に変わり、音声にリッスンするように開始されます。Once you receive the introductory message from the Bot, tap again on the Bot so it will turn red and begin to listen to your voice.

  • 通信を停止して、ボットに、メッセージの送信は、アプリケーション UI に表示される応答が迅速に届きます。Once you stop talking, your application will send your message to the Bot and you will promptly receive a response that will be displayed in the UI.

  • (たびにメッセージを送信する をタップする必要がある)、ボットにより多くのメッセージを送信するプロセスを繰り返します。Repeat the process to send more messages to your Bot (you have to tap each time you want to sen a message).

このメッセージ交換では、ボットが (名)、情報を保持する方法を示します (在庫品目) などの既知の情報も提供中です。This conversation demonstrates how the Bot can retain information (your name), whilst also providing known information (such as the items that are stocked).

ボットに質問をいくつかの質問には:Some questions to ask the Bot:

what do you sell? 

how much are umbrellas?

how much are raincoats?

完成した Web App Bot (v4) アプリケーションYour finished Web App Bot (v4) application

これで、Azure Web App Bot、Microsoft Bot Framework v4 を利用している mixed reality アプリを構築します。Congratulations, you built a mixed reality app that leverages the Azure Web App Bot, Microsoft Bot Framework v4.

最終的な製品

ボーナスの演習Bonus exercises

手順 1Exercise 1

このラボでは、メッセージ交換の構造は非常に基本的なです。The conversation structure in this Lab is very basic. Microsoft LUIS を使用して、お客様のボットに自然言語理解機能を提供します。Use Microsoft LUIS to give your bot natural language understanding capabilities.

手順 2Exercise 2

この例は、メッセージ交換を終了して、新しいものを再起動するには含まれません。This example does not include terminating a conversation and restarting a new one. ボットの機能を完了するために、メッセージ交換をクロージャを実装するためにしてください。To make the Bot feature complete, try to implement closure to the conversation.