注意

Mixed Reality Academy チュートリアルは、HoloLens (第1世代) と Mixed Reality イマーシブヘッドセットを念頭に置いて設計されています。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:Bot の統合MR and Azure 312: Bot integration

このコースでは、Microsoft Bot Framework V4 を使用して bot を作成およびデプロイし、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は、拡張可能でスケーラブルな Bot アプリケーションを構築するためのツールを開発者に提供するために設計された 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. Tap ジェスチャを使用して、ユーザーの声をリッスンしているボットを開始します。Use a Tap Gesture to start the bot listening for the users voice.
  2. ユーザーが何かを言い、bot は応答の提供を試みます。When the user has said something, the bot will attempt to provide a response.
  3. ボットの近くに、Unity のシーンで bot の応答をテキストとして表示します。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. このコースは、Azure サービスを Unity プロジェクトと統合する方法を説明することを目的としています。This course is designed to teach you how to integrate an Azure Service with your Unity project. このコースで得られた知識を使用して、mixed reality アプリケーションを強化することができます。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:Bot の統合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) ヘッドセットにはアクセス可能なカメラがないため、外部カメラが 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章: Bot アプリケーションの作成Chapter 1 – Create the Bot application

最初の手順は、bot をローカル ASP.Net Core Web アプリケーションとして作成することです。The first step is to create your bot as a local ASP.Net Core Web application. 完了してテストした後は、Azure Portal に発行します。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.

    Bot アプリケーションを作成する

  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.

    Bot アプリケーションを作成する

  4. [参照] タブで、「 Microsoft... 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.

    Bot アプリケーションを作成する

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

    Bot アプリケーションを作成する

  6. クラスにMybotという名前を指定し、 [追加] をクリックします。Name the class MyBot and click on Add.

    Bot アプリケーションを作成する

  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.

    Bot アプリケーションを作成する

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

    Bot アプリケーションを作成する

  10. ConversationContextクラスをダブルクリックします。Double-click on the ConversationContext class. このクラスは、bot が使用する変数を保持して、メッセージ交換のコンテキストを維持する役割を担います。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. このクラスでは、bot と顧客の間の会話を構築するために使用されるコードを追加します。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. Startupクラスをダブルクリックします。Double-click on the Startup class. このクラスは bot を初期化します。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. Programクラスファイルを開き、内のコードが次のコードと同じであることを確認します。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.

第2章-Azure Bot Service の作成Chapter 2 - Create the Azure Bot Service

Bot 用のコードを作成したので、Azure Portal でWeb アプリボットサービスのインスタンスに発行する必要があります。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 でボットサービスを作成および構成し、そのサービスにコードを発行する方法について説明します。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 アカウントを持っていない場合は、アカウントを作成する必要があります。If you do not already have an Azure account, you will need to create one. このチュートリアルを教室またはラボの状況で行っている場合は、新しいアカウントの設定について、インストラクターまたはそのいずれかの対処を依頼してください。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 アプリボット] を検索して、 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 アプリボットサービスの説明が表示されます。The new page will provide a description of the Web App Bot Service. このページの左下にある [作成] ボタンを選択して、このサービスとの関連付けを作成します。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 アプリボットサービスを初めて作成する場合は、free レベル (F0) をご利用いただけます。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. アプリ名Bot 名と同じままにすることができます。App name can just be left the same as the Bot name.

    7. Bot テンプレートBasic (C#) のままにしておきます。Leave the Bot template as Basic (C#).

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

    9. Bot をホストするために使用する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. [作成] をクリックした後、サービスが作成されるまで待機する必要があります。これには1分かかることがあります。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. この時点で、クライアントアプリケーションがこのボットサービスと通信できるように、ダイレクトラインと呼ばれる機能を設定する必要があります。At this point you need to setup a feature called Direct Line to allow your client application to communicate with this Bot Service. [チャンネル] をクリックし、 [おすすめチャネルの追加] セクションで、 [ダイレクトラインチャネルの構成] をクリックします。Click on Channels, then in the Add a featured channel section, click on Configure Direct Line channel.

    Azure Bot Service を作成する

  10. このページでは、クライアントアプリが bot で認証できるようにする秘密キーを見つけます。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章: Bot を Azure Web アプリボットサービスに発行するChapter 3 – Publish the Bot to the Azure Web App Bot Service

サービスの準備ができたので、先ほどビルドした Bot コードを、新しく作成した Web アプリボットサービスに発行する必要があります。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.

注意

Bot ソリューション/コードに変更を加えるたびに、Bot を 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.

    Bot を Azure Web アプリボットサービスに発行する

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

    Bot を Azure Web アプリボットサービスに発行する

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

  5. [発行] ページでは、 Web アプリボットサービスの作成に使用したものと同じサブスクリプションを設定する必要があることがわかります。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.

    Bot を Azure Web アプリボットサービスに発行する

  6. [発行] ボタンをクリックし、Bot が公開されるまで待ちます (数分かかる場合があります)。Now click on the Publish button, and wait for the Bot to be published (it might take a few minutes).

    Bot を Azure Web アプリボットサービスに発行する

章 4-Unity プロジェクトを設定するChapter 4 – Set 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.

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

    Unity プロジェクトを設定する

  2. ここで、Unity プロジェクト名を指定する必要があります。You will now need to provide a Unity project name. Hololens Botを挿入します。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. 次に、 [ファイル > ビルド設定] に移動し、 [ユニバーサル 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. それでもファイル > ビルド設定を行い、次のことを確認します。While still in File > Build Settings and make sure that:

    1. ターゲットデバイスHololensに設定されていますTarget Device is set to Hololens

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

    2. ビルドの種類D3Dに設定されていますBuild 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. それ以外の設定は、ビルド設定 の 既定 のままにしておきます。The remaining settings, in Build Settings, should be left as default for now.

  6. [ビルドの設定] ウィンドウで、 [プレーヤーの設定] ボタンをクリックします。これにより、インスペクターが配置されている領域の関連パネルが開きます。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. Scripting Runtime のバージョン実験的 (NET 4.6 と同等) である必要があります。これを変更するには、エディターを再起動する必要があります。Scripting Runtime Version should be Experimental (NET 4.6 Equivalent); changing this will require a restart of the Editor.

      2. バックエンド.netである必要がありますScripting Backend should be .NET

      3. API 互換性レベル.net 4.6である必要がありますAPI Compatibility Level should be .NET 4.6

        Unity プロジェクトを設定する

    2. [発行の設定] タブの [機能] で、次の項目を確認します。Within the Publishing Settings tab, under Capabilities, check:

      • InternetClientInternetClient

      • マイクMicrophone

        Unity プロジェクトを設定する

    3. パネルの下にある [ XR settings (発行の設定] の下にあります) で、 [サポートされている仮想現実] をティックし、 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. ビルド設定に戻る_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 your scene and project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

第5章–カメラの設定Chapter 5 – Camera setup

重要

このコースのUnity セットアップコンポーネントをスキップしてコードに直接進む場合は、 unitypackage を 312ダウンロードして、カスタムパッケージとしてプロジェクトにインポートしてから、次の手順に進んでください。第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. [階層] パネルで、メインカメラを選択します。In the Hierarchy panel, select the Main Camera.

  2. 選択すると、メインカメラのすべてのコンポーネントが [インスペクター] パネルに表示されます。Once selected, you will be able to see all the components of the Main Camera in the Inspector panel.

    1. カメラオブジェクトメインカメラという名前にする必要があります (スペルに注意してください)。The Camera object must be named Main Camera (note the spelling)
    2. メインカメラタグmaincameraに設定する必要があります (スペルに注意してください)。The Main Camera Tag must be set to MainCamera (note the spelling)
    3. 変換位置0、0、0に設定されていることを確認します。Make 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)

    カメラの設定

Chapter 6 – Newtonsoft ライブラリをインポートするChapter 6 – Import the Newtonsoft library

受信して Bot サービスに送信されたオブジェクトを逆シリアル化およびシリアル化できるようにするには、 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 パッケージのインポート] ボックスで、プラグイン(およびそれを含む) のすべてが選択されていることを確認します。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 プラグインを選択した状態で、任意のプラットフォームオフになっていることを確認し、 [wsaplayer]オフになっていることを確認してから、 [適用] をクリックします。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. WSA フォルダーには、Unity からプロジェクトがエクスポートされた後に使用される、異なるセットがあります。There are a different set of them in the WSA folder which will be used after the project is exported from Unity.

  6. 次に、 Newtonsoftフォルダー内のWSAフォルダーを開く必要があります。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. この操作を誤って行った場合は、メインカメラのタグを必ずMaincameraに戻してください。If you have accidentally done this, make sure to change the Main Camera tag back to MainCamera.

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

このクラスの作成は、純粋にアーキテクチャを選択したものです。これらのオブジェクトは、このコースの後半で作成する Bot スクリプトでホストすることができます。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.

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

  2. [Scripts] フォルダーをダブルクリックして開きます。Double-click on the Scripts folder to open it. 次に、そのフォルダー内でを右クリックし、 [Create > C# Script] を選択します。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. Unityに戻る前に、変更内容をVisual Studioに保存してください。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.
  • プレーヤーの見つめによってヒットしたオブジェクトを検出し、検出されたオブジェクトへの参照を保持します。Detecting objects hit by the gaze of the player, and holding a reference to detected objects.

このクラスを作成するには:To create this class:

  1. 前に作成したScriptsフォルダーにアクセスします。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. 次に、 Start () メソッドの上に、 GazeInputクラス内に次の変数を追加します。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. Unityに戻る前に、変更内容をVisual Studioに保存してください。Be sure to save your changes in Visual Studio before returning to Unity.

Chapter 10 – Bot クラスを作成するChapter 10 – Create the Bot class

ここで作成するスクリプトはBotと呼ばれます。The script you are going to create now is called Bot. これはアプリケーションのコアクラスであり、次のものが格納されます。This is the core class of your application, it stores:

  • Web アプリボットの資格情報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

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. [Scripts] フォルダーをダブルクリックして開きます。Double-click on the Scripts folder, to open it.

  2. Scriptsフォルダー内を右クリックし、 [Create > C# Script] をクリックします。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. Botクラスの上部で、次の名前空間を更新します。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. Botクラス内で、次の変数を追加します。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;
    

    注意

    Bot シークレットキー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. 起動可能な ()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. 音声キャプチャの開始時と終了時に speech ライブラリによって呼び出される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. Bot とのメッセージ交換を開始するために、次のコルーチンが呼び出されます。The following coroutine is called to begin a conversation with the Bot. メッセージ交換の呼び出しが完了すると、Bot サービスに空のメッセージとしてアクティビティが送信されるように設定する一連のパラメーターを渡すことによって、 SendMessageToCoroutine () が呼び出されます。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. これは、Bot サービスにダイアログを開始するように求めるメッセージを表示するために行われます。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 サービスに送信されるアクティビティをビルドするために、次のコルーチンが呼び出されます。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. 次のコルーチンは、Bot サービスにアクティビティを送信した後に応答を要求するために呼び出されます。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. Unityに戻る前に、変更内容をVisual Studioに保存してください。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.

シーン内のbotオブジェクトを見ているときにユーザーがタップしたときに、bot が音声入力をリッスンする準備ができている場合、bot オブジェクトは色をに変更し、音声入力のリッスンを開始します。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 () メソッドと変数を参照できます。これは、 baseを使用することによって示されます。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. [Scripts] フォルダーをダブルクリックして開きます。Double-click on the Scripts folder, to open it.

  2. Scriptsフォルダー内を右クリックし、 [Create > C# Script] をクリックします。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 カメラの前で tap ジェスチャを実行したときにトリガーされるハンドラーを追加します。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. Unityに戻る前に、変更内容をVisual Studioに保存してください。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. [Scripts] フォルダーをダブルクリックして開きます。Double-click on the Scripts folder, to open it.

  2. Scriptsフォルダー内を右クリックし、 [Create > C# Script] をクリックします。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. 次に、起動 ( ) および開始 () の各メソッドを追加します。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. シーンに Bot オブジェクトを作成し、パラメーターとコンポーネントを設定する次のメソッドを追加します。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. 次のメソッドを追加します。これは、Bot からの応答を表す、シーン内の 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. Unityに戻る前に、変更内容をVisual Studioに保存してください。Be sure to save your changes in Visual Studio before returning to Unity.

  9. Unity エディターで、 SceneOrganiserスクリプトを Scripts フォルダーからメインカメラにドラッグします。In the Unity Editor, drag the SceneOrganiser script from the Scripts folder to the Main Camera. 次の図に示すように、シーン Organiser コンポーネントがメインカメラオブジェクトに表示されます。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は、メインカメラオブジェクトにアタッチされます。The script SceneOrganiser is attached to the Main Camera object.
  • Botクラスで、 bot シークレットキー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. [ビルドの設定] ウィンドウで、 [ビルド] をクリックします。From the Build Settings window, click Build.

    Unity からアプリをビルドする

  3. Unity C#プロジェクトをまだティックしていない場合は、ティックします。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. ここでそのフォルダーを作成し、「 App」という名前を指定します。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. Unity のビルドが完了すると (時間がかかる場合があります)、ビルドの場所でファイルエクスプローラーウィンドウを開きます (ウィンドウの上に常に表示されるとは限りませんが、新しいウィンドウが追加されたことが通知されます)。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).

第15章– HoloLens への展開Chapter 15 – Deploy to HoloLens

HoloLens に展開するには:To deploy on HoloLens:

  1. Hololens が開発者モードになっていることを確認するには、HOLOLENS の IP アドレス (リモートデプロイ用) が必要です。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. 次に、[ビルド] メニューの [ソリューションの配置] をクリックして、ローカルコンピューターに配置します。Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

Chapter 16 – HoloLens でのアプリケーションの使用Chapter 16 – Using the application on the HoloLens

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

  • メッセージ交換を開始するには、タップジェスチャを使用します。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). Bot からの入門メッセージを受信したら、Bot でもう一度タップして、赤に変わり、音声の聞き取りを開始します。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.

  • 会話を終了すると、アプリケーションから Bot にメッセージが送信され、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.

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

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

Bot に質問することができます。Some questions to ask the Bot:

what do you sell? 

how much are umbrellas?

how much are raincoats?

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

これで、Azure Web アプリボットである 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 を使用して、bot の自然言語に関する機能を提供します。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. Bot 機能を完成させるには、メッセージ交換にクロージャを実装してみてください。To make the Bot feature complete, try to implement closure to the conversation.