注意

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


MR 入力 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 Topic2 MixedReality213 Topic3
コントローラーの視覚化Controller visualization コントローラーの入力イベントController input events カスタムコントローラーと UICustom controller and UI
Unity のゲームモードとランタイムでモーションコントローラーモデルをレンダリングする方法について説明します。Learn how to render motion controller models in Unity's game mode and runtime. さまざまな種類のボタンイベントとそのアプリケーションを理解します。Understand different types of button events and their applications. コントローラー上に UI 要素を重ね合わせる方法、または 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 Mixed Reality 開発用に Unity を最適化するOptimize Unity for Windows Mixed Reality development
  • Mixed Reality カメラの設定Setup Mixed Reality Camera
  • 環境のセットアップSetup environment

手順Instructions

  • Unity を起動します。Start Unity.
  • [開く] を選択します。Select Open.
  • デスクトップに移動し、以前に unarchived した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 で、[ファイル > ビルド設定] を選択します。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
  • ビルドの種類をD3Dに設定Set Build Type to D3D
  • SDK を最新のインストール済みに設定するSet SDK to Latest Installed
  • Unity C#プロジェクトを確認する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 の設定で、[ Virtual Reality がサポートされる] をオンにします。In XR Settings, check Virtual Reality Supported
  • [Virtual Reality Sdk] で、[ Windows Mixed reality ] を選択します。Under Virtual Reality SDKs, select Windows Mixed Reality

MR213_XRSettings

  • ビルドの設定ウィンドウを閉じます。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.

ProjectStructure

参照のための完了したシーン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
  • [プロジェクト] パネルで、次の prefabs を検索し、[階層] パネルにドラッグします。From the Project panel, search and drag the following prefabs into the Hierarchy panel:
    • Assets/HoloToolkit/Input/Prefabs/MixedRealityCameraAssets/HoloToolkit/Input/Prefabs/MixedRealityCamera
    • Assets/AppPrefabs/EnvironmentAssets/AppPrefabs/Environment

カメラと環境

  • Mixed Reality Toolkit には、次の2つのカメラ prefabs があります。There are two camera prefabs in Mixed Reality Toolkit:
    • MixedRealityCamera:カメラのみMixedRealityCamera.prefab: Camera only
    • MixedRealityCameraParent:カメラ + テレと境界MixedRealityCameraParent.prefab: Camera + Teleportation + Boundary
    • このチュートリアルでは、 MixedRealityCamera機能を使用せずに、この機能を使用します。In this tutorial, we will use MixedRealityCamera without teleportation feature. このため、基本的なフロアを含む単純な環境prefab を追加し、ユーザーが接地できるようにしました。Because of this, we added simple Environment prefab which contains a basic floor to make the user feel grounded.
    • MixedRealityCameraParentを使用した電話の詳細については、上級設計と 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
  • 「Gray」と入力し、 SkyboxGrayを選択します。Type in ‘gray’ and select SkyboxGray

(Assets/AppPrefabs/Support/マテリアル/SkyboxGray)(Assets/AppPrefabs/Support/Materials/SkyboxGray.mat)

スカイボックスの設定

  • スカイボックスをチェックして、割り当てられている灰色のグラデーションスカイボックスを確認できるようにしますCheck Skybox option to be able to see assigned gray gradient skybox

スカイボックスの切り替えオプション

  • MixedRealityCamera、Environment、および gray スカイボックスのシーンは次のようになります。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 . また、Assets/HoloToolkit/Input/Prefabs/で見つけることもできます。You can also find it under Assets/HoloToolkit/Input/Prefabs/.
  • Motioncontrollers prefab を [階層] パネルにドラッグします。Drag the MotionControllers prefab into the Hierarchy panel.
  • [階層] パネルで、 motioncontrollers prefab をクリックします。Click on the MotionControllers prefab in the Hierarchy panel.

MotionControllers prefabMotionControllers prefab

Motioncontrollers prefab には、代替コントローラーモデルのスロットを提供するMotioncontrollers ビジュアライザースクリプトが用意されています。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

  • [インスペクター ] パネルで、[ Motionコントローラービジュアライザースクリプト] をダブルクリックして、Visual Studio のコードを表示します。In the Inspector panel, double click MotionControllerVisualizer script to see the code in the Visual Studio

MotionコントローラービジュアライザースクリプトMotionControllerVisualizer script

Motioncontroller ビジュアライザーMotioncontroller infoクラスは、既定のコントローラーモデルにアクセス & 変更する手段を提供します。The MotionControllerVisualizer and MotionControllerInfo classes provide the means to access & modify the default controller models. Motioncontroller ビジュアライザーは、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. このコースでは、Mixed Reality Toolkit を使用して、Khronos グループのUnitygltf プロジェクトのバージョンを使用します。This course, via the Mixed Reality Toolkit, uses a version of the Khronos Group's UnityGLTF project.

コントローラーが配信されると、スクリプトはMotioncontroller infoを使用して特定のコントローラー要素の変換を見つけることができるため、適切に配置できます。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

  • [プロジェクト] パネルで、 Motionコントローラー情報スクリプトを検索します。In the Project panel, search MotionControllerInfo script.
  • 検索結果から [ Motionコントローラー情報スクリプト] をダブルクリックして、Visual Studio のコードを確認します。From the search result, double click MotionControllerInfo script to see the code in Visual Studio.

Motionコントローラー情報スクリプトMotionControllerInfo script

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

MR213 Motionコントローラー要素

  • HomeHome
  • MenuMenu
  • つかん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 script] をダブルクリックして 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.

Attachelementtocontroller () で、In AttachElementToController(),

  • Motionコントローラーを使用してきき手をチェックするCheck handedness using MotionControllerInfo.Handedness
  • MotionTryGetElement () を使用して、コントローラーの特定の要素を取得します。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. Onattachtocontroller関数とOnDetatchFromController関数をオーバーライドするだけで、コントローラーが検出または切断されたときにセットアップ/ブレークダウンを実行できます。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. [Assets/AppPrefabs/] の下にも表示されます。You can also find it under Assets/AppPrefabs/.
  • ColorPickerWheel prefab を [階層] パネルにドラッグします。Drag ColorPickerWheel prefab into the Hierarchy panel.
  • [階層] パネルの [ ColorPickerWheel prefab] をクリックします。Click the ColorPickerWheel prefab in the Hierarchy panel.
  • [インスペクター ] パネルで [ ColorPickerWheel Script] をダブルクリックして、Visual Studio でコードを表示します。In the Inspector panel, double click ColorPickerWheel Script to see the code in Visual Studio.

ColorPickerWheel prefab

ColorPickerWheel スクリプトColorPickerWheel script

ColorPickerWheelattachtocontrollerを継承するため 、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. これは、スクリプトをリファクタリングせずに既存の prefab をコントローラーにアタッチする場合に便利です。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

  • [階層] パネルで、[ ColorPickerWheel ] をクリックします。In the Hierarchy panel, click ColorPickerWheel
  • [インスペクター ] パネルの [ Animatior] で、[ ColorPickerWheelController ] をダブルクリックします。In the Inspector panel, under Animatior, double click ColorPickerWheelController
  • [アニメーター ] タブが開いていることを確認できます。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 animation コントローラーで定義されています。Show and Hide parameters are defined in the ColorPickerWheelController animation controller.

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

マニュアルInstructions

  • [階層] パネルで [ ColorPickerWheel prefab] を選択します。In the Hierarchy panel, select ColorPickerWheel prefab
  • [インスペクター ] パネルで [ ColorPickerWheel script] をダブルクリックして、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)

両方が true の場合、タッチパッドの位置 (obj.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 () では、 visibleプロパティに基づいて、カラーピッカーのアニメーターコンポーネントでアニメーショントリガーの表示と非表示をトリガーします。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を使用して、カラーホイールのメッシュ collider に射線をキャストします。これにより、UV 位置が返されます。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.

カラーピッカーのホイール Raycasting

...
    // 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);
}

Chapter 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」と入力し、結果から prefab を選択します。Type in 'BrushController' and select the prefab from the result. これは Assets/AppPrefabs/BrushControllerにあります。You can find it under Assets/AppPrefabs/BrushController.
  • 常に代替右モデルを使用することを確認するCheck Always Use Alternate Right Model

MR213_BrushToolOverrideSlot

BrushController prefab は、階層パネルに含まれている必要はありません。The BrushController prefab does not have to be included in the Hierarchy panel. ただし、子コンポーネントを確認するには、次のようにします。However, to check out its child components:

  • [プロジェクト] パネルで、「 BrushController 」と入力し、[ BrushController prefab] を [階層] パネルにドラッグします。In the Project panel, type in BrushController and drag BrushController prefab into the Hierarchy panel.

MR213_BrushTool_Prefab2

Tipコンポーネントは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.

Chapter 5-Select 入力による塗りつぶしChapter 5 - Painting with Select input

目的Objectives

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

手順Instructions

  • [プロジェクト] パネルでBrushController prefab を検索します。Search BrushController prefab in the Project panel.
  • [インスペクター ] パネルで [ BrushController Script] をダブルクリックして、Visual Studio でコードを表示します。In the Inspector panel, double click BrushController Script to see the code in Visual Studio

BrushController スクリプトBrushController script

BrushControllerは、InteractionManager のInteractionsource押されたイベントとInteractionSourceReleasedイベントをサブスクライブします。BrushController subscribes to the InteractionManager's InteractionSourcePressed and InteractionSourceReleased events. Interactionsourcepressedれたイベントがトリガーされると、ブラシのDrawプロパティが true に設定されます。InteractionSourceReleasedイベントがトリガーされると、ブラシのDrawプロパティが 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 への参照は、ブラシのストローク 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 で現在選択されている色を使用するには、 BrushControllerColorPickerWheelオブジェクトへの参照を持っている必要があります。To use the currently selected color from the color picker wheel UI, BrushController needs to have a reference to the ColorPickerWheel object. BrushController prefab は実行時に交換用コントローラーとしてインスタンス化されるため、シーン内のオブジェクトへの参照は実行時に設定する必要があります。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. この例では、 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.

Chapter 6-Select 入力を使用したオブジェクトの生成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. また、Assets/AppPrefabs の下にあります。You can also find it under Assets/AppPrefabs/
  • ObjectSpawner prefab を [階層] パネルにドラッグします。Drag the ObjectSpawner prefab into the Hierarchy panel.
  • [階層] パネルの [ ObjectSpawner ] をクリックします。Click ObjectSpawner in the Hierarchy panel.
  • ObjectSpawnerには、 Color Sourceという名前のフィールドがあります。ObjectSpawner has a field named Color Source.
  • [階層] パネルで、 ColorPickerWheel参照をこのフィールドにドラッグします。From the Hierarchy panel, drag the ColorPickerWheel reference into this field.

オブジェクト Spawner Inspector

  • [階層] パネルの [ ObjectSpawner prefab] をクリックします。Click the ObjectSpawner prefab in the Hierarchy panel.
  • [インスペクター ] パネルで [ ObjectSpawner Script] をダブルクリックして、Visual Studio でコードを表示します。In the Inspector panel, double click ObjectSpawner Script to see the code in Visual Studio.

ObjectSpawner スクリプトObjectSpawner script

ObjectSpawnerは、空間にプリミティブメッシュ (cube、球、シリンダ) のコピーをインスタンス化します。The ObjectSpawner instantiates copies of a primitive mesh (cube, sphere, cylinder) into the space. Interactionsourcepressedれたことが検出されると、きき者と、そのイベントが interactionsourcepresstype またはinteractionsourcepresstypeであるかどうかをチェックします。When a InteractionSourcePressed is detected it checks the handedness and if it's an InteractionSourcePressType.Grasp or InteractionSourcePressType.Select event.

イベントを把握するために、現在のメッシュの種類 (球、cube、円柱) のインデックスをインクリメントします。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;
        }
    }
}

Selectイベントの場合、 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 で、[ファイル > ビルド設定] を選択します。In Unity, select File > Build Settings.
  • [開いているシーンの追加] をクリックして、ビルドのシーンに現在のシーンを追加します。Click Add Open Scenes to add current scene to the Scenes In Build.
  • [Build] をクリックします。Click Build.
  • "App" という名前の新しいフォルダーを作成します。Create a New Folder named "App".
  • アプリフォルダーをシングルクリックします。Single click the App folder.
  • [フォルダーの選択] をクリックします。Click Select Folder.
  • Unity が完了すると、エクスプローラーウィンドウが表示されます。When Unity is done, a File Explorer window will appear.
  • アプリフォルダーを開きます。Open the App folder.
  • YourSceneName 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 . また、Assets/AppPrefabs の下にあります。You can also find it under Assets/AppPrefabs/
  • BrushSelector prefab を [階層] パネルにドラッグします。Drag the BrushSelector prefab into the Hierarchy panel.
  • 組織の場合は、ブラシと呼ばれる空のオブジェクトを作成します。For organization, create an empty GameObject called Brushes
  • [プロジェクト] パネルから [ブラシ] に次の prefabs をドラッグします。Drag following prefabs from the Project panel into Brushes
    • Assets/AppPrefabs/BrushFatAssets/AppPrefabs/BrushFat
    • Assets/AppPrefabs/BrushThinAssets/AppPrefabs/BrushThin
    • Assets/AppPrefabs/消しゴムAssets/AppPrefabs/Eraser
    • Assets/AppPrefabs/MarkerFatAssets/AppPrefabs/MarkerFat
    • Assets/AppPrefabs/MarkerThinAssets/AppPrefabs/MarkerThin
    • Assets/AppPrefabs/鉛筆Assets/AppPrefabs/Pencil

ブラシ

  • [階層] パネルの [ motioncontrollers prefab] をクリックします。Click MotionControllers prefab in the Hierarchy panel.
  • [インスペクター ] パネルの [モーションコントローラービジュアライザー常に代替モデルを使用する] チェックボックスをオフにします。In the Inspector panel, uncheck Always Use Alternate Right Model on the Motion Controller Visualizer
  • [階層] パネルで、[ BrushSelector ] をクリックします。In the Hierarchy panel, click BrushSelector
  • BrushSelectorcolorpickerという名前のフィールドがあるBrushSelector has a field named ColorPicker
  • [階層] パネルで、[ ColorPickerWheel ] を [インスペクター ] パネルの [ colorpicker ] フィールドにドラッグします。From the Hierarchy panel, drag the ColorPickerWheel into ColorPicker field in the Inspector panel.

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

  • [階層] パネルの [ BrushSelector Prefab] で、メニューオブジェクトを選択します。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.
  • [階層] パネルで、[ブラシの prefabs] の下にある各親を、任意の順序でこれらのスロットにドラッグします。From the Hierarchy panel, drag each of the prefabs parented under the Brushes GameObject into these slots in any order. (プロジェクトフォルダー内の prefabs ではなく、シーンから prefabs をドラッグしていることを確認してください)。(Make sure you're dragging the prefabs from the scene, not the prefabs in the project folder.)

ブラシセレクター

BrushSelector prefabBrushSelector prefab

BrushSelectorattachtocontrollerを継承するため、[ 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.

SelectPressedAmount を使用したストロークの太さStroke thickness with selectPressedAmount

Interactionsourcepresstype () 内のSelectイベントの代わりに、 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.

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

ユーザーがサムスティックを使用して、ユーザーによるシーンの移動を許可する場合は、 MixedRealityCameraではなくMixedRealityCameraParentを使用します。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

  • [階層] パネルで、 MixedRealityCameraEnvironmentmotioncontrollersを削除します。In the Hierarchy panel, delete MixedRealityCamera, Environment and MotionControllers
  • [プロジェクト] パネルで、次の prefabs を検索し、[階層] パネルにドラッグします。From the Project panel, search and drag the following prefabs into the Hierarchy panel:
    • Assets/AppPrefabs/Input/Prefabs/MixedRealityCameraParentAssets/AppPrefabs/Input/Prefabs/MixedRealityCameraParent
    • Assets/AppPrefabs/Input/Prefabs/InputmanagerAssets/AppPrefabs/Input/Prefabs/InputManager
    • Assets/AppPrefabs/Input/Prefabs/Cursor/DefaultcursorAssets/AppPrefabs/Input/Prefabs/Cursor/DefaultCursor

Mixed Reality カメラの親

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

DefaultCursor の割り当て

  • シーンを保存し、[再生] ボタンをクリックします。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 のゲームモードとランタイムでモーションコントローラーモデルを操作する方法について説明します。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 要素を重ね合わせる方法、または 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.
  • Unity sceens MixedReality213MixedReality213Advancedが2つ見つかります。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