using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
///
/// 提供各种输入事件
///
public class InputEvent : Common.MonoSingleton
{
//*************输入设别**************************
InputDevice leftHandController;
InputDevice rightHandController;
InputDevice headController;
//**************对外提供公开事件******************
#region public event
public Action onLeftTriggerEnter;
public Action onLeftTriggerDown;
public Action onLeftTriggerUp;
public Action onRightTriggerEnter;
public Action onRightTriggerDown;
public Action onRightTriggerUp;
public Action onLeftGripEnter;
public Action onLeftGripDown;
public Action onLeftGripUp;
public Action onRightGripEnter;
public Action onRightGripDown;
public Action onRightGripUp;
public Action onLeftAppButtonEnter;
public Action onLeftAppButtonDown;
public Action onLeftAppButtonUp;
public Action onRightAppButtonEnter;
public Action onRightAppButtonDown;
public Action onRightAppButtonUp;
public Action onLeftJoyStickEnter;
public Action onLeftJoyStickDown;
public Action onLeftJoyStickUp;
public Action onRightJoyStickEnter;
public Action onRightJoyStickDown;
public Action onRightJoyStickUp;
public Action onLeftJoyStickMove;
public Action onRightJoyStickMove;
public Action onLeftAXButtonEnter;
public Action onLeftAXButtonDown;
public Action onLeftAXButtonUp;
public Action onLeftBYButtonEnter;
public Action onLeftBYButtonDown;
public Action onLeftBYButonUp;
public Action onRightAXButtonEnter;
public Action onRightAXButtonDown;
public Action onRightAXButtonUp;
public Action onRightBYButtonEnter;
public Action onRightBYButtonDown;
public Action onRightBYButtonUp;
#endregion
//提供状态字典独立记录各个feature的状态
Dictionary stateDic;
private void Init()
{
if (!leftHandController.isValid)
{
leftHandController = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand);
}
if (!rightHandController.isValid)
{
rightHandController = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);
}
if (!headController.isValid)
{
headController = InputDevices.GetDeviceAtXRNode(XRNode.Head);
}
stateDic = new Dictionary();
}
//*******************事件源的触发**************************
///
/// 按钮事件源触发模板
///
/// 设备
/// 功能特征
/// 开始按下按钮事件
/// 按下按钮事件
/// 抬起按钮事件
private void ButtonDispatchModel(InputDevice device, InputFeatureUsage usage, Action btnEnter, Action btnDown, Action btnUp)
{
//Debug.Log("usage:" + usage.name);
//为首次执行的feature添加bool状态 -- 用以判断Enter和Up状态
string featureKey = device.characteristics + usage.name;
if (!stateDic.ContainsKey(featureKey))
{
stateDic.Add(featureKey, false);
}
bool isDown;
if (device.TryGetFeatureValue(usage, out isDown) && isDown)
{
//Debug.Log("device:" + device.characteristics + "usage:" + usage.name);
if (!stateDic[featureKey])
{
stateDic[featureKey] = true;
btnEnter?.Invoke();
}
btnDown?.Invoke();
}
else
{
if (stateDic[featureKey])
{
btnUp?.Invoke();
stateDic[featureKey] = false;
}
}
}
///
/// 摇杆事件源触发模板
///
/// 设备
/// 功能特征
/// 移动摇杆事件
private void JoyStickDispatchModel(InputDevice device, InputFeatureUsage usage, Action joyStickMove)
{
Vector2 axis;
if (device.TryGetFeatureValue(usage, out axis) && !axis.Equals(Vector2.zero))
{
if (joyStickMove != null)
joyStickMove(axis);
}
}
//******************每帧轮询监听事件***********************
private void Update()
{
if (leftHandController.isValid)
{
ButtonDispatchModel(leftHandController, CommonUsages.triggerButton, onLeftTriggerEnter, onLeftTriggerDown, onLeftTriggerUp);
ButtonDispatchModel(leftHandController, CommonUsages.gripButton, onLeftGripEnter, onLeftGripDown, onLeftGripUp);
ButtonDispatchModel(leftHandController, CommonUsages.primaryButton, onLeftAXButtonEnter, onLeftAXButtonDown, onLeftAXButtonUp);
ButtonDispatchModel(leftHandController, CommonUsages.secondaryButton, onLeftBYButtonEnter, onLeftBYButtonDown, onLeftBYButonUp);
ButtonDispatchModel(leftHandController, CommonUsages.primary2DAxisClick, onLeftJoyStickEnter, onLeftJoyStickDown, onLeftJoyStickUp);
ButtonDispatchModel(leftHandController, CommonUsages.menuButton, onLeftAppButtonEnter, onLeftAppButtonDown, onLeftAppButtonUp);
//JoyStickDispatchModel(leftHandController, CommonUsages.primary2DAxis, onLeftJoyStickMove);
}
else
{
Init();
}
if (rightHandController.isValid)
{
ButtonDispatchModel(rightHandController, CommonUsages.triggerButton, onRightTriggerEnter, onRightTriggerDown, onRightTriggerUp);
ButtonDispatchModel(rightHandController, CommonUsages.gripButton, onRightGripEnter, onRightGripDown, onRightGripUp);
ButtonDispatchModel(rightHandController, CommonUsages.primaryButton, onRightAXButtonEnter, onRightAXButtonDown, onRightAXButtonUp);
ButtonDispatchModel(rightHandController, CommonUsages.secondaryButton, onRightBYButtonEnter, onRightBYButtonDown, onRightBYButtonUp);
ButtonDispatchModel(rightHandController, CommonUsages.primary2DAxisClick, onRightJoyStickEnter, onRightJoyStickDown, onRightJoyStickUp);
ButtonDispatchModel(rightHandController, CommonUsages.menuButton, onRightAppButtonEnter, onRightAppButtonDown, onRightAppButtonUp);
//JoyStickDispatchModel(rightHandController, CommonUsages.primary2DAxis, onRightJoyStickMove);
}
else
{
Init();
}
}
}