Réalité mixte - Azure - Cours 309 : Application InsightsMR and Azure 309: Application insights


Notes

Les tutoriels Mixed Reality Academy ont été conçus pour les appareils HoloLens (1re génération) et les casques immersifs de réalité mixte.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Nous estimons qu’il est important de laisser ces tutoriels à la disposition des développeurs qui recherchent encore des conseils pour développer des applications sur ces appareils.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. Notez que ces tutoriels ne sont pas mis à jour avec les derniers ensembles d’outils ou interactions utilisés pour HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Ils sont fournis dans le but de fonctionner sur les appareils pris en charge.They will be maintained to continue working on the supported devices. Une nouvelle série de didacticiels sera publiée à l’avenir qui vous montrera comment développer pour 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. Cet avis sera mis à jour avec un lien vers ces didacticiels lors de leur publication.This notice will be updated with a link to those tutorials when they are posted.


produit final-début

Dans ce cours, vous allez apprendre à ajouter des fonctionnalités de Application Insights à une application de réalité mixte, à l’aide de l’API Azure Application Insights pour collecter des analyses concernant le comportement des utilisateurs.In this course, you will learn how to add Application Insights capabilities to a mixed reality application, using the Azure Application Insights API to collect analytics regarding user behavior.

Application Insights est un service Microsoft qui permet aux développeurs de collecter des analyses à partir de leurs applications et de les gérer à partir d’un portail facile à utiliser.Application Insights is a Microsoft service, allowing developers to collect analytics from their applications and manage it from an easy-to-use portal. Les analyses peuvent avoir n’importe quelle valeur, des performances aux informations personnalisées que vous souhaitez collecter.The analytics can be anything from performance to custom information you would like to collect. Pour plus d’informations, consultez la page application Insights.For more information, visit the Application Insights page.

Une fois ce cours terminé, vous disposerez d’une application de casque immersif en réalité mixte, qui sera en mesure d’effectuer les opérations suivantes :Having completed this course, you will have a mixed reality immersive headset application which will be able to do the following:

  1. Autorisez l’utilisateur à se déplacer dans une scène.Allow the user to gaze and move around a scene.
  2. Déclencher l’envoi des analyses au Service application Insights, par le biais de l’utilisation du regard et de la proximité des objets dans la scène.Trigger the sending of analytics to the Application Insights Service, through the use of Gaze and Proximity to in-scene objects.
  3. L’application appellera également sur le service, en extrayant les informations sur l’objet qui a été approché le plus par l’utilisateur au cours des dernières 24 heures.The app will also call upon the Service, fetching information about which object has been approached the most by the user, within the last 24 hours. Cet objet va changer sa couleur en vert.That object will change its color to green.

Ce cours vous apprend à obtenir les résultats du service Application Insights, dans un exemple d’application à base d’Unity.This course will teach you how to get the results from the Application Insights Service, into a Unity-based sample application. Il vous faudra appliquer ces concepts à une application personnalisée que vous pouvez générer.It will be up to you to apply these concepts to a custom application you might be building.

Prise en charge des appareilsDevice support

CoursCourse HoloLensHoloLens Casques immersifsImmersive headsets
Réalité mixte - Azure - Cours 309 : Application InsightsMR and Azure 309: Application insights ✔️✔️ ✔️✔️

Notes

Bien que ce cours se concentre principalement sur les casques de Windows Mixed Reality (VR), vous pouvez également appliquer ce que vous allez apprendre dans ce cours à Microsoft HoloLens.While this course primarily focuses on Windows Mixed Reality immersive (VR) headsets, you can also apply what you learn in this course to Microsoft HoloLens. À mesure que vous suivez le cours, vous verrez des remarques sur les modifications que vous devrez peut-être utiliser pour prendre en charge HoloLens.As you follow along with the course, you will see notes on any changes you might need to employ to support HoloLens. Lorsque vous utilisez HoloLens, vous remarquerez peut-être un écho pendant la capture vocale.When using HoloLens, you may notice some echo during voice capture.

PrérequisPrerequisites

Notes

Ce didacticiel est conçu pour les développeurs qui ont une expérience de base avec Unity et C#.This tutorial is designed for developers who have basic experience with Unity and C#. Sachez également que les conditions préalables et les instructions écrites dans ce document représentent les éléments qui ont été testés et vérifiés au moment de la rédaction (juillet 2018).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). Vous êtes libre d’utiliser le logiciel le plus récent, tel qu’indiqué dans l’article installer les outils , bien qu’il ne soit pas supposé que les informations de ce cours correspondent parfaitement à ce que vous trouverez dans les logiciels plus récents que ceux répertoriés ci-dessous.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.

Nous vous recommandons d’utiliser le matériel et les logiciels suivants pour ce cours :We recommend the following hardware and software for this course:

Avant de commencerBefore you start

Pour éviter de rencontrer des problèmes lors de la création de ce projet, il est fortement recommandé de créer le projet mentionné dans ce didacticiel dans un dossier racine ou dans un dossier racine (les chemins de dossiers longs peuvent entraîner des problèmes au moment de la génération).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).

Avertissement

N’oubliez pas que les données qui vont application Insights prennent du temps, donc soyez patient.Be aware, data going to Application Insights takes time, so be patient. Si vous souhaitez vérifier si le service a reçu vos données, consultez le chapitre 14, qui vous montrera comment naviguer dans le portail.If you want to check if the Service has received your data, check out Chapter 14, which will show you how to navigate the portal.

Chapitre 1-portail AzureChapter 1 - The Azure Portal

Pour utiliser application Insights, vous devez créer et configurer un Service Application Insights dans le portail Azure.To use Application Insights, you will need to create and configure an Application Insights Service in the Azure portal.

  1. Connectez-vous au portail Azure.Log in to the Azure Portal.

    Notes

    Si vous n’avez pas encore de compte Azure, vous devez en créer un.If you do not already have an Azure account, you will need to create one. Si vous suivez ce didacticiel dans une situation de classe ou de laboratoire, demandez à votre formateur ou à l’un des prostructors de vous aider à configurer votre nouveau compte.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. Une fois que vous êtes connecté, cliquez sur nouveau dans l’angle supérieur gauche, recherchez application Insights, puis cliquez sur entrée.Once you are logged in, click on New in the top left corner, and search for Application Insights, and click Enter.

    Notes

    Le mot nouveau peut avoir été remplacé par créer une ressource, dans les portails plus récents.The word New may have been replaced with Create a resource, in newer portals.

    Portail Azure

  3. La nouvelle page qui s’affiche à droite fournit une description du service Azure application Insights .The new page to the right will provide a description of the Azure Application Insights Service. En bas à gauche de cette page, cliquez sur le bouton créer pour créer une association avec ce service.At the bottom left of this page, select the Create button, to create an association with this Service.

    Portail Azure

  4. Une fois que vous avez cliqué sur créer:Once you have clicked on Create:

    1. Insérez le nom de votre choix pour cette instance de service.Insert your desired Name for this Service instance.

    2. Pour type d’application, sélectionnez général.As Application Type, select General.

    3. Sélectionnez un abonnement approprié.Select an appropriate Subscription.

    4. Choisissez un groupe de ressources ou créez-en un.Choose a Resource Group or create a new one. Un groupe de ressources permet de surveiller, de contrôler l’accès, de configurer et de gérer la facturation d’un regroupement de ressources Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Il est recommandé de conserver tous les services Azure associés à un seul projet (par exemple, ces cours) dans un groupe de ressources commun.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).

      Si vous souhaitez en savoir plus sur les groupes de ressources Azure, consultez l’article du groupe de ressources.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. Sélectionnez un emplacement.Select a Location.

    6. Vous devrez également confirmer que vous avez compris les conditions générales appliquées à ce service.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. Sélectionnez Create (Créer).Select Create.

      Portail Azure

  5. Une fois que vous avez cliqué sur créer, vous devez attendre que le service soit créé, cette opération peut prendre une minute.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  6. Une notification s’affichera dans le portail une fois l’instance de service créée.A notification will appear in the portal once the Service instance is created.

    Portail Azure

  7. Cliquez sur les notifications pour explorer votre nouvelle instance de service.Click on the notifications to explore your new Service instance.

    Portail Azure

  8. Cliquez sur le bouton atteindre la ressource dans la notification pour explorer votre nouvelle instance de service.Click the Go to resource button in the notification to explore your new Service instance. Vous êtes dirigé vers votre nouvelle instance de Service application Insights .You will be taken to your new Application Insights Service instance.

    Portail Azure

    Notes

    Gardez cette page Web ouverte et facile à consulter. vous y reviendrez souvent pour voir les données collectées.Keep this web page open and easy to access, you will come back here often to see the data collected.

    Important

    Pour implémenter Application Insights, vous devrez utiliser trois (3) valeurs spécifiques : la clé d’instrumentation, l' ID d’application et la clé API.To implement Application Insights, you will need to use three (3) specific values: Instrumentation Key, Application ID, and API Key. Vous verrez ci-dessous comment récupérer ces valeurs à partir de votre service.Below you will see how to retrieve these values from your Service. Veillez à noter ces valeurs dans une page vide du bloc-notes , car vous les utiliserez bientôt dans votre code.Make sure to note these values on a blank Notepad page, because you will use them soon in your code.

  9. Pour trouver la clé d’instrumentation, vous devez faire défiler la liste des fonctions de service, puis cliquer sur Propriétés. l’onglet affiché affiche la clé de service.To find the Instrumentation Key, you will need to scroll down the list of Service functions, and click on Properties, the tab displayed will reveal the Service Key.

    Portail Azure

  10. Une petite des Propriétés ci-dessous vous permet d' accéder à l’API, sur laquelle vous devez cliquer.A little below Properties, you will find API Access, which you need to click. Le panneau à droite fournit l’ID d' application de votre application.The panel to the right will provide the Application ID of your app.

    Portail Azure

  11. Si le panneau de l’ID de l' application est toujours ouvert, cliquez sur créer une clé API pour ouvrir le panneau créer une clé API .With the Application ID panel still open, click Create API Key, which will open the Create API key panel.

    Portail Azure

  12. Dans le volet créer maintenant une clé d’API , tapez une description et cochez les trois cases.Within the now open Create API key panel, type a description, and tick the three boxes.

  13. Cliquez sur générer la clé.Click Generate Key. Votre clé API sera créée et affichée.Your API Key will be created and displayed.

    Portail Azure

    Avertissement

    Il s’agit de la seule fois où votre clé de service sera affichée. Veillez donc à en faire une copie maintenant.This is the only time your Service Key will be displayed, so ensure you make a copy of it now.

Chapitre 2-configurer le projet UnityChapter 2 - Set up the Unity project

Ce qui suit est une configuration classique pour le développement avec la réalité mixte, et, par conséquent, est un bon modèle pour d’autres projets.The following is a typical set up for developing with the mixed reality, and as such, is a good template for other projects.

  1. Ouvrez Unity et cliquez sur nouveau.Open Unity and click New.

    Configurer le projet Unity

  2. Vous devez maintenant fournir un nom de projet Unity, insérer Mr _ Azure _ application _ Insights.You will now need to provide a Unity Project name, insert MR_Azure_Application_Insights. Assurez-vous que le modèle est défini sur 3D.Make sure the Template is set to 3D. Définissez l' emplacement approprié pour vous (n’oubliez pas que les répertoires racine sont mieux adaptés).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Ensuite, cliquez sur créer un projet.Then, click Create project.

    Configurer le projet Unity

  3. Si Unity est ouvert, il est conseillé de vérifier que l' éditeur de script par défaut est défini sur Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Accédez à modifier les > Préférences , puis à partir de la nouvelle fenêtre, accédez à outils externes.Go to Edit > Preferences and then from the new window, navigate to External Tools. Remplacez l' éditeur de script externe par Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Fermez la fenêtre Préférences .Close the Preferences window.

    Configurer le projet Unity

  4. Ensuite, accédez à fichier > paramètres de build et basculez la plateforme sur plateforme Windows universelle, en cliquant sur le bouton changer de plateforme .Next, go to File > Build Settings and switch the platform to Universal Windows Platform, by clicking on the Switch Platform button.

    Configurer le projet Unity

  5. Accédez à fichier > paramètres de build et assurez-vous que :Go to File > Build Settings and make sure that:

    1. L' appareil cible est défini sur n’importe quel appareilTarget Device is set to Any device

      Pour Microsoft HoloLens, définissez appareil cible sur HoloLens.For the Microsoft HoloLens, set Target Device to HoloLens.

    2. Le type de build est D3DBuild Type is set to D3D

    3. Le SDK est configuré sur le dernier installéSDK is set to Latest installed

    4. La génération et l’exécution sont définies sur l' ordinateur localBuild and Run is set to Local Machine

    5. Enregistrez la scène et ajoutez-la à la Build.Save the scene and add it to the build.

      1. Pour ce faire, sélectionnez Ajouter des scènes ouvertes.Do this by selecting Add Open Scenes. Une fenêtre d’enregistrement s’affiche.A save window will appear.

        Configurer le projet Unity

      2. Créez un nouveau dossier pour cela, ainsi que toute scène future, puis cliquez sur le bouton nouveau dossier pour créer un nouveau dossier, puis nommez-le scenes.Create a new folder for this, and any future scene, then click the New folder button, to create a new folder, name it Scenes.

        Configurer le projet Unity

      3. Ouvrez le dossier scenes nouvellement créé, puis dans le champ nom de fichier : , tapez ApplicationInsightsScene, puis cliquez sur Enregistrer.Open your newly created Scenes folder, and then in the File name: text field, type ApplicationInsightsScene, then click Save.

        Configurer le projet Unity

  6. Les paramètres restants, dans paramètres de build, doivent être laissés par défaut pour le moment.The remaining settings, in Build Settings, should be left as default for now.

  7. Dans la fenêtre paramètres de build , cliquez sur le bouton Paramètres du lecteur pour ouvrir le panneau correspondant dans l’espace où se trouve l' inspecteur .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.

    Configurer le projet Unity

  8. Dans ce volet, quelques paramètres doivent être vérifiés :In this panel, a few settings need to be verified:

    1. Sous l’onglet autres paramètres :In the Other Settings tab:

      1. La version du runtime de script doit être expérimentale (.net 4,6 équivalent), ce qui déclenche la nécessité de redémarrer l’éditeur.Scripting Runtime Version should be Experimental (.NET 4.6 Equivalent), which will trigger a need to restart the Editor.

      2. Le backend de script doit être .netScripting Backend should be .NET

      3. Le niveau de compatibilité de l’API doit être .net 4,6API Compatibility Level should be .NET 4.6

      Configurer le projet Unity

    2. Dans l’onglet paramètres de publication , sous fonctionnalités, activez la case à cocher :Within the Publishing Settings tab, under Capabilities, check:

      • InternetClientInternetClient

        Configurer le projet Unity

    3. Plus bas dans le panneau, dans les paramètres XR (situés sous paramètres de publication), cochez la réalité virtuelle prise en charge, assurez-vous que le Kit de développement logiciel (SDK) Windows Mixed Reality est ajouté.Further down the panel, in XR Settings (found below Publishing Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Configurer le projet Unity

  9. De retour dans les paramètres de build, les projets Unity C# ne sont plus grisés. Cochez la case en regard de cette option.Back in Build Settings, Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  10. Fermez la fenêtre Build Settings.Close the Build Settings window.

  11. Enregistrez votre scène et votre projet (fichier > Save Scene/file > Save Project).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Chapitre 3-importer le package UnityChapter 3 - Import the Unity package

Important

Si vous souhaitez ignorer les composants de configuration d’Unity de ce cours et continuer à accéder directement au code, n’hésitez pas à télécharger ce fichier Azure-Mr-309. pour Unity, importez-le dans votre projet en tant que package personnalisé.If you wish to skip the Unity Set up components of this course, and continue straight into code, feel free to download this Azure-MR-309.unitypackage, import it into your project as a Custom Package. Elle contient également les dll du chapitre suivant.This will also contain the DLLs from the next Chapter. Après l’importation, passez au chapitre 6.After import, continue from Chapter 6.

Important

Pour utiliser Application Insights dans Unity, vous devez importer la DLL associée, ainsi que la DLL Newtonsoft.To use Application Insights within Unity, you need to import the DLL for it, along with the Newtonsoft DLL. Il existe actuellement un problème connu dans Unity qui nécessite que les plug-ins soient reconfigurés après l’importation.There is currently a known issue in Unity which requires plugins to be reconfigured after import. Ces étapes (4-7 dans cette section) ne sont plus nécessaires une fois que le bogue a été résolu.These steps (4 - 7 in this section) will no longer be required after the bug has been resolved.

Pour importer Application Insights dans votre propre projet, assurez-vous d’avoir téléchargé « . pour Unity », contenant les plug-ins.To import Application Insights into your own project, make sure you have downloaded the '.unitypackage', containing the plugins. Ensuite, procédez comme suit :Then, do the following:

  1. Ajoutez le fichier . pour Unity à Unity à l’aide de l’option de menu > > package personnalisé du package d’importation de ressources .Add the .unitypackage to Unity by using the Assets > Import Package > Custom Package menu option.

  2. Dans la zone importer le package Unity qui s’affiche, vérifiez que tous les plug-ins sous (et y compris) sont sélectionnés.In the Import Unity Package box that pops up, ensure everything under (and including) Plugins is selected.

    Importer le package Unity

  3. Cliquez sur le bouton Importer pour ajouter les éléments à votre projet.Click the Import button, to add the items to your project.

  4. Accédez au dossier Insights sous plug-ins dans la vue projet et sélectionnez les plug-ins suivants uniquement:Go to the Insights folder under Plugins in the Project view and select the following plugins only:

    • Microsoft.ApplicationInsightsMicrosoft.ApplicationInsights

    Importer le package Unity

  5. Si ce plug-in est sélectionné, assurez-vous que toutes les plateformes sont décochées, vérifiez que WSAPlayer est également désactivé, puis cliquez sur appliquer.With this plugin selected, ensure that Any Platform is unchecked, then ensure that WSAPlayer is also unchecked, then click Apply. Cela suffit pour confirmer que les fichiers sont correctement configurés.Doing this is just to confirm that the files are configured correctly.

    Importer le package Unity

    Notes

    Le marquage des plug-ins comme celui-ci permet de les configurer pour qu’ils soient utilisés uniquement dans l’éditeur Unity.Marking the plugins like this, configures them to only be used in the Unity Editor. Il existe un ensemble différent de dll dans le dossier WSA qui sera utilisé une fois que le projet est exporté d’Unity.There are a different set of DLLs in the WSA folder which will be used after the project is exported from Unity.

  6. Ensuite, vous devez ouvrir le dossier WSA , dans le dossier Insights .Next, you need to open the WSA folder, within the Insights folder. Vous verrez une copie du même fichier que celui que vous venez de configurer.You will see a copy of the same file you just configured. Sélectionnez ce fichier, puis, dans l’inspecteur, assurez-vous que toutes les plateformes sont décochées, puis vérifiez que seul WSAPlayer est activé.Select this file, and then in the inspector, ensure that Any Platform is unchecked, then ensure that only WSAPlayer is checked. Cliquez sur Appliquer.Click Apply.

    Importer le package Unity

  7. Vous devez maintenant suivre les étapes 4-6, mais pour les plug-ins Newtonsoft à la place.You will now need to follow steps 4-6, but for the Newtonsoft plugins instead. Consultez la capture d’écran ci-dessous pour savoir à quoi doit ressembler le résultat.See the below screenshot for what the outcome should look like.

    Importer le package Unity

Chapitre 4-configurer l’appareil photo et les contrôles utilisateurChapter 4 - Set up the camera and user controls

Dans ce chapitre, vous allez configurer l’appareil photo et les contrôles pour permettre à l’utilisateur de voir et de se déplacer dans la scène.In this Chapter you will set up the camera and the controls to allow the user to see and move in the scene.

  1. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, puis sur créer > vide.Right-click in an empty area in the Hierarchy Panel, then on Create > Empty.

    Configurer l’appareil photo et les contrôles utilisateur

  2. Renommez le nouveau GameObject vide en parent Camera.Rename the new empty GameObject to Camera Parent.

    Configurer l’appareil photo et les contrôles utilisateur

  3. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, puis sur objet 3D, puis sur sphère.Right-click in an empty area in the Hierarchy Panel, then on 3D Object, then on Sphere.

  4. Renommez la sphère avec la main droite.Rename the Sphere to Right Hand.

  5. Définissez l' échelle de transformation de la main droite sur 0,1, 0,1, 0,1Set the Transform Scale of the Right Hand to 0.1, 0.1, 0.1

    Configurer l’appareil photo et les contrôles utilisateur

  6. Retirez le composant Sphere collision de la main droite en cliquant sur l' engrenage dans le composant Sphere collision , puis en supprimant le composant.Remove the Sphere Collider component from the Right Hand by clicking on the Gear in the Sphere Collider component, and then Remove Component.

    Configurer l’appareil photo et les contrôles utilisateur

  7. Dans le panneau hiérarchie, faites glisser les objets main Camera et Right main sur l’objet parent Camera .In the Hierarchy Panel drag the Main Camera and the Right Hand objects onto the Camera Parent object.

    Configurer l’appareil photo et les contrôles utilisateur

  8. Définissez la position de la transformation de la caméra principale et de l’objet de droite sur 0, 0, 0.Set the Transform Position of both the Main Camera and the Right Hand object to 0, 0, 0.

    Configurer l’appareil photo et les contrôles utilisateur

    Configurer l’appareil photo et les contrôles utilisateur

Chapitre 5-configurer les objets dans la scène UnityChapter 5 - Set up the objects in the Unity scene

Vous allez maintenant créer des formes de base pour votre scène, avec lesquelles l’utilisateur peut interagir.You will now create some basic shapes for your scene, with which the user can interact.

  1. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, puis sur objet 3D et sélectionnez plan.Right-click in an empty area in the Hierarchy Panel, then on 3D Object, then select Plane.

  2. Définissez la position de la transformation du plan sur 0,-1, 0.Set the Plane Transform Position to 0, -1, 0.

  3. Affectez à l' échelle de transformation du plan la valeur 5, 1, 5.Set the Plane Transform Scale to 5, 1, 5.

    Configurer les objets dans la scène Unity

  4. Créez un matériau de base à utiliser avec votre objet plan , afin que les autres formes soient plus faciles à voir.Create a basic material to use with your Plane object, so that the other shapes are easier to see. Accédez au panneau Projet, cliquez avec le bouton droit, puis créez, suivi de dossier, pour créer un nouveau dossier.Navigate to your Project Panel, right-click, then Create, followed by Folder, to create a new folder. Nommez-la matériel.Name it Materials.

    Configurer les objets dans la scène Unity Configurer les objets dans la scène Unity

  5. Ouvrez le dossier matériaux , cliquez avec le bouton droit sur, cliquez sur créer, puis sur matériau, pour créer un nouveau matériau.Open the Materials folder, then right-click, click Create, then Material, to create a new material. Nommez-le Blue.Name it Blue.

    Configurer les objets dans la scène Unity Configurer les objets dans la scène Unity

  6. Une fois le nouveau matériau bleu sélectionné, examinez l' inspecteur, puis cliquez sur la fenêtre rectangulaire à côté de Albedo.With the new Blue material selected, look at the Inspector, and click the rectangular window alongside Albedo. Sélectionnez une couleur bleue (l’image ci-dessous est une couleur hexadécimale : # 3592FFFF).Select a blue color (the one picture below is Hex Color: #3592FFFF). Cliquez sur le bouton Fermer une fois que vous avez choisi.Click the close button once you have chosen.

    Configurer les objets dans la scène Unity

  7. Faites glisser votre nouveau matériel à partir du dossier matériaux , sur le plan que vous venez de créer, dans votre scène (ou déposez-le sur l’objet plan dans la hiérarchie).Drag your new material from the Materials folder, onto your newly created Plane, within your scene (or drop it on the Plane object within the Hierarchy).

    Configurer les objets dans la scène Unity

  8. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, puis sur objet 3D, capsule.Right-click in an empty area in the Hierarchy Panel, then on 3D Object, Capsule.

    • Une fois la capsule sélectionnée, remplacez sa position de transformation par : -10, 1,0.With the Capsule selected, change its Transform Position to: -10, 1, 0.
  9. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, puis sur objet 3D, cube.Right-click in an empty area in the Hierarchy Panel, then on 3D Object, Cube.

    • Une fois le cube sélectionné, remplacez sa position de transformation par : 0, 0, 10.With the Cube selected, change its Transform Position to: 0, 0, 10.
  10. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, puis sur objet 3D, sphère.Right-click in an empty area in the Hierarchy Panel, then on 3D Object, Sphere.

    • Une fois la sphère sélectionnée, modifiez sa position de transformation en : 10, 0, 0.With the Sphere selected, change its Transform Position to: 10, 0, 0.

    Configurer les objets dans la scène Unity

    Notes

    Ces valeurs de position sont des suggestions.These Position values are suggestions. Vous êtes libre de définir la position des objets sur ce que vous souhaitez, bien qu’il soit plus facile pour l’utilisateur de l’application si les distances des objets ne sont pas trop éloignées de l’appareil photo.You are free to set the positions of the objects to whatever you would like, though it is easier for the user of the application if the objects distances are not too far from the camera.

  11. Lorsque votre application est en cours d’exécution, elle doit être en mesure d’identifier les objets dans la scène. pour ce faire, elle doit être marquée.When your application is running, it needs to be able to identify the objects within the scene, to achieve this, they need to be tagged. Sélectionnez l’un des objets, puis dans le panneau inspecteur , cliquez sur Ajouter une étiquette..., qui permutera l' inspecteur avec les balises & panneau couches .Select one of the objects, and in the Inspector panel, click Add Tag..., which will swap the Inspector with the Tags & Layers panel.

    Configurer les objets dans la scène Unity Set up the objects in the Unity Scene

  12. Cliquez sur le signe + (plus) , puis tapez le nom de la balise en tant que ObjectInScene.Click the + (plus) symbol, then type the tag name as ObjectInScene.

    Configurer les objets dans la scène Unity

    Avertissement

    Si vous utilisez un nom différent pour votre balise, vous devez vous assurer que cette modification est également apportée aux scripts DataFromAnalytics, ObjectTrigger et pointage par la suite, afin que vos objets soient détectés et détectés dans votre scène.If you use a different name for your tag, you will need to ensure this change is also made the DataFromAnalytics, ObjectTrigger, and Gaze, scripts later, so that your objects are found, and detected, within your scene.

  13. Une fois la balise créée, vous devez l’appliquer à tous les trois objets.With the tag created, you now need to apply it to all three of your objects. Dans la hiérarchie, maintenez la touche Maj enfoncée, cliquez sur les objets capsule, cube et sphère, puis dans l' inspecteur, cliquez sur le menu déroulant avec la balise, puis cliquez sur la balise ObjectInScene que vous avez créée.From the Hierarchy, hold the Shift key, then click the Capsule, Cube, and Sphere, objects, then in the Inspector, click the dropdown menu alongside Tag, then click the ObjectInScene tag you created.

    Configurer les objets dans la scène Unity Set up the objects in the Unity Scene

Chapitre 6-créer la classe ApplicationInsightsTrackerChapter 6 - Create the ApplicationInsightsTracker class

Le premier script que vous devez créer est ApplicationInsightsTracker, qui est responsable des opérations suivantes :The first script you need to create is ApplicationInsightsTracker, which is responsible for:

  1. Création d’événements basés sur les interactions de l’utilisateur à envoyer à Azure Application Insights.Creating events based on user interactions to submit to Azure Application Insights.

  2. Création des noms d’événements appropriés, en fonction de l’interaction de l’utilisateur.Creating appropriate Event names, depending on user interaction.

  3. Envoi d’événements à l’instance de service Application Insights.Submitting events to the Application Insights Service instance.

Pour créer cette classe :To create this class:

  1. Cliquez avec le bouton droit dans le panneau Projet, puis créez le > dossier.Right-click in the Project Panel, then Create > Folder. Nommez le dossier scripts.Name the folder Scripts.

    Créer la classe ApplicationInsightsTracker Créer la classe ApplicationInsightsTracker

  2. Une fois le dossier scripts créé, double-cliquez dessus pour l’ouvrir.With the Scripts folder created, double-click it, to open. Ensuite, dans ce dossier, cliquez avec le bouton droit sur créer un > script C#.Then, within that folder, right-click, Create > C# Script. Nommez le script ApplicationInsightsTracker.Name the script ApplicationInsightsTracker.

  3. Double-cliquez sur le nouveau script ApplicationInsightsTracker pour l’ouvrir avec Visual Studio.Double-click on the new ApplicationInsightsTracker script to open it with Visual Studio.

  4. Mettez à jour les espaces de noms en haut du script pour qu’ils soient comme indiqué ci-dessous :Update namespaces at the top of the script to be as below:

        using Microsoft.ApplicationInsights;
        using Microsoft.ApplicationInsights.DataContracts;
        using Microsoft.ApplicationInsights.Extensibility;
        using UnityEngine;
    
  5. À l’intérieur de la classe, insérez les variables suivantes :Inside the class insert the following variables:

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

    Notes

    Définissez les valeurs instrumentationKey, ApplicationId et API_Key de manière appropriée, à l’aide des clés de service à partir du portail Azure, comme indiqué au Chapitre 1, étape 9.Set the instrumentationKey, applicationId and API_Key values appropriately, using the Service Keys from the Azure Portal as mentioned in Chapter 1, step 9 onwards.

  6. Ajoutez ensuite les méthodes Start () et éveillé () , qui seront appelées lorsque la classe est initialisée :Then add the Start() and Awake() methods, which will be called when the class initializes:

        /// <summary>
        /// Sets this class instance as a singleton
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {
            // Instantiate telemetry and metric
            telemetryClient = new TelemetryClient();
    
            metric = new MetricTelemetry();
    
            // Assign the Instrumentation Key to the Event and Metric objects
            TelemetryConfiguration.Active.InstrumentationKey = instrumentationKey;
    
            telemetryClient.InstrumentationKey = instrumentationKey;
        }
    
  7. Ajoutez les méthodes responsables de l’envoi des événements et des métriques inscrits par votre application :Add the methods responsible for sending the events and metrics registered by your application:

        /// <summary>
        /// Submit the Event to Azure Analytics using the event trigger object
        /// </summary>
        public void RecordProximityEvent(string objectName)
        {
            telemetryClient.TrackEvent(CreateEventName(objectName));
        }
    
        /// <summary>
        /// Uses the name of the object involved in the event to create 
        /// and return an Event Name convention
        /// </summary>
        public string CreateEventName(string name)
        {
            string eventName = $"User near {name}";
            return eventName;
        }
    
        /// <summary>
        /// Submit a Metric to Azure Analytics using the metric gazed object
        /// and the time count of the gaze
        /// </summary>
        public void RecordGazeMetrics(string objectName, int time)
        {
            // Output Console information about gaze.
            Debug.Log($"Finished gazing at {objectName}, which went for <b>{time}</b> second{(time != 1 ? "s" : "")}");
    
            metric.Name = $"Gazed {objectName}";
    
            metric.Value = time;
    
            telemetryClient.TrackMetric(metric);
        }
    
  8. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Chapitre 7-créer le script de regardChapter 7 - Create the Gaze script

Le script suivant à créer est le script de regard.The next script to create is the Gaze script. Ce script est chargé de créer un Raycast qui sera projeté à partir de l' appareil photo principal, afin de détecter l’objet que l’utilisateur examine.This script is responsible for creating a Raycast that will be projected forward from the Main Camera, to detect which object the user is looking at. Dans ce cas, le Raycast doit déterminer si l’utilisateur Regarde un objet avec la balise ObjectInScene , puis compter la durée pendant laquelle l’utilisateur fait un regard sur cet objet.In this case, the Raycast will need to identify if the user is looking at an object with the ObjectInScene tag, and then count how long the user gazes at that object.

  1. Double-cliquez sur le dossier scripts pour l’ouvrir.Double-click on the Scripts folder, to open it.

  2. Cliquez avec le bouton droit dans le dossier scripts , puis cliquez sur créer un > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nommez le script point de regard.Name the script Gaze.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.Double-click on the script to open it with Visual Studio.

  4. Remplacez le code existant par le code ci-dessous :Replace the existing code with the following:

        using UnityEngine;
    
        public class Gaze : MonoBehaviour
        {
            /// <summary>
            /// Provides Singleton-like behavior to this class.
            /// </summary>
            public static Gaze Instance;
    
            /// <summary>
            /// Provides a reference to the object the user is currently looking at.
            /// </summary>
            public GameObject FocusedGameObject { get; private set; }
    
            /// <summary>
            /// Provides whether an object has been successfully hit by the raycast.
            /// </summary>
            public bool Hit { get; private set; }
    
            /// <summary>
            /// Provides a reference to compare whether the user is still looking at 
            /// the same object (and has not looked away).
            /// </summary>
            private GameObject _oldFocusedObject = null;
    
            /// <summary>
            /// Max Ray Distance
            /// </summary>
            private float _gazeMaxDistance = 300;
    
            /// <summary>
            /// Max Ray Distance
            /// </summary>
            private float _gazeTimeCounter = 0;
    
            /// <summary>
            /// The cursor object will be created when the app is running,
            /// this will store its values. 
            /// </summary>
            private GameObject _cursor;
        }
    
  5. Vous devez maintenant ajouter du code pour les méthodes éveillé () et Start () .Code for the Awake() and Start() methods now needs to be added.

        private void Awake()
        {
            // Set this class to behave similar to singleton
            Instance = this;
            _cursor = CreateCursor();
        }
    
        void Start()
        {
            FocusedGameObject = null;
        }
    
        /// <summary>
        /// Create a cursor object, to provide what the user
        /// is looking at.
        /// </summary>
        /// <returns></returns>
        private GameObject CreateCursor()    
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
    
            // Remove the collider, so it does not block raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
    
            newCursor.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    
            newCursor.GetComponent<MeshRenderer>().material.color = 
            Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
    
            newCursor.SetActive(false);
            return newCursor;
        }
    
  6. À l’intérieur de la classe de regard , ajoutez le code suivant dans la méthode Update () pour projeter un Raycast et détecter l’accès cible :Inside the Gaze class, add the following code in the Update() method to project a Raycast and detect the target hit:

        /// <summary>
        /// Called every frame
        /// </summary>
        void Update()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedGameObject;
    
            RaycastHit hitInfo;
    
            // Initialize Raycasting.
            Hit = Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, _gazeMaxDistance);
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedGameObject = hitInfo.collider.gameObject;
    
                    // Lerp the cursor to the hit point, which helps to stabilize the gaze.
                    _cursor.transform.position = Vector3.Lerp(_cursor.transform.position, hitInfo.point, 0.6f);
    
                    _cursor.SetActive(true);
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedGameObject = null;
    
                    _cursor.SetActive(false);
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedGameObject = null;
    
                _cursor.SetActive(false);
            }
    
            // Check whether the previous focused object is this same object. If so, reset the focused object.
            if (FocusedGameObject != _oldFocusedObject)
            {
                ResetFocusedObject();
            }
            // If they are the same, but are null, reset the counter. 
            else if (FocusedGameObject == null && _oldFocusedObject == null)
            {
                _gazeTimeCounter = 0;
            }
            // Count whilst the user continues looking at the same object.
            else
            {
                _gazeTimeCounter += Time.deltaTime;
            }
        }
    
  7. Ajoutez la méthode ResetFocusedObject () pour envoyer des données à application Insights lorsque l’utilisateur a regardé un objet.Add the ResetFocusedObject() method, to send data to Application Insights when the user has looked at an object.

        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        public void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                // Only looking for objects with the correct tag.
                if (_oldFocusedObject.CompareTag("ObjectInScene"))
                {
                    // Turn the timer into an int, and ensure that more than zero time has passed.
                    int gazeAsInt = (int)_gazeTimeCounter;
    
                    if (gazeAsInt > 0)
                    {
                        //Record the object gazed and duration of gaze for Analytics
                        ApplicationInsightsTracker.Instance.RecordGazeMetrics(_oldFocusedObject.name, gazeAsInt);
                    }
                    //Reset timer
                    _gazeTimeCounter = 0;
                }
            }
        }
    
  8. Vous avez maintenant terminé le script de regard .You have now completed the Gaze script. Enregistrez vos modifications dans Visual Studio avant de revenir à Unity.Save your changes in Visual Studio before returning to Unity.

Chapitre 8-créer la classe ObjectTriggerChapter 8 - Create the ObjectTrigger class

Le prochain script que vous devez créer est ObjectTrigger, qui est responsable des opérations suivantes :The next script you need to create is ObjectTrigger, which is responsible for:

  • Ajout de composants nécessaires pour la collision à l’appareil photo principal.Adding components needed for collision to the Main Camera.
  • Détection de si l’appareil photo est proche d’un objet marqué comme ObjectInScene.Detecting if the camera is near an object tagged as ObjectInScene.

Pour créer le script :To create the script:

  1. Double-cliquez sur le dossier scripts pour l’ouvrir.Double-click on the Scripts folder, to open it.

  2. Cliquez avec le bouton droit dans le dossier scripts , puis cliquez sur créer un > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nommez le script ObjectTrigger.Name the script ObjectTrigger.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.Double-click on the script to open it with Visual Studio. Remplacez le code existant par le code ci-dessous :Replace the existing code with the following:

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

Chapitre 9-créer la classe DataFromAnalyticsChapter 9 - Create the DataFromAnalytics class

Vous devez maintenant créer le script DataFromAnalytics , qui est responsable des opérations suivantes :You will now need to create the DataFromAnalytics script, which is responsible for:

  • Récupération des données d’analyse sur l’objet le plus proche de l’appareil photo.Fetching analytics data about which object has been approached by the camera the most.
  • À l’aide des clés de service, qui autorisent la communication avec votre instance de service Azure application Insights.Using the Service Keys, that allow communication with your Azure Application Insights Service instance.
  • Tri des objets dans la scène, en fonction du nombre d’événements le plus élevé.Sorting the objects in scene, according to which has the highest event count.
  • La modification de la couleur matérielle, de l’objet le plus proche, en vert.Changing the material color, of the most approached object, to green.

Pour créer le script :To create the script:

  1. Double-cliquez sur le dossier scripts pour l’ouvrir.Double-click on the Scripts folder, to open it.

  2. Cliquez avec le bouton droit dans le dossier scripts , puis cliquez sur créer un > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nommez le script DataFromAnalytics.Name the script DataFromAnalytics.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.Double-click on the script to open it with Visual Studio.

  4. Insérez les espaces de noms suivants :Insert the following namespaces:

        using Newtonsoft.Json;
        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Dans le script, insérez ce qui suit :Inside the script, insert the following:

        /// <summary>
        /// Number of most recent events to be queried
        /// </summary>
        private int _quantityOfEventsQueried = 10;
    
        /// <summary>
        /// The timespan with which to query. Needs to be in hours.
        /// </summary>
        private int _timepspanAsHours = 24;
    
        /// <summary>
        /// A list of the objects in the scene
        /// </summary>
        private List<GameObject> _listOfGameObjectsInScene;
    
        /// <summary>
        /// Number of queries which have returned, after being sent.
        /// </summary>
        private int _queriesReturned = 0;
    
        /// <summary>
        /// List of GameObjects, as the Key, with their event count, as the Value.
        /// </summary>
        private List<KeyValuePair<GameObject, int>> _pairedObjectsWithEventCount = new List<KeyValuePair<GameObject, int>>();
    
        // Use this for initialization
        void Start()
        {
            // Find all objects in scene which have the ObjectInScene tag (as there may be other GameObjects in the scene which you do not want).
            _listOfGameObjectsInScene = GameObject.FindGameObjectsWithTag("ObjectInScene").ToList();
    
            FetchAnalytics();
        }
    
  6. Dans la classe DataFromAnalytics , juste après la méthode Start () , ajoutez la méthode suivante appelée FetchAnalytics ().Within the DataFromAnalytics class, right after the Start() method, add the following method called FetchAnalytics(). Cette méthode est chargée de remplir la liste des paires clé-valeur, avec un gameobject et un numéro d’événement d’espace réservé.This method is responsible for populating the list of key value pairs, with a GameObject and a placeholder event count number. Il initialise ensuite la Coroutine GetWebRequest () .It then initializes the GetWebRequest() coroutine. La structure de requête de l’appel à application Insights se trouve également dans cette méthode, comme point de terminaison de l’URL de la requête .The query structure of the call to Application Insights can be found within this method also, as the Query URL endpoint.

        private void FetchAnalytics()
        {
            // Iterate through the objects in the list
            for (int i = 0; i < _listOfGameObjectsInScene.Count; i++)
            {
                // The current event number is not known, so set it to zero.
                int eventCount = 0;
    
                // Add new pair to list, as placeholder, until eventCount is known.
                _pairedObjectsWithEventCount.Add(new KeyValuePair<GameObject, int>(_listOfGameObjectsInScene[i], eventCount));
    
                // Set the renderer of the object to the default color, white
                _listOfGameObjectsInScene[i].GetComponent<Renderer>().material.color = Color.white;
    
                // Create the appropriate object name using Insights structure
                string objectName = _listOfGameObjectsInScene[i].name;
    
                // Build the queryUrl for this object.
                string queryUrl = Uri.EscapeUriString(string.Format(
                    "https://api.applicationinsights.io/v1/apps/{0}/events/$all?timespan=PT{1}H&$search={2}&$select=customMetric/name&$top={3}&$count=true",
                    ApplicationInsightsTracker.Instance.applicationId, _timepspanAsHours, "Gazed " + objectName, _quantityOfEventsQueried));
    
    
                // Send this object away within the WebRequest Coroutine, to determine it is event count.
                StartCoroutine("GetWebRequest", new KeyValuePair<string, int>(queryUrl, i));
            }
        }
    
  7. Juste en dessous de la méthode FetchAnalytics () , ajoutez une méthode appelée GetWebRequest (), qui retourne un IEnumerator.Right below the FetchAnalytics() method, add a method called GetWebRequest(), which returns an IEnumerator. Cette méthode est chargée de demander le nombre de fois qu’un événement, correspondant à un gameobject spécifique, a été appelé dans application Insights.This method is responsible for requesting the number of times an event, corresponding with a specific GameObject, has been called within Application Insights. Lorsque toutes les requêtes envoyées ont été retournées, la méthode DetermineWinner () est appelée.When all the sent queries have returned, the DetermineWinner() method is called.

        /// <summary>
        /// Requests the data count for number of events, according to the
        /// input query URL.
        /// </summary>
        /// <param name="webQueryPair">Query URL and the list number count.</param>
        /// <returns></returns>
        private IEnumerator GetWebRequest(KeyValuePair<string, int> webQueryPair)
        {
            // Set the URL and count as their own variables (for readability).
            string url = webQueryPair.Key;
            int currentCount = webQueryPair.Value;
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(url))
            {
                DownloadHandlerBuffer handlerBuffer = new DownloadHandlerBuffer();
    
                unityWebRequest.downloadHandler = handlerBuffer;
    
                unityWebRequest.SetRequestHeader("host", "api.applicationinsights.io");
    
                unityWebRequest.SetRequestHeader("x-api-key", ApplicationInsightsTracker.Instance.API_Key);
    
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError)
                {
                    // Failure with web request.
                    Debug.Log("<color=red>Error Sending:</color> " + unityWebRequest.error);
                }
                else
                {
                    // This query has returned, so add to the current count.
                    _queriesReturned++;
    
                    // Initialize event count integer.
                    int eventCount = 0;
    
                    // Deserialize the response with the custom Analytics class.
                    Analytics welcome = JsonConvert.DeserializeObject<Analytics>(unityWebRequest.downloadHandler.text);
    
                    // Get and return the count for the Event
                    if (int.TryParse(welcome.OdataCount, out eventCount) == false)
                    {
                        // Parsing failed. Can sometimes mean that the Query URL was incorrect.
                        Debug.Log("<color=red>Failure to Parse Data Results. Check Query URL for issues.</color>");
                    }
                    else
                    {
                        // Overwrite the current pair, with its actual values, now that the event count is known.
                        _pairedObjectsWithEventCount[currentCount] = new KeyValuePair<GameObject, int>(_pairedObjectsWithEventCount[currentCount].Key, eventCount);
                    }
    
                    // If all queries (compared with the number which was sent away) have 
                    // returned, then run the determine winner method. 
                    if (_queriesReturned == _pairedObjectsWithEventCount.Count)
                    {
                        DetermineWinner();
                    }
                }
            }
        }
    
  8. La méthode suivante est DetermineWinner (), qui trie la liste de paires gameobject et int , en fonction du nombre d’événements le plus élevé.The next method is DetermineWinner(), which sorts the list of GameObject and Int pairs, according to the highest event count. Il modifie ensuite la couleur matérielle de ce gameobject en vert (en tant que commentaire pour qu’il ait le plus grand nombre).It then changes the material color of that GameObject to green (as feedback for it having the highest count). Un message s’affiche avec les résultats de l’analyse.This displays a message with the analytics results.

        /// <summary>
        /// Call to determine the keyValue pair, within the objects list, 
        /// with the highest event count.
        /// </summary>
        private void DetermineWinner()
        {
            // Sort the values within the list of pairs.
            _pairedObjectsWithEventCount.Sort((x, y) => y.Value.CompareTo(x.Value));
    
            // Change its colour to green
            _pairedObjectsWithEventCount.First().Key.GetComponent<Renderer>().material.color = Color.green;
    
            // Provide the winner, and other results, within the console window. 
            string message = $"<b>Analytics Results:</b>\n " +
                $"<i>{_pairedObjectsWithEventCount.First().Key.name}</i> has the highest event count, " +
                $"with <i>{_pairedObjectsWithEventCount.First().Value.ToString()}</i>.\nFollowed by: ";
    
            for (int i = 1; i < _pairedObjectsWithEventCount.Count; i++)
            {
                message += $"{_pairedObjectsWithEventCount[i].Key.name}, " +
                    $"with {_pairedObjectsWithEventCount[i].Value.ToString()} events.\n";
            }
    
            Debug.Log(message);
        }
    
  9. Ajoutez la structure de classe qui sera utilisée pour désérialiser l’objet JSON, reçu de application Insights.Add the class structure which will be used to deserialize the JSON object, received from Application Insights. Ajoutez ces classes au bas de votre fichier de classe DataFromAnalytics , en dehors de la définition de classe.Add these classes at the very bottom of your DataFromAnalytics class file, outside of the class definition.

        /// <summary>
        /// These classes represent the structure of the JSON response from Azure Insight
        /// </summary>
        [Serializable]
        public class Analytics
        {
            [JsonProperty("@odata.context")]
            public string OdataContext { get; set; }
    
            [JsonProperty("@odata.count")]
            public string OdataCount { get; set; }
    
            [JsonProperty("value")]
            public Value[] Value { get; set; }
        }
    
        [Serializable]
        public class Value
        {
            [JsonProperty("customMetric")]
            public CustomMetric CustomMetric { get; set; }
        }
    
        [Serializable]
        public class CustomMetric
        {
            [JsonProperty("name")]
            public string Name { get; set; }
        }
    
  10. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Chapitre 10-créer la classe de mouvementChapter 10 - Create the Movement class

Le script de déplacement est le prochain script que vous devrez créer.The Movement script is the next script you will need to create. Il est responsable de ce qui suit :It is responsible for:

  • Déplacement de la caméra principale en fonction de la direction vers laquelle l’appareil photo regarde.Moving the Main Camera according to the direction the camera is looking towards.
  • Ajout de tous les autres scripts aux objets de scène.Adding all other scripts to scene objects.

Pour créer le script :To create the script:

  1. Double-cliquez sur le dossier scripts pour l’ouvrir.Double-click on the Scripts folder, to open it.

  2. Cliquez avec le bouton droit dans le dossier scripts , puis cliquez sur créer un > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nommez le mouvement du script.Name the script Movement.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.Double-click on the script to open it with Visual Studio.

  4. Remplacez le code existant par le code ci-dessous :Replace the existing code with the following:

        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
    
        public class Movement : MonoBehaviour
        {
            /// <summary>
            /// The rendered object representing the right controller.
            /// </summary>
            public GameObject Controller;
    
            /// <summary>
            /// The movement speed of the user.
            /// </summary>
            public float UserSpeed;
    
            /// <summary>
            /// Provides whether source updates have been registered.
            /// </summary>
            private bool _isAttached = false;
    
            /// <summary>
            /// The chosen controller hand to use. 
            /// </summary>
            private InteractionSourceHandedness _handness = InteractionSourceHandedness.Right;
    
            /// <summary>
            /// Used to calculate and proposes movement translation.
            /// </summary>
            private Vector3 _playerMovementTranslation;
    
            private void Start()
            {
                // You are now adding components dynamically 
                // to ensure they are existing on the correct object  
    
                // Add all camera related scripts to the camera. 
                Camera.main.gameObject.AddComponent<Gaze>();
                Camera.main.gameObject.AddComponent<ObjectTrigger>();
    
                // Add all other scripts to this object.
                gameObject.AddComponent<ApplicationInsightsTracker>();
                gameObject.AddComponent<DataFromAnalytics>();
            }
    
            // Update is called once per frame
            void Update()
            {
    
            }
        }
    
  5. Dans la classe de déplacement , sous la méthode empty Update () , insérez les méthodes suivantes qui permettent à l’utilisateur d’utiliser le contrôleur de main pour se déplacer dans l’espace virtuel :Within the Movement class, below the empty Update() method, insert the following methods that allow the user to use the hand controller to move in the virtual space:

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

        // Update is called once per frame
        void Update()
        {
            UpdateControllerState();
        }
    
  7. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Chapitre 11-configuration des références de scriptsChapter 11 - Setting up the scripts references

Dans ce chapitre, vous devez placer le script de déplacement sur le parent de l' appareil photo et définir ses cibles de référence.In this Chapter you need to place the Movement script onto the Camera Parent and set its reference targets. Ce script gère alors le placement des autres scripts là où ils doivent être.That script will then handle placing the other scripts where they need to be.

  1. Dans le dossier scripts du panneau Projet, faites glisser le script de déplacement vers l’objet parent de l' appareil photo , situé dans le panneau hiérarchie.From the Scripts folder in the Project Panel, drag the Movement script to the Camera Parent object, located in the Hierarchy Panel.

    Configuration des références de scripts dans la scène Unity

  2. Cliquez sur le parent de l’appareil photo.Click on the Camera Parent. Dans le volet hiérarchie, faites glisser l’objet de droite du volet de la hiérarchie vers la cible de référence, contrôleur, dans le panneau Inspecteur.In the Hierarchy Panel, drag the Right Hand object from the Hierarchy Panel to the reference target, Controller, in the Inspector Panel. Définissez la Vitesse de l’utilisateur sur 5, comme indiqué dans l’image ci-dessous.Set the User Speed to 5, as shown in the image below.

    Configuration des références de scripts dans la scène Unity

Chapitre 12-générer le projet UnityChapter 12 - Build the Unity project

Tout ce qui est nécessaire pour la section Unity de ce projet est maintenant terminé. il est donc temps de la générer à partir d’Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Accédez à paramètres de build, (paramètres de génération de fichier > ).Navigate to Build Settings, (File > Build Settings).

  2. Dans la fenêtre paramètres de build , cliquez sur générer.From the Build Settings window, click Build.

    Générer le projet Unity dans la solution UWP

  3. Une fenêtre de l' Explorateur de fichiers s’affiche et vous invite à entrer un emplacement pour la Build.A File Explorer window will pop-up, prompting you for a location for the build. Créez un nouveau dossier (en cliquant sur nouveau dossier dans l’angle supérieur gauche), puis nommez-le Builds.Create a new folder (by clicking New Folder in the top-left corner), and name it BUILDS.

    Générer le projet Unity dans la solution UWP

    1. Ouvrez le nouveau dossier Builds , puis créez un autre dossier (à l’aide d’un nouveau dossier ) et nommez-le Mr _ Azure _ application _ Insights.Open the new BUILDS folder, and create another folder (using New Folder once more), and name it MR_Azure_Application_Insights.

      Générer le projet Unity dans la solution UWP

    2. Après avoir sélectionné le dossier RM _ Azure _ application _ Insights , cliquez sur Sélectionner un dossier.With the MR_Azure_Application_Insights folder selected, click Select Folder. La génération du projet prendra quelques minutes.The project will take a minute or so to build.

  4. Après la génération, l' Explorateur de fichiers s’affiche et vous indique l’emplacement de votre nouveau projet.Following Build, File Explorer will appear showing you the location of your new project.

Chapitre 13-déployer MR_Azure_Application_Insights application sur votre ordinateurChapter 13 - Deploy MR_Azure_Application_Insights app to your machine

Pour déployer l' application _ Azure _ application _ Insights RM sur votre ordinateur local :To deploy the MR_Azure_Application_Insights app on your Local Machine:

  1. Ouvrez le fichier solution de votre application _ Azure _ application _ Insights dans Visual Studio.Open the solution file of your MR_Azure_Application_Insights app in Visual Studio.

  2. Dans la plateforme de la solution, sélectionnez x86, ordinateur local.In the Solution Platform, select x86, Local Machine.

  3. Dans la configuration de la solution, sélectionnez Déboguer.In the Solution Configuration select Debug.

    Générer le projet Unity dans la solution UWP

  4. Accédez au menu Générer , puis cliquez sur déployer la solution pour chargement l’application sur votre ordinateur.Go to Build menu and click on Deploy Solution to sideload the application to your machine.

  5. Votre application doit maintenant apparaître dans la liste des applications installées, prêtes à être lancées.Your app should now appear in the list of installed apps, ready to be launched.

  6. Lancez l’application de réalité mixte.Launch the mixed reality application.

  7. Déplacez-vous dans la scène, en approchant les objets et en examinant ces derniers, lorsque le service Azure Insight a collecté suffisamment de données d’événement, il définit l’objet qui a été le plus proche du vert.Move around the scene, approaching objects and looking at them, when the Azure Insight Service has collected enough event data, it will set the object that has been approached the most to green.

Important

Alors que le temps d’attente moyen pour les événements et les métriques à collecter par le service prend environ 15 minutes, dans certains cas, cela peut prendre jusqu’à 1 heure.While the average waiting time for the Events and Metrics to be collected by the Service takes around 15 min, in some occasions it might take up to 1 hour.

Chapitre 14-Application Insights Service PortalChapter 14 - The Application Insights Service portal

Une fois que vous avez accédé à la scène et que vous avez placé un regard sur plusieurs objets, vous pouvez voir les données collectées dans le portail de Service application Insights .Once you have roamed around the scene and gazed at several objects you can see the data collected in the Application Insights Service portal.

  1. Revenez à votre portail de service Application Insights.Go back to your Application Insights Service portal.

  2. Cliquez sur Metrics Explorer.Click on Metrics Explorer.

    Examen des données collectées

  3. Elle s’ouvre dans un onglet contenant le graphique qui représente les événements et les métriques associés à votre application.It will open in a tab containing the graph which represent the Events and Metrics related to your application. Comme indiqué ci-dessus, l’affichage des données dans le graphique peut prendre un certain temps (jusqu’à 1 heure).As mentioned above, it might take some time (up to 1 hour) for the data to be displayed in the graph

    Examen des données collectées

  4. Cliquez sur la barre des événements dans le total des événements par version de l’application pour afficher une répartition détaillée des événements avec leurs noms.Click on the Events bar in the Total of Events by Application Version, to see a detailed breakdown of the events with their names.

    Examen des données collectées

Votre application de service Application Insights est terminéeYour finished your Application Insights Service application

Félicitations, vous avez créé une application de réalité mixte qui tire parti du service Application Insights pour surveiller l’activité de l’utilisateur au sein de votre application.Congratulations, you built a mixed reality app that leverages the Application Insights Service to monitor user's activity within your app.

résultat du cours

Exercices bonusBonus Exercises

Exercice 1Exercise 1

Essayez de créer dynamiquement, plutôt que de créer manuellement les objets ObjectInScene et de définir leurs coordonnées sur le plan au sein de vos scripts.Try spawning, rather than manually creating, the ObjectInScene objects and set their coordinates on the plane within your scripts. De cette façon, vous pouvez demander à Azure ce que l’objet le plus populaire était (des résultats de proximité ou de proximité) et générer un supplément à l’un de ces objets.In this way, you could ask Azure what the most popular object was (either from gaze or proximity results) and spawn an extra one of those objects.

Exercice 2Exercise 2

Triez vos résultats Application Insights par heure, afin d’obtenir les données les plus pertinentes, et d’implémenter ces données sensibles au temps dans votre application.Sort your Application Insights results by time, so that you get the most relevant data, and implement that time sensitive data in your application.