mixedreality/com.microsoft.mixedreality..../Services/InputSystem/Utilities/CanvasUtility.cs

66 lines
2.4 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using UnityEngine;
using UnityEngine.EventSystems;
namespace Microsoft.MixedReality.Toolkit.Input.Utilities
{
/// <summary>
/// Helper class for setting up canvases for use in the MRTK.
/// </summary>
[DisallowMultipleComponent]
[RequireComponent(typeof(Canvas))]
[AddComponentMenu("Scripts/MRTK/Services/CanvasUtility")]
public class CanvasUtility : MonoBehaviour, IMixedRealityPointerHandler
{
private bool oldIsTargetPositionLockedOnFocusLock = false;
public void OnPointerClicked(MixedRealityPointerEventData eventData) { }
public void OnPointerDown(MixedRealityPointerEventData eventData)
{
oldIsTargetPositionLockedOnFocusLock = eventData.Pointer.IsTargetPositionLockedOnFocusLock;
if (!(eventData.Pointer is IMixedRealityNearPointer) && eventData.Pointer.Controller.IsRotationAvailable)
{
eventData.Pointer.IsTargetPositionLockedOnFocusLock = false;
}
}
public void OnPointerDragged(MixedRealityPointerEventData eventData) { }
public void OnPointerUp(MixedRealityPointerEventData eventData)
{
eventData.Pointer.IsTargetPositionLockedOnFocusLock = oldIsTargetPositionLockedOnFocusLock;
}
private void Start()
{
VerifyCanvasConfiguration();
}
/// <summary>
/// Verifies and updates MRTK related canvas configuration.
/// </summary>
public void VerifyCanvasConfiguration()
{
Canvas canvas = GetComponent<Canvas>();
Debug.Assert(canvas != null);
if (canvas.worldCamera == null)
{
Debug.Assert(CoreServices.InputSystem?.FocusProvider?.UIRaycastCamera != null, this);
canvas.worldCamera = CoreServices.InputSystem?.FocusProvider?.UIRaycastCamera;
if (EventSystem.current == null)
{
Debug.LogError("No EventSystem detected. UI events will not be propagated to Unity UI.");
}
}
else
{
Debug.LogError("World Space Canvas should have no camera set to work properly with Mixed Reality Toolkit. At runtime, they'll get their camera set automatically.");
}
}
}
}