Skip to content

Instantly share code, notes, and snippets.

@yuujii
Last active July 21, 2020 02:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuujii/43347aa5a0b68e930f182ed3a58a375e to your computer and use it in GitHub Desktop.
Save yuujii/43347aa5a0b68e930f182ed3a58a375e to your computer and use it in GitHub Desktop.
Magic LeapのControlのボタンにイベントを登録できるやつ #Unity #ML1
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.MagicLeap;
using System.Collections.Generic;
using UnityEngine.Events;
namespace MagicLeap
{
/// <summary>
/// Magic LeapのControlのボタンにイベントを登録できるやつ
/// </summary>
public class MLControlManager : MonoBehaviour
{
[SerializeField]
private ControllerConnectionHandler _controllerConnectionHandler;
[SerializeField]
private UnityEvent m_touchpad_down_events = new UnityEvent();
// タッチパッドのスワイプをリアルタイムに取れるものではなく、ジェスチャ認識した結果が取れるっぽい。
[SerializeField]
private UnityEvent m_touchpad_update_events = new UnityEvent();
[SerializeField]
private UnityEvent m_touchpad_up_events = new UnityEvent();
[SerializeField]
private UnityEvent m_trigger_down_events = new UnityEvent();
[SerializeField]
private UnityEvent m_trigger_up_events = new UnityEvent();
[SerializeField]
private UnityEvent m_bumper_down_events = new UnityEvent();
[SerializeField]
private UnityEvent m_bumper_up_events = new UnityEvent();
[SerializeField]
private UnityEvent m_home_down_events = new UnityEvent();
[SerializeField]
private UnityEvent m_home_up_events = new UnityEvent();
[SerializeField, Tooltip("Text to update on Control changes.")]
private Text _statusLabel;
#region Unity Methods
void Start()
{
_controllerConnectionHandler = GetComponent<ControllerConnectionHandler>();
MLInput.Start();
MLInput.OnControllerTouchpadGestureStart += HandleOnTouchpadDown;
MLInput.OnControllerTouchpadGestureContinue += HandleOnTouchpadContinue;
MLInput.OnControllerTouchpadGestureEnd += HandleOnTouchpadUp;
MLInput.OnControllerButtonDown += HandleOnButtonDown;
MLInput.OnControllerButtonUp += HandleOnButtonUp;
MLInput.OnTriggerDown += HandleOnTriggerDown;
MLInput.OnTriggerUp += HandleOnTriggerUp;
}
/// <summary>
/// Unregister callbacks and stop input API.
/// </summary>
void OnDestroy()
{
MLInput.OnControllerTouchpadGestureStart -= HandleOnTouchpadDown;
MLInput.OnControllerTouchpadGestureContinue -= HandleOnTouchpadContinue;
MLInput.OnControllerTouchpadGestureEnd -= HandleOnTouchpadUp;
MLInput.OnControllerButtonDown -= HandleOnButtonDown;
MLInput.OnControllerButtonUp -= HandleOnButtonUp;
MLInput.OnTriggerDown -= HandleOnTriggerDown;
MLInput.OnTriggerUp -= HandleOnTriggerUp;
MLInput.Stop();
}
#endregion
#region Private Methods
/// <summary>
/// Cannot make the assumption that a privilege is still granted after
/// returning from pause. Return the application to the state where it
/// requests privileges needed and clear out the list of already granted
/// privileges. Also, unregister callbacks.
/// </summary>
private void OnApplicationPause(bool pause)
{
if (pause)
{
MLInput.OnControllerTouchpadGestureStart -= HandleOnTouchpadDown;
MLInput.OnControllerTouchpadGestureContinue -= HandleOnTouchpadContinue;
MLInput.OnControllerTouchpadGestureEnd -= HandleOnTouchpadUp;
MLInput.OnControllerButtonDown -= HandleOnButtonDown;
MLInput.OnControllerButtonUp -= HandleOnButtonUp;
MLInput.OnTriggerDown -= HandleOnTriggerDown;
MLInput.OnTriggerUp -= HandleOnTriggerUp;
MLInput.Stop();
}
}
#endregion
#region Event Handlers
private void HandleOnTouchpadDown(byte controllerId, MLInputControllerTouchpadGesture touchpad)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (m_touchpad_down_events.GetPersistentEventCount() != 0)
m_touchpad_down_events.Invoke();
var log = string.Format("Down: \ntouchpad.Angle: {0}\n Direction: {1}\n Distance: {2}\n FingerGap: {3}\n PosAndForce: {4}\n Radius: {5}\n Speed: {6}\n Type {7}",
touchpad.Angle, touchpad.Direction, touchpad.Distance, touchpad.FingerGap, touchpad.PosAndForce,
touchpad.Radius, touchpad.Speed, touchpad.Type);
if (_statusLabel != null) _statusLabel.text = log;
//Debug.Log(log);
}
private void HandleOnTouchpadContinue(byte controllerId, MLInputControllerTouchpadGesture touchpad)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (m_touchpad_update_events.GetPersistentEventCount() != 0)
m_touchpad_update_events.Invoke();
var log = string.Format("Con: \ntouchpad.Angle: {0}\n Direction: {1}\n Distance: {2}\n FingerGap: {3}\n PosAndForce: {4}\n Radius: {5}\n Speed: {6}\n Type {7}",
touchpad.Angle, touchpad.Direction, touchpad.Distance, touchpad.FingerGap, touchpad.PosAndForce,
touchpad.Radius, touchpad.Speed, touchpad.Type);
if (_statusLabel != null) _statusLabel.text = log;
//Debug.Log(log);
}
private void HandleOnTouchpadUp(byte controllerId, MLInputControllerTouchpadGesture touchpad)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (m_touchpad_up_events.GetPersistentEventCount() != 0)
m_touchpad_up_events.Invoke();
var log = string.Format("Up: \ntouchpad.Angle: {0}\n Direction: {1}\n Distance: {2}\n FingerGap: {3}\n PosAndForce: {4}\n Radius: {5}\n Speed: {6}\n Type {7}",
touchpad.Angle, touchpad.Direction, touchpad.Distance, touchpad.FingerGap, touchpad.PosAndForce,
touchpad.Radius, touchpad.Speed, touchpad.Type);
if (_statusLabel != null) _statusLabel.text = log;
//Debug.Log(log);
}
/// <summary>
/// Handles the event for trigger down.
/// </summary>
/// <param name="controllerId">The id of the controller.</param>
/// <param name="triggerValue">The value of the trigger.</param>
private void HandleOnTriggerDown(byte controllerId, float triggerValue)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (triggerValue >= 0.7f)
if (m_trigger_down_events.GetPersistentEventCount() != 0)
m_trigger_down_events.Invoke();
if (_statusLabel != null) _statusLabel.text = "TriggerDownThreshold: " + MLInput.TriggerDownThreshold;
}
/// <summary>
/// Handles the event for trigger up.
/// </summary>
/// <param name="controllerId">The id of the controller.</param>
/// <param name="triggerValue">The value of the trigger.</param>
private void HandleOnTriggerUp(byte controllerId, float triggerValue)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (m_trigger_up_events.GetPersistentEventCount() != 0)
m_trigger_up_events.Invoke();
if (_statusLabel != null) _statusLabel.text = "TriggerUpThreshold: " + MLInput.TriggerUpThreshold;
}
/// <summary>
/// Handles the event for button down.
/// </summary>
/// <param name="controllerId">The id of the controller.</param>
/// <param name="button">The button that is being released.</param>
private void HandleOnButtonDown(byte controllerId, MLInputControllerButton button)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (button == MLInputControllerButton.Bumper)
{
if (m_bumper_down_events.GetPersistentEventCount() != 0)
m_bumper_down_events.Invoke();
}
if (button == MLInputControllerButton.HomeTap)
{
if (m_home_down_events.GetPersistentEventCount() != 0)
m_home_down_events.Invoke();
}
}
/// <summary>
/// Handles the event for button up.
/// </summary>
/// <param name="controllerId">The id of the controller.</param>
/// <param name="button">The button that is being released.</param>
private void HandleOnButtonUp(byte controllerId, MLInputControllerButton button)
{
if (_controllerConnectionHandler.ConnectedController != MLInput.GetController(controllerId))
return;
if (button == MLInputControllerButton.Bumper)
{
if (m_bumper_up_events.GetPersistentEventCount() != 0)
m_bumper_up_events.Invoke();
}
if (button == MLInputControllerButton.HomeTap)
{
if (m_home_up_events.GetPersistentEventCount() != 0)
m_home_up_events.Invoke();
}
}
#endregion
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment