注意

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


MR 入力 213:アニメーション コント ローラーMR Input 213: Motion controllers

複合現実の世界でのモーション コント ローラーは、別のレベルの対話機能を追加します。Motion controllers in the mixed reality world add another level of interactivity. コント ローラーのモーション、私たちできます直接オブジェクトで実際には、物理操作のようなより自然な方法で immersion を増やすと対話、アプリのエクスペリエンスに喜びを感じています。With motion controllers, we can directly interact with objects in a more natural way, similar to our physical interactions in real life, increasing immersion and delight in your app experience.

MR 入力 213 では、アニメーション コント ローラーの入力イベントをについて説明を単純な空間ペイント エクスペリエンスを作成します。In MR Input 213, we will explore the motion controller's input events by creating a simple spatial painting experience. このアプリでは、ユーザーは、さまざまな種類のブラシと色の 3 次元空間で描画できます。With this app, users can paint in three-dimensional space with various types of brushes and colors.

このチュートリアルで説明したトピックTopics covered in this tutorial

MixedReality213 Topic1 MixedReality213 トピック 2 MixedReality213 Topic3
コント ローラーの視覚化Controller visualization コント ローラーの入力イベントController input events カスタム コント ローラーと UICustom controller and UI
Unity のゲーム モードとランタイムの motion コント ローラー モデルをレンダリングする方法について説明します。Learn how to render motion controller models in Unity's game mode and runtime. さまざまな種類のボタン イベントとそのアプリケーションについて説明します。Understand different types of button events and their applications. コント ローラー上に UI 要素を重ね合わせる、または完全にカスタマイズする方法について説明します。Learn how to overlay UI elements on top of the controller or fully customize it.

デバイスのサポートDevice support

コースCourse HoloLensHoloLens イマーシブ ヘッドセットImmersive headsets
MR 入力 213:アニメーション コント ローラーMR Input 213: Motion controllers ✔️✔️

開始前の作業Before you start

前提条件Prerequisites

イマーシブ ヘッドセットのインストールのチェックリストを参照してくださいこのページします。See the installation checklist for immersive headsets on this page.

プロジェクト ファイルProject files

注意

をダウンロードする前に、ソース コードを検索する場合があるGitHub で入手できますします。If you want to look through the source code before downloading, it's available on GitHub.

Unity のセットアップUnity setup

目標Objectives

  • Windows for Mixed Reality の Unity 開発を最適化します。Optimize Unity for Windows Mixed Reality development
  • 複合現実のカメラをセットアップします。Setup Mixed Reality Camera
  • 環境のセットアップSetup environment

手順Instructions

  • Unity を起動します。Start Unity.
  • [開く] を選択します。Select Open.
  • デスクトップおよび検索に移動し、 MixedReality213 マスターフォルダーの以前にアーカイブ解除します。Navigate to your Desktop and find the MixedReality213-master folder you previously unarchived.
  • [フォルダーの選択] をクリックします。Click Select Folder.
  • Unity では、プロジェクト ファイルの読み込みが完了すると、Unity エディターを表示できなきます。Once Unity finishes loading project files, you will be able to see Unity editor.
  • Unity では、次のように選択します。ファイル > Build Settingsします。In Unity, select File > Build Settings.

MR213_BuildSettings

  • 選択ユニバーサル Windows プラットフォームで、プラットフォームを一覧表示し、をクリックして、スイッチ プラットフォームボタンをクリックします。Select Universal Windows Platform in the Platform list and click the Switch Platform button.
  • ターゲット デバイスを設定任意のデバイスSet Target Device to Any device
  • ビルドの種類を設定D3DSet Build Type to D3D
  • SDK を設定インストールされている最新Set SDK to Latest Installed
  • 確認UnityC#プロジェクトCheck Unity C# Projects
    • これにより、Unity プロジェクトをリビルドすることがなく、Visual Studio プロジェクト内のスクリプト ファイルを変更できます。This allows you modify script files in the Visual Studio project without rebuilding Unity project.
  • クリックしてプレーヤー設定します。Click Player Settings.
  • インスペクターパネルで、一番下までスクロールIn the Inspector panel, scroll down to the bottom
  • XR の設定で確認仮想現実のサポートIn XR Settings, check Virtual Reality Supported
  • 仮想現実 Sdk では、次のように選択しますWindows Mixed Reality。Under Virtual Reality SDKs, select Windows Mixed Reality

MR213_XRSettings

  • 閉じるBuild Settingsウィンドウ。Close Build Settings window.

プロジェクトの構造Project structure

このチュートリアルでは Mixed Reality Toolkit - Unity します。This tutorial uses Mixed Reality Toolkit - Unity. リリースを確認できますこのページします。You can find the releases on this page.

構造

参照用の完成したシーンCompleted scenes for your reference

  • 下の 2 つの完成した Unity シーンが見つかりますシーンフォルダー。You will find two completed Unity scenes under Scenes folder.
    • MixedReality213:1 つのブラシで完了したシーンMixedReality213: Completed scene with single brush
    • MixedReality213Advanced:複数のブラシで高度なデザインにシーンが完了しましたMixedReality213Advanced: Completed scene for advanced design with multiple brushes

このチュートリアル用に新しいシーン設定New Scene setup for the tutorial

  • Unity では、次のようにクリックしますファイル > 新しいシーン。In Unity, click File > New Scene
  • 削除メイン カメラ指向性光Delete Main Camera and Directional Light
  • プロジェクト パネルし、検索に次のプレハブをドラッグ、階層パネル。From the Project panel, search and drag the following prefabs into the Hierarchy panel:
    • 資産/HoloToolkit/入力/プレハブ/MixedRealityCameraAssets/HoloToolkit/Input/Prefabs/MixedRealityCamera
    • 資産/AppPrefabs/環境Assets/AppPrefabs/Environment

カメラと環境

  • Mixed Reality toolkit カメラ プレハブを 2 つあります。There are two camera prefabs in Mixed Reality Toolkit:
    • MixedRealityCamera.prefab:カメラのみMixedRealityCamera.prefab: Camera only
    • MixedRealityCameraParent.prefab:カメラ + Teleportation 境界MixedRealityCameraParent.prefab: Camera + Teleportation + Boundary
    • このチュートリアルでは使用MixedRealityCamera teleportation 機能なし。In this tutorial, we will use MixedRealityCamera without teleportation feature. このため、単純な追加環境プレハブを根拠と感じるユーザーを作成する基本的な床面が含まれています。Because of this, we added simple Environment prefab which contains a basic floor to make the user feel grounded.
    • 詳細と teleportation についてはMixedRealityCameraParentを参照してください設計 - Teleportation と locomotion の詳細To learn more about the teleportation with MixedRealityCameraParent, see Advanced design - Teleportation and locomotion

スカイ ボックスのセットアップSkybox setup

  • クリックしてウィンドウ > 照明 > の設定Click Window > Lighting > Settings
  • 右側にある円をクリックして、スカイ ボックス素材フィールドClick the circle on the right side of the Skybox Material field
  • '灰色' で入力し、選択SkyboxGrayType in ‘gray’ and select SkyboxGray

(Assets/AppPrefabs/Support/Materials/SkyboxGray.mat)(Assets/AppPrefabs/Support/Materials/SkyboxGray.mat)

スカイ ボックスの設定

  • 確認スカイ ボックスオプションを表示するのには、グレーのグラデーション スカイ ボックスを割り当てられています。Check Skybox option to be able to see assigned gray gradient skybox

トグル スカイ ボックスのオプション

  • MixedRealityCamera、環境、および灰色のスカイ ボックスのシーンは、次のようになります。The scene with MixedRealityCamera, Environment and gray skybox will look like this.

MixedReality213 環境

  • クリックしてファイル > としてシーンを保存Click File > Save Scene as
  • 保存任意の名前とシーンのフォルダーの下、シーンSave your scene under Scenes folder with any name

第 1 章 - コント ローラーの視覚化Chapter 1 - Controller visualization

目標Objectives

  • コント ローラー モデルおよび実行時の Unity のゲーム モードのアニメーションをレンダリングする方法について説明します。Learn how to render motion controller models in Unity's game mode and at runtime.

Windows Mixed Reality は、コント ローラーの視覚エフェクトのアニメーション コント ローラー モデルを提供します。Windows Mixed Reality provides an animated controller model for controller visualization. これには、アプリにコント ローラーの視覚エフェクトに対して実行できるいくつかの方法があります。There are several approaches you can take for controller visualization in your app:

  • 既定値は変更しなくても既定のコント ローラーを使用します。Default - Using default controller without modification
  • 既定のコント ローラーを使用して、その要素の一部をカスタマイズする UI コンポーネントを重ねて表示したり、ハイブリッドHybrid - Using default controller, but customizing some of its elements or overlaying UI components
  • 置換 - 独自を使用して、コント ローラーの 3D モデルをカスタマイズReplacement - Using your own customized 3D model for the controller

この章でこれらのコント ローラーのカスタマイズの例について説明します。In this chapter, we will learn about the examples of these controller customizations.

手順Instructions

  • プロジェクト入力パネルで、 MotionControllers検索ボックスにします。In the Project panel, type MotionControllers in the search box . 資産/HoloToolkit/入力/プレハブの下で検索することもできます/。You can also find it under Assets/HoloToolkit/Input/Prefabs/.
  • ドラッグ、 MotionControllersにプレハブ、階層パネル。Drag the MotionControllers prefab into the Hierarchy panel.
  • をクリックして、 MotionControllersのプレハブ、階層パネル。Click on the MotionControllers prefab in the Hierarchy panel.

MotionControllers プレハブMotionControllers prefab

MotionControllersプレハブは、 MotionControllerVisualizerスロットを代わりのコント ローラー モデルを提供するスクリプト。MotionControllers prefab has a MotionControllerVisualizer script which provides the slots for alternate controller models. 手の形や剣などお客様独自のカスタムの 3D モデルを割り当て、常に使用して代替左/右のモデル ' を確認して場合、は、既定のモデルではなく表示されます。If you assign your own custom 3D models such as a hand or a sword and check 'Always Use Alternate Left/Right Model', you will see them instead of the default model. ブラシを使用して、コント ローラー モデルを置換するのに第 4 章では、このスロットを使用します。We will use this slot in Chapter 4 to replace the controller model with a brush.

MR213_ControllerVisualizer

手順Instructions

  • インスペクターパネルをダブルクリックしてMotionControllerVisualizer Visual Studio でコードを表示するスクリプトIn the Inspector panel, double click MotionControllerVisualizer script to see the code in the Visual Studio

MotionControllerVisualizer スクリプトMotionControllerVisualizer script

MotionControllerVisualizerMotionControllerInfoクラスへのアクセスし、既定のコント ローラー モデルを変更するための手段を提供します。The MotionControllerVisualizer and MotionControllerInfo classes provide the means to access & modify the default controller models. MotionControllerVisualizerをサブスクライブする Unity のInteractionSourceDetectedイベントが見つかったときに、コント ローラー モデルを自動的にインスタンス化します。MotionControllerVisualizer subscribes to Unity's InteractionSourceDetected event and automatically instantiates controller models when they are found.

protected override void Awake()
{
    ...
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    ...
}

コント ローラー モデルに従って配信glTF 仕様します。The controller models are delivered according to the glTF specification. 送信および 3D アセットをアンパックの背後にあるプロセスを向上させながら、一般的な形式を提供するは、この形式が用意されています。This format has been created to provide a common format, while improving the process behind transmitting and unpacking 3D assets. この場合を取得し、ユーザーのエクスペリエンスを可能な限りシームレスにようにするため、アニメーション コント ローラーのバージョン、ユーザーは使用する場合がありますとは限りません時に、コント ローラー モデルを読み込む必要があります。In this case, we need to retrieve and load the controller models at runtime, as we want to make the user's experience as seamless as possible, and it's not guaranteed which version of the motion controllers the user might be using. このコースでは、混合の現実 Toolkit を使用して、Khronos グループのバージョンを使用するUnityGLTF プロジェクトします。This course, via the Mixed Reality Toolkit, uses a version of the Khronos Group's UnityGLTF project.

スクリプトで使用できるコント ローラーが配信されるとMotionControllerInfo自体位置は正しくできるように特定のコント ローラーの要素の変換が見つかりません。Once the controller has been delivered, scripts can use MotionControllerInfo to find the transforms for specific controller elements so they can correctly position themselves.

後の章では、これらのスクリプトを使用して、コント ローラーに UI 要素をアタッチする方法を学びます。In a later chapter, we will learn how to use these scripts to attach UI elements to the controllers.

いくつかのスクリプトでは、コードのブロックを紹介します #if!UNITY_EDITORまたはUNITY_WSAします。これらのコード ブロックは、Windows を展開するときに、UWP ランタイムのみで実行します。これは、Unity エディターと、UWP アプリのランタイムで使用される Api のセットが異なるためです。In some scripts, you will find code blocks with #if !UNITY_EDITOR or UNITY_WSA. These code blocks run only on the UWP runtime when you deploy to Windows. This is because the set of APIs used by the Unity editor and the UWP app runtime are different.

  • 保存シーンとクリック、再生ボタンをクリックします。Save the scene and click the play button.

ヘッドセット内のモーション コント ローラーとシーンを表示できます。You will be able to see the scene with motion controllers in your headset. ボタンのクリック、スティックの移動、およびタッチパッド タッチの強調表示の詳細なアニメーションを表示できます。You can see detailed animations for button clicks, thumbstick movement, and touchpad touch highlighting.

MR213_Controller 視覚エフェクトの既定値

第 2 章 – コント ローラーへの UI 要素Chapter 2 - Attaching UI elements to the controller

目標Objectives

  • アニメーション コント ローラーの要素について説明しますLearn about the elements of the motion controllers
  • オブジェクトのコント ローラーの特定の部分にアタッチする方法について説明しますLearn how to attach objects to specific parts of the controllers

この章では、ユーザーは簡単にアクセスし、いつでも操作コント ローラーにユーザー インターフェイス要素を追加する方法を学びます。In this chapter, you will learn how to add user interface elements to the controller which the user can easily access and manipulate at anytime. 単純なカラー ピッカー入力タッチパッドを使用して UI を追加する方法も学習します。You will also learn how to add a simple color picker UI using the touchpad input.

手順Instructions

  • プロジェクトパネルで、検索MotionControllerInfoスクリプト。In the Project panel, search MotionControllerInfo script.
  • 検索結果からダブル クリックしてMotionControllerInfoスクリプトを Visual Studio でコードを参照してください。From the search result, double click MotionControllerInfo script to see the code in Visual Studio.

MotionControllerInfo scriptMotionControllerInfo script

最初の手順では、コント ローラーの要素にアタッチする UI をするかを選択します。The first step is to choose which element of the controller you want the UI to attach to. これらの要素が定義されているControllerElementEnumMotionControllerInfo.csします。These elements are defined in ControllerElementEnum in MotionControllerInfo.cs.

MR213 MotionControllerElements

  • ホームHome
  • メニューMenu
  • 理解Grasp
  • スティックThumbstick
  • SelectSelect
  • タッチパッドTouchpad
  • ポインティングの姿勢: この要素は、順方向を指すコント ローラーの先端を表します。Pointing pose – this element represents the tip of the controller pointing forward direction.

手順Instructions

  • プロジェクトパネルで、検索AttachToControllerスクリプト。In the Project panel, search AttachToController script.
  • 検索結果からダブル クリックしてAttachToControllerスクリプトを Visual Studio でコードを参照してください。From the search result, double click AttachToController script to see the code in Visual Studio.

AttachToController スクリプトAttachToController script

AttachToControllerスクリプトが指定されたコント ローラーの処理および要素をすべてのオブジェクトをアタッチする簡単な方法を提供します。The AttachToController script provides a simple way to attach any objects to a specified controller handedness and element.

In AttachElementToController(),In AttachElementToController(),

  • 処理を使用して確認MotionControllerInfo.HandednessCheck handedness using MotionControllerInfo.Handedness
  • コント ローラーを使用して、特定の要素を取得MotionControllerInfo.TryGetElement()Get specific element of the controller using MotionControllerInfo.TryGetElement()
  • 要素を取得した後、コント ローラー モデル、その下にあるオブジェクトの親から変換し、オブジェクトのローカルの位置と回転は 0 に設定します。After retrieving the element's transform from the controller model, parent the object under it and set object's local position & rotation to zero.
public MotionControllerInfo.ControllerElementEnum Element { get { return element; } }

private void AttachElementToController(MotionControllerInfo newController)
{
     if (!IsAttached && newController.Handedness == handedness)
     {
          if (!newController.TryGetElement(element, out elementTransform))
          {
               Debug.LogError("Unable to find element of type " + element + " under controller " + newController.ControllerParent.name + "; not attaching.");
               return;
          }

          controller = newController;

          SetChildrenActive(true);

          // Parent ourselves under the element and set our offsets
          transform.parent = elementTransform;
          transform.localPosition = positionOffset;
          transform.localEulerAngles = rotationOffset;
          if (setScaleOnAttach)
          {
               transform.localScale = scale;
          }

          // Announce that we're attached
          OnAttachToController();
          IsAttached = true;
     }
}

使用する最も簡単な方法は、 AttachToControllerの場合と、そこから継承するようにスクリプトはColorPickerWheel します。The simplest way to use AttachToController script is to inherit from it, as we've done in the case of ColorPickerWheel. オーバーライドするだけで、 OnAttachToControllerOnDetatchFromControllerセットアップを実行する関数//コント ローラーが検出されました。 切断されたときにブレーク ダウンします。Simply override the OnAttachToController and OnDetatchFromController functions to perform your setup / breakdown when the controller is detected / disconnected.

手順Instructions

  • プロジェクトパネルで、検索ボックスに入力ColorPickerWheelします。In the Project panel, type in the search box ColorPickerWheel. 資産/AppPrefabs で検索することもできます/。You can also find it under Assets/AppPrefabs/.
  • ドラッグColorPickerWheelにプレハブ、階層パネル。Drag ColorPickerWheel prefab into the Hierarchy panel.
  • をクリックして、 ColorPickerWheelのプレハブ、階層パネル。Click the ColorPickerWheel prefab in the Hierarchy panel.
  • インスペクターパネルをダブルクリックしてColorPickerWheelスクリプトを Visual Studio でコードを参照してください。In the Inspector panel, double click ColorPickerWheel Script to see the code in Visual Studio.

ColorPickerWheel プレハブ

ColorPickerWheel スクリプトColorPickerWheel script

ColorPickerWheel継承AttachToController、表示処理要素で、 Inspectorパネル。Since ColorPickerWheel inherits AttachToController, it shows Handedness and Element in the Inspector panel. アタッチ、UI、左側のコント ローラーのタッチパッド要素にします。We'll be attaching the UI to the Touchpad element on the left controller.

ColorPickerWheel スクリプト

ColorPickerWheelオーバーライド、 OnAttachToControllerOnDetatchFromControllerと色の選択の次の章で使用される入力イベントをサブスクライブするにはタッチパッドを入力します。ColorPickerWheel overrides the OnAttachToController and OnDetatchFromController to subscribe to the input event which will be used in next chapter for color selection with touchpad input.

public class ColorPickerWheel : AttachToController, IPointerTarget
{
    protected override void OnAttachToController()
    {
        // Subscribe to input now that we're parented under the controller
        InteractionManager.InteractionSourceUpdated += InteractionSourceUpdated;
    }

    protected override void OnDetachFromController()
    {
        Visible = false;

        // Unsubscribe from input now that we've detached from the controller
        InteractionManager.InteractionSourceUpdated -= InteractionSourceUpdated;
    }
    ...
}
  • 保存シーンとクリック、再生ボタンをクリックします。Save the scene and click the play button.

コント ローラーにオブジェクトのアタッチの代替方法Alternative method for attaching objects to the controllers

スクリプトがから継承することをお勧めします。 AttachToControllerオーバーライドとOnAttachToControllerします。We recommend that your scripts inherit from AttachToController and override OnAttachToController. ただし、これができるとは限りません。However, this may not always be possible. 代わりにでは、スタンドアロン コンポーネントとして使用します。An alternative is using it as a standalone component. これは、スクリプトをリファクタリングすることがなく、コント ローラーを既存のプレハブをアタッチする場合に役立ちます。This can be useful when you want to attach an existing prefab to a controller without refactoring your scripts. 単に IsAttached に設定するまで待機する、クラスがある任意のセットアップを実行する前に true。Simply have your class wait for IsAttached to be set to true before performing any setup. これを行う最も簡単な方法は、'Start ' のコルーチンを使用して、します。The simplest way to do this is by using a coroutine for 'Start.'

private IEnumerator Start() {
    AttachToController attach = gameObject.GetComponent<AttachToController>();

    while (!attach.IsAttached) {
        yield return null;
    }

    // Perform setup here
}

第 3 章 - タッチパッドの入力Chapter 3 - Working with touchpad input

目標Objectives

  • タッチパッド入力データのイベントを取得する方法について説明しますLearn how to get touchpad input data events
  • アプリのエクスペリエンスにタッチパッド軸の位置に関する情報を使用する方法について説明しますLearn how to use touchpad axis position information for your app experience

手順Instructions

  • 階層パネルで、をクリックしてColorPickerWheelIn the Hierarchy panel, click ColorPickerWheel
  • インスペクターパネルのAnimatior、ダブルクリックColorPickerWheelControllerIn the Inspector panel, under Animatior, double click ColorPickerWheelController
  • 表示することができますAnimatorタブが開かれますYou will be able to see Animator tab opened

Unity のアニメーション コント ローラーと UI を表示/非表示Showing/hiding UI with Unity's Animation controller

表示/非表示に、 ColorPickerWheel使用してアニメーションを使用して UI、 Unity のアニメーション システムします。To show and hide the ColorPickerWheel UI with animation, we are using Unity's animation system. 設定、 ColorPickerWheelVisibleプロパティを true または false のトリガー表示を非表示にアニメーション トリガーします。Setting the ColorPickerWheel's Visible property to true or false triggers Show and Hide animation triggers. 表示を非表示にでパラメーターが定義されている、 ColorPickerWheelControllerアニメーション コント ローラー。Show and Hide parameters are defined in the ColorPickerWheelController animation controller.

Unity のアニメーション コント ローラー

手順Instructions

  • 階層パネルで、 ColorPickerWheelプレハブIn the Hierarchy panel, select ColorPickerWheel prefab
  • インスペクターパネルをダブルクリックしてColorPickerWheel Visual Studio でコードを表示するスクリプトIn the Inspector panel, double click ColorPickerWheel script to see the code in the Visual Studio

ColorPickerWheel スクリプトColorPickerWheel script

ColorPickerWheelをサブスクライブする Unity のInteractionSourceUpdatedタッチパッド イベントをリッスンするイベントです。ColorPickerWheel subscribes to Unity's InteractionSourceUpdated event to listen for touchpad events.

InteractionSourceUpdated()、ことを確認して、スクリプトが最初に確認します。In InteractionSourceUpdated(), the script first checks to ensure that it:

  • タッチパッド イベントでは実際には、(obj.state 。touchpadTouched)is actually a touchpad event (obj.state.touchpadTouched)
  • 左側のコント ローラーの発生元 (obj.state.source 。処理)originates from the left controller (obj.state.source.handedness)

タッチパッドの両方に該当する場合は位置 (obj.state 。touchpadPosition) に割り当てられているselectorPositionします。If both are true, the touchpad position (obj.state.touchpadPosition) is assigned to selectorPosition.

private void InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
{
    if (obj.state.source.handedness == handedness && obj.state.touchpadTouched)
    {
        Visible = true;
        selectorPosition = obj.state.touchpadPosition;
    }
}

Update() に基づいて、表示プロパティ、カラー ピッカーの animator コンポーネントでの表示と非表示のアニメーション トリガーでトリガーされますIn Update(), based on visible property, it triggers Show and Hide animation triggers in the color picker's animator component

if (visible != visibleLastFrame)
{
    if (visible)
    {
        animator.SetTrigger("Show");
    }
    else
    {
        animator.SetTrigger("Hide");
    }
}

Update()selectorPosition UV 位置を返しますカラー ホイールの mesh collider コライダーに伸びる射線をキャストするために使用します。In Update(), selectorPosition is used to cast a ray at the color wheel's mesh collider, which returns a UV position. この位置は、ピクセル座標を見つけて、色のカラー ホイールのテクスチャの値を使用できます。This position can then be used to find the pixel coordinate and color value of the color wheel's texture. この値が他のスクリプトを使用してアクセスできる、 SelectedColorプロパティ。This value is accessible to other scripts via the SelectedColor property.

カラー ピッカーのホイール レイキャスト

...
    // Clamp selector position to a radius of 1
    Vector3 localPosition = new Vector3(selectorPosition.x * inputScale, 0.15f, selectorPosition.y * inputScale);
    if (localPosition.magnitude > 1)
    {
        localPosition = localPosition.normalized;
    }
    selectorTransform.localPosition = localPosition;

    // Raycast the wheel mesh and get its UV coordinates
    Vector3 raycastStart = selectorTransform.position + selectorTransform.up * 0.15f;
    RaycastHit hit;
    Debug.DrawLine(raycastStart, raycastStart - (selectorTransform.up * 0.25f));

    if (Physics.Raycast(raycastStart, -selectorTransform.up, out hit, 0.25f, 1 << colorWheelObject.layer, QueryTriggerInteraction.Ignore))
    {
        // Get pixel from the color wheel texture using UV coordinates
        Vector2 uv = hit.textureCoord;
        int pixelX = Mathf.FloorToInt(colorWheelTexture.width * uv.x);
        int pixelY = Mathf.FloorToInt(colorWheelTexture.height * uv.y);
        selectedColor = colorWheelTexture.GetPixel(pixelX, pixelY);
        selectedColor.a = 1f;
    }
    // Set the selector's color and blend it with white to make it visible on top of the wheel
    selectorRenderer.material.color = Color.Lerp (selectedColor, Color.white, 0.5f);
}

第 4 章 - コント ローラー モデルをオーバーライドします。Chapter 4 - Overriding controller model

目標Objectives

  • カスタムの 3D モデルとコント ローラー モデルを上書きする方法について説明します。Learn how to override the controller model with a custom 3D model.

MR213_BrushToolOverride

手順Instructions

  • クリックしてMotionControllersで、階層パネル。Click MotionControllers in the Hierarchy panel.
  • 右側にある円をクリックして、代替の右側のコント ローラーフィールド。Click the circle on the right side of the Alternate Right Controller field.
  • 入力 'BrushController' し、結果から、プレハブを選択します。Type in 'BrushController' and select the prefab from the result. 資産/AppPrefabs 下で見つかります/BrushControllerします。You can find it under Assets/AppPrefabs/BrushController.
  • 確認常に別の適切なモデルを使用して、Check Always Use Alternate Right Model

MR213_BrushToolOverrideSlot

BrushControllerプレハブは対象にする必要はありません、階層パネル。The BrushController prefab does not have to be included in the Hierarchy panel. ただし、その子コンポーネントを確認します。However, to check out its child components:

  • プロジェクトに入力パネルで、 BrushControllerドラッグBrushControllerにプレハブ、階層パネル。In the Project panel, type in BrushController and drag BrushController prefab into the Hierarchy panel.

MR213_BrushTool_Prefab2

検索は、ヒントコンポーネントBrushControllerします。You will find the Tip component in BrushController. 開始/停止の線を描画するのに、変換を使用します。We will use its transform to start/stop drawing lines.

  • 削除、 BrushControllerから、階層パネル。Delete the BrushController from the Hierarchy panel.
  • 保存シーンとクリック、再生ボタンをクリックします。Save the scene and click the play button. ブラシ モデルが右側のモーション コント ローラーを交換できるようにします。You will be able to see the brush model replaced the right-hand motion controller.

第 5 章「選択の入力による塗りつぶしChapter 5 - Painting with Select input

目標Objectives

  • [選択] ボタンのイベントを使用して開始および線の描画を停止する方法について説明しますLearn how to use the Select button event to start and stop a line drawing

手順Instructions

  • 検索BrushControllerのプレハブ、プロジェクトパネル。Search BrushController prefab in the Project panel.
  • インスペクターパネルをダブルクリックしてBrushControllerスクリプトを Visual Studio でコードを参照してください。In the Inspector panel, double click BrushController Script to see the code in Visual Studio

BrushController スクリプトBrushController script

BrushController InteractionManager のサブスクライブInteractionSourcePressedInteractionSourceReleasedイベント。BrushController subscribes to the InteractionManager's InteractionSourcePressed and InteractionSourceReleased events. ときにInteractionSourcePressedイベントがトリガーされると、ブラシの描画プロパティがときに true InteractionSourceReleasedイベントがトリガーされると、ブラシの描画プロパティが false に設定します。When InteractionSourcePressed event is triggered, the brush's Draw property is set to true; when InteractionSourceReleased event is triggered, the brush's Draw property is set to false.

private void InteractionSourcePressed(InteractionSourcePressedEventArgs obj)
{
    if (obj.state.source.handedness == InteractionSourceHandedness.Right && obj.pressType == InteractionSourcePressType.Select)
    {
        Draw = true;
    }
}

private void InteractionSourceReleased(InteractionSourceReleasedEventArgs obj)
{
    if (obj.state.source.handedness == InteractionSourceHandedness.Right && obj.pressType == InteractionSourcePressType.Select)
    {
        Draw = false;
    }
}

中に描画に設定されている場合は true、ブラシが生成されますポイントをインスタンス化された Unity でLineRendererします。While Draw is set to true, the brush will generate points in an instantiated Unity LineRenderer. ブラシにこのプレハブへの参照が保持されるストローク Prefabフィールド。A reference to this prefab is kept in the brush's Stroke Prefab field.

private IEnumerator DrawOverTime()
{
    // Get the position of the tip
    Vector3 lastPointPosition = tip.position;

    ...

    // Create a new brush stroke
    GameObject newStroke = Instantiate(strokePrefab);
    LineRenderer line = newStroke.GetComponent<LineRenderer>();
    newStroke.transform.position = startPosition;
    line.SetPosition(0, tip.position);
    float initialWidth = line.widthMultiplier;

    // Generate points in an instantiated Unity LineRenderer
    while (draw)
    {
        // Move the last point to the draw point position
        line.SetPosition(line.positionCount - 1, tip.position);
        line.material.color = colorPicker.SelectedColor;
        brushRenderer.material.color = colorPicker.SelectedColor;
        lastPointAddedTime = Time.unscaledTime;
        // Adjust the width between 1x and 2x width based on strength of trigger pull
        line.widthMultiplier = Mathf.Lerp(initialWidth, initialWidth * 2, width);

        if (Vector3.Distance(lastPointPosition, tip.position) > minPositionDelta || Time.unscaledTime > lastPointAddedTime + maxTimeDelta)
        {
            // Spawn a new point
            lastPointAddedTime = Time.unscaledTime;
            lastPointPosition = tip.position;
            line.positionCount += 1;
            line.SetPosition(line.positionCount - 1, lastPointPosition);
        }
        yield return null;
    }
}

カラー ピッカー ホイール UI から現在選択されている色を使用するBrushControllerへの参照が必要、 ColorPickerWheelオブジェクト。To use the currently selected color from the color picker wheel UI, BrushController needs to have a reference to the ColorPickerWheel object. BrushControllerプレハブは、交換したコント ローラーとして実行時にインスタンス化、シーン内のオブジェクトへの参照が実行時に設定する必要があります。Because the BrushController prefab is instantiated at runtime as a replacement controller, any references to objects in the scene will have to be set at runtime. ここで使用GameObject.FindObjectOfTypeを検索する、 ColorPickerWheel:In this case we use GameObject.FindObjectOfType to locate the ColorPickerWheel:

private void OnEnable()
{
    // Locate the ColorPickerWheel
    colorPicker = FindObjectOfType<ColorPickerWheel>();

    // Assign currently selected color to the brush’s material color
    brushRenderer.material.color = colorPicker.SelectedColor;
    ...
}
  • 保存シーンとクリック、再生ボタンをクリックします。Save the scene and click the play button. 線の描画し、ペイントの右側のコント ローラーの選択ボタンを使用することができます。You will be able to draw the lines and paint using the select button on the right-hand controller.

第 6 章 - は入力オブジェクトの生成での選択Chapter 6 - Object spawning with Select input

目標Objectives

  • 選択を使用する方法について説明し、ボタンの入力イベントを把握Learn how to use Select and Grasp button input events
  • オブジェクトをインスタンス化する方法について説明しますLearn how to instantiate objects

手順Instructions

  • プロジェクト入力パネルで、 ObjectSpawner検索ボックスにします。In the Project panel, type ObjectSpawner in the search box. 資産/AppPrefabs で検索することもできます/You can also find it under Assets/AppPrefabs/
  • ドラッグ、 ObjectSpawnerにプレハブ、階層パネル。Drag the ObjectSpawner prefab into the Hierarchy panel.
  • クリックしてObjectSpawnerで、階層パネル。Click ObjectSpawner in the Hierarchy panel.
  • ObjectSpawnerという名前のフィールドを持つ色ソースします。ObjectSpawner has a field named Color Source.
  • 階層パネルで、ドラッグ、 ColorPickerWheelこのフィールドへの参照。From the Hierarchy panel, drag the ColorPickerWheel reference into this field.

オブジェクトの Spawner インスペクター

  • をクリックして、 ObjectSpawnerのプレハブ、階層パネル。Click the ObjectSpawner prefab in the Hierarchy panel.
  • インスペクターパネルをダブルクリックしてObjectSpawnerスクリプトを Visual Studio でコードを参照してください。In the Inspector panel, double click ObjectSpawner Script to see the code in Visual Studio.

ObjectSpawner スクリプトObjectSpawner script

ObjectSpawner (キューブ、球、円柱) プリミティブのメッシュのコピーを領域にインスタンス化します。The ObjectSpawner instantiates copies of a primitive mesh (cube, sphere, cylinder) into the space. ときに、 InteractionSourcePressed処理を確認し、かどうかは、検出された、 InteractionSourcePressType.GraspまたはInteractionSourcePressType.Selectイベントです。When a InteractionSourcePressed is detected it checks the handedness and if it's an InteractionSourcePressType.Grasp or InteractionSourcePressType.Select event.

持ちイベント、現在のメッシュ型 (球体、キューブ、円柱) のインデックスの値が増加For a Grasp event, it increments the index of current mesh type (sphere, cube, cylinder)

private void InteractionSourcePressed(InteractionSourcePressedEventArgs obj)
{
    // Check handedness, see if it is left controller
    if (obj.state.source.handedness == handedness)
    {
        switch (obj.pressType)
        {
            // If it is Select button event, spawn object
            case InteractionSourcePressType.Select:
                if (state == StateEnum.Idle)
                {
                    // We've pressed the grasp - enter spawning state
                    state = StateEnum.Spawning;
                    SpawnObject();
                }
                break;

            // If it is Grasp button event
            case InteractionSourcePressType.Grasp:

                // Increment the index of current mesh type (sphere, cube, cylinder)
                meshIndex++;
                if (meshIndex >= NumAvailableMeshes)
                {
                    meshIndex = 0;
                }
                break;

            default:
                break;
        }
    }
}

選択イベントで、 SpawnObject()、新しいオブジェクトをインスタンス化された、親が設定されていない、世界中にリリースされました。For a Select event, in SpawnObject(), a new object is instantiated, un-parented and released into the world.

private void SpawnObject()
{
    // Instantiate the spawned object
    GameObject newObject = Instantiate(displayObject.gameObject, spawnParent);
    // Detatch the newly spawned object
    newObject.transform.parent = null;
    // Reset the scale transform to 1
    scaleParent.localScale = Vector3.one;
    // Set its material color so its material gets instantiated
    newObject.GetComponent<Renderer>().material.color = colorSource.SelectedColor;
}

ObjectSpawnerを使用して、 ColorPickerWheel表示オブジェクトの素材の色を設定します。The ObjectSpawner uses the ColorPickerWheel to set the color of the display object's material. 生成されたオブジェクトの色が保持されますが、この資料のインスタンスが提供されます。Spawned objects are given an instance of this material so they will retain their color.

  • 保存シーンとクリック、再生ボタンをクリックします。Save the scene and click the play button.

理解 ボタンを持つオブジェクトを変更し、選択 ボタンを持つオブジェクトを生成することができます。You will be able to change the objects with the Grasp button and spawn objects with the Select button.

ビルドしてアプリをデプロイする Mixed Reality ポータルBuild and deploy app to Mixed Reality Portal

  • Unity では、次のように選択します。ファイル > Build Settingsします。In Unity, select File > Build Settings.
  • クリックして開くシーンを追加を現在のシーンを追加する、 Scenes In Buildします。Click Add Open Scenes to add current scene to the Scenes In Build.
  • [Build] をクリックします。Click Build.
  • 作成、新しいフォルダー "App"という名前です。Create a New Folder named "App".
  • 1 回のクリック、アプリフォルダー。Single click the App folder.
  • [フォルダーの選択] をクリックします。Click Select Folder.
  • Unity を完了すると、ファイル エクスプ ローラー ウィンドウが表示されます。When Unity is done, a File Explorer window will appear.
  • 開く、アプリフォルダー。Open the App folder.
  • ダブルクリックYourSceneName.sln Visual Studio ソリューション ファイル。Double click YourSceneName.sln Visual Studio Solution file.
  • デバッグからターゲットを変更する Visual Studio で、上部のツールバーを使用してリリースを ARM からX64します。Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to X64.
  • デバイスのボタンの横にあるドロップダウン矢印をクリックし、ローカル マシンします。Click on the drop-down arrow next to the Device button, and select Local Machine.
  • クリックしてデバッグ]、[デバッグなしで開始メニューまたはキーを押してctrl キーを押しながら f5 キーを押してします。Click Debug -> Start Without debugging in the menu or press Ctrl + F5.

これでアプリがビルドし、Mixed Reality ポータルにインストールされています。Now the app is built and installed in Mixed Reality Portal. Mixed Reality ポータルで [スタート] メニューをもう一度起動できます。You can launch it again through Start menu in Mixed Reality Portal.

高度なデザインのレイアウトとブラシ ツールAdvanced design - Brush tools with radial layout

MixedReality213 Main

この章では、カスタム ブラシ ツール コレクションで、既定のモーション コント ローラー モデルを置換する方法を学びます。In this chapter, you will learn how to replace the default motion controller model with a custom brush tool collection. 参照用には、完了したシーンを見つけることができますMixedReality213Advanced シーンフォルダー。For your reference, you can find the completed scene MixedReality213Advanced under Scenes folder.

手順Instructions

  • プロジェクト入力パネルで、 BrushSelector検索ボックスにします。In the Project panel, type BrushSelector in the search box . 資産/AppPrefabs で検索することもできます/You can also find it under Assets/AppPrefabs/
  • ドラッグ、 BrushSelectorにプレハブ、階層パネル。Drag the BrushSelector prefab into the Hierarchy panel.
  • 組織の作成と呼ばれる空の GameObjectブラシFor organization, create an empty GameObject called Brushes
  • 次のプレハブからドラッグして、プロジェクトにパネルブラシDrag following prefabs from the Project panel into Brushes
    • 資産/AppPrefabs/BrushFatAssets/AppPrefabs/BrushFat
    • 資産/AppPrefabs/BrushThinAssets/AppPrefabs/BrushThin
    • 資産/AppPrefabs/消しゴムAssets/AppPrefabs/Eraser
    • 資産/AppPrefabs/MarkerFatAssets/AppPrefabs/MarkerFat
    • 資産/AppPrefabs/MarkerThinAssets/AppPrefabs/MarkerThin
    • 資産/AppPrefabs/鉛筆Assets/AppPrefabs/Pencil

ブラシ

  • クリックしてMotionControllersのプレハブ、階層パネル。Click MotionControllers prefab in the Hierarchy panel.
  • インスペクターパネルをオフにします常に代替権限モデルを使用する上、アニメーション コント ローラーのビジュアライザーIn the Inspector panel, uncheck Always Use Alternate Right Model on the Motion Controller Visualizer
  • 階層パネルで、をクリックしてBrushSelectorIn the Hierarchy panel, click BrushSelector
  • BrushSelectorという名前のフィールドを持つColorPickerBrushSelector has a field named ColorPicker
  • 階層パネルで、ドラッグ、 ColorPickerWheelColorPickerフィールドに、インスペクターパネル。From the Hierarchy panel, drag the ColorPickerWheel into ColorPicker field in the Inspector panel.

ブラシのセレクターを ColorPickerWheel を割り当てる

  • 階層パネルのBrushSelectorプレハブを選択、メニューオブジェクト。In the Hierarchy panel, under BrushSelector prefab, select the Menu object.
  • インスペクターパネルのLineObjectCollectionコンポーネント、オープン、オブジェクトドロップダウンの配列。In the Inspector panel, under the LineObjectCollection component, open the Objects array dropdown. 6 は空きスロットが表示されます。You will see 6 empty slots.
  • 階層パネルで、各親の下のプレハブのドラッグ、ブラシ任意の順序でこれらのスロットに GameObject です。From the Hierarchy panel, drag each of the prefabs parented under the Brushes GameObject into these slots in any order. (シーン、プロジェクト フォルダーのプレハブから、プレハブをドラッグしていることを確認してください。)(Make sure you're dragging the prefabs from the scene, not the prefabs in the project folder.)

ブラシのセレクター

BrushSelector プレハブBrushSelector prefab

以降、 BrushSelector継承AttachToController、表示処理要素オプション、 Inspectorパネル。Since the BrushSelector inherits AttachToController, it shows Handedness and Element options in the Inspector panel. 選択した発生ポイント順方向で右側にあるコント ローラーにブラシ ツールをアタッチします。We selected Right and Pointing Pose to attach brush tools to the right hand controller with forward direction.

BrushSelectorの 2 つのユーティリティを使用します。The BrushSelector makes use of two utilities:

  • 楕円: 楕円に沿った空間のポイントを生成するために使用します。Ellipse: used to generate points in space along an ellipse shape.
  • LineObjectCollection: 任意の行クラス (例: 楕円) によって生成されたポイントを使用してオブジェクトを配布します。LineObjectCollection: distributes objects using the points generated by any Line class (eg, Ellipse). これは、どのような使用する、ブラシに沿って楕円のシェイプを配置します。This is what we'll be using to place our brushes along the Ellipse shape.

組み合わせて使用すると、放射状メニューを作成するこれらのユーティリティを使用できます。When combined, these utilities can be used to create a radial menu.

LineObjectCollection スクリプトLineObjectCollection script

LineObjectCollectionサイズ、位置の行に分散されていますオブジェクトの回転のコントロールがあります。LineObjectCollection has controls for the size, position and rotation of objects distributed along its line. これは、ブラシのセレクターのような放射状のメニューを作成するために役立ちます。This is useful for creating radial menus like the brush selector. 外観を作成するブラシをスケールから近づいた場合は、選択したセンターの位置に何も、 ObjectScaleオフ、エッジの中央と tapers のピークを曲線します。To create the appearance of brushes that scale up from nothing as they approach the center selected position, the ObjectScale curve peaks in the center and tapers off at the edges.

BrushSelector スクリプトBrushSelector script

場合、 BrushSelector、手続き型のアニメーションを使用することにしました。In the case of the BrushSelector, we've chosen to use procedural animation. 最初に、ブラシのモデルは、によって楕円で配布、 LineObjectCollectionスクリプト。First, brush models are distributed in an ellipse by the LineObjectCollection script. 各ブラシがその位置に基づいて、ユーザーの手の形での保守を担当し、そのDisplayMode値で、選択内容に基づいて変更します。Then, each brush is responsible for maintaining its position in the user's hand based on its DisplayMode value, which changes based on the selection. 手続き型の方法を選択したユーザーは、ブラシを選択すると、中断されているブラシの位置の遷移の可能性が高くため。We chose a procedural approach because of the high probability of brush position transitions being interrupted as the user selects brushes. Mecanim アニメーションでは、中断を正常に処理できますが、単純な Lerp 操作よりも複雑にします。Mecanim animations can handle interruptions gracefully, but it tends to be more complicated than a simple Lerp operation.

BrushSelector両方の組み合わせを使用します。BrushSelector uses a combination of both. タッチパッドの入力が検出されると、ブラシ オプションは表示されているようになり、放射状のメニューに沿ったスケール アップします。When touchpad input is detected, brush options become visible and scale up along the radial menu. (これは、ユーザーが選択を行うことを示します) タイムアウト期間後に、ブラシのオプションをスケール ダウン、もう一度選択したブラシのみを離れること。After a timeout period (which indicates that the user has made a selection) the brush options scale down again, leaving only the selected brush.

タッチパッドの入力を視覚化します。Visualizing touchpad input

コント ローラー モデルが完全に置き換えられましたいる場合でも元のモデルの入力に入力を表示することもできます。Even in cases where the controller model has been completely replaced, it can be helpful to show input on the original model inputs. これにより、実際には、ユーザーのアクションを地上にします。This helps to ground the user's actions in reality. BrushSelector入力を受け取ったとき、タッチパッドを簡単に表示することにしました。For the BrushSelector we've chosen to make the touchpad briefly visible when the input is received. カスタム素材には、その素材を置き換えて、コント ローラーからタッチパッド要素を取得することによってこれは、入力を受信した最後の時間タッチパッドに基づいてその素材の色をグラデーションを適用します。This was done by retrieving the Touchpad element from the controller, replacing its material with a custom material, then applying a gradient to that material's color based on the last time touchpad input was received.

protected override void OnAttachToController()
{
    // Turn off the default controller's renderers
    controller.SetRenderersVisible(false);

    // Get the touchpad and assign our custom material to it
    Transform touchpad;
    if (controller.TryGetElement(MotionControllerInfo.ControllerElementEnum.Touchpad, out touchpad))
    {
        touchpadRenderer = touchpad.GetComponentInChildren<MeshRenderer>();
        originalTouchpadMaterial = touchpadRenderer.material;
        touchpadRenderer.material = touchpadMaterial;
        touchpadRenderer.enabled = true;
    }
            
    // Subscribe to input now that we're parented under the controller
    InteractionManager.InteractionSourceUpdated += InteractionSourceUpdated;
}

private void Update()
{
    ...
    // Update our touchpad material
    Color glowColor = touchpadColor.Evaluate((Time.unscaledTime - touchpadTouchTime) / touchpadGlowLossTime);
    touchpadMaterial.SetColor("_EmissionColor", glowColor);
    touchpadMaterial.SetColor("_Color", glowColor);
    ...
}

タッチパッドの入力とブラシ ツールの選択Brush tool selection with touchpad input

タッチパッドの押された入力が検出されると、ブラシのセレクターを左または右がかどうかことを確認する入力の位置を確認します。When the brush selector detects touchpad's pressed input, it checks the position of the input to determine if it was to the left or right.

ストロークの太さを selectPressedAmountStroke thickness with selectPressedAmount

代わりに、 InteractionSourcePressType.Select内のイベント、 InteractionSourcePressed()、押された状態の量をアナログ値を取得するselectPressedAmount.Instead of the InteractionSourcePressType.Select event in the InteractionSourcePressed(), you can get the analog value of the pressed amount through selectPressedAmount. この値を取得できるInteractionSourceUpdated() します。This value can be retrieved in InteractionSourceUpdated().

private void InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
{
    if (obj.state.source.handedness == handedness)
    {
        if (obj.state.touchpadPressed)
        {
            // Check which side we clicked
            if (obj.state.touchpadPosition.x < 0)
            {
                currentAction = SwipeEnum.Left;
            }
            else
            {
                currentAction = SwipeEnum.Right;
            }

            // Ping the touchpad material so it gets bright
            touchpadTouchTime = Time.unscaledTime;
        }

        if (activeBrush != null)
        {
            // If the pressed amount is greater than our threshold, draw
            if (obj.state.selectPressedAmount >= selectPressedDrawThreshold)
            {
                activeBrush.Draw = true;
                activeBrush.Width = ProcessSelectPressedAmount(obj.state.selectPressedAmount);
            }
            else
            {
                // Otherwise, stop drawing
                activeBrush.Draw = false;
                selectPressedSmooth = 0f;
            }
        }
    }
}

消しゴム スクリプトEraser script

消しゴムは特殊な種類の基本をオーバーライドするブラシブラシDrawOverTime() 関数。Eraser is a special type of brush that overrides the base Brush's DrawOverTime() function. 描画が true の場合、消しゴムがそのヒントが、既存のブラシのストロークと交差するかどうかを確認します。While Draw is true, the eraser checks to see if its tip intersects with any existing brush strokes. その場合を圧縮するキューに追加され削除します。If it does, they are added to a queue to be shrunk down and deleted.

高度な設計 - Teleportation と locomotionAdvanced design - Teleportation and locomotion

Teleportation スティックを使用して、シーン内を移動するには、使用できるようにする場合MixedRealityCameraParentの代わりにMixedRealityCameraします。If you want to allow the user to move around the scene with teleportation using thumbstick, use MixedRealityCameraParent instead of MixedRealityCamera. 追加する必要がありますInputManagerDefaultCusorします。You also need to add InputManager and DefaultCusor. MixedRealityCameraParentが既に含まれてMotionControllers境界、子コンポーネントとして既存を削除する必要がありますMotionControllers環境prefab します。Since MixedRealityCameraParent already includes MotionControllers and Boundary as child components, you should remove existing MotionControllers and Environment prefab.

手順Instructions

  • 階層パネルで、削除MixedRealityCamera環境MotionControllersIn the Hierarchy panel, delete MixedRealityCamera, Environment and MotionControllers
  • プロジェクト パネルし、検索に次のプレハブをドラッグ、階層パネル。From the Project panel, search and drag the following prefabs into the Hierarchy panel:
    • 資産/AppPrefabs/入力/プレハブ/MixedRealityCameraParentAssets/AppPrefabs/Input/Prefabs/MixedRealityCameraParent
    • 資産/AppPrefabs/入力/プレハブ/InputManagerAssets/AppPrefabs/Input/Prefabs/InputManager
    • 資産/AppPrefabs/入力/プレハブ/カーソル/DefaultCursorAssets/AppPrefabs/Input/Prefabs/Cursor/DefaultCursor

複合現実のカメラの親

  • 階層パネルで、をクリックして入力マネージャーIn the Hierarchy panel, click Input Manager
  • インスペクターパネルで、下へスクロールして、単純な 1 つのポインターのセレクターセクションIn the Inspector panel, scroll down to the Simple Single Pointer Selector section
  • 階層パネルで、ドラッグDefaultCursorカーソルフィールドFrom the Hierarchy panel, drag DefaultCursor into Cursor field

既定値のカーソルの割り当てください。

  • 保存シーンとクリック、再生ボタンをクリックします。Save the scene and click the play button. 左/右またはテレポートを回転するスティックを使用することができます。You will be able to use the thumbstick to rotate left/right or teleport.

最後ですThe end

このチュートリアルは終わりです。And that's the end of this tutorial! 学習内容。You learned:

  • Unity のゲーム モードとランタイムの motion コント ローラー モデルを操作する方法。How to work with motion controller models in Unity's game mode and runtime.
  • さまざまな種類のボタン イベントとそのアプリケーションを使用する方法。How to use different types of button events and their applications.
  • コント ローラー上に UI 要素を重ね合わせる、または完全にカスタマイズする方法。How to overlay UI elements on top of the controller or fully customize it.

アニメーション コント ローラーで、独自の没入型エクスペリエンスの作成を開始する準備が整いました。You are now ready to start creating your own immersive experience with motion controllers!

完了したシーンCompleted scenes

  • Unity のプロジェクトパネル クリック、シーンフォルダー。In Unity's Project panel click on the Scenes folder.
  • 2 つの Unity sceens 見つかりますMixedReality213MixedReality213Advancedします。You will find two Unity sceens MixedReality213 and MixedReality213Advanced.
    • MixedReality213:1 つのブラシで完了したシーンMixedReality213: Completed scene with single brush
    • MixedReality213Advanced:[選択] ボタンを押して量例での複数のブラシで完了したシーンMixedReality213Advanced: Completed scene with multiple brush with select button's press amount example

関連項目See also