-
-
Save TSUMIKISEISAKU/e4fcfdb4ebe24715c569773e20d226dd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using UnityEngine; | |
using UnityEngine.XR; | |
using UnityEngine.XR.Interaction.Toolkit; | |
/// <summary> | |
/// コントローラーの入力取得 | |
/// </summary> | |
public class ControllerInputHandler : MonoBehaviour | |
{ | |
// 右コントローラ | |
List<InputDevice> rightDevices; | |
// 左コントローラ | |
List<InputDevice> leftDevices; | |
// ボタンの状態 | |
private enum ButtonState | |
{ | |
Down, // 押された瞬間 | |
Hold, // 押され続けている | |
Up, // 離された瞬間 | |
None // 離されている | |
} | |
// 右トリガー取得値 | |
private static bool _rightTriggerButton; | |
// 右トリガーを押し込んでいるかどうか | |
private bool _rightTriggerHolding; | |
// 右トリガーの状態 | |
private ButtonState _rightTriggerState = ButtonState.None; | |
// 左トリガーの取得値 | |
private static bool _leftTriggerButton; | |
// 左トリガーを押し込んでいるかどうか | |
private bool _leftTriggerHolding; | |
// 左トリガーの状態 | |
private ButtonState _leftTriggerState = ButtonState.None; | |
// 左右コントローラー(振動用) | |
private XRController _leftController; | |
private XRController _rightController; | |
/// <summary> | |
/// 初期化 | |
/// </summary> | |
private void Awake() | |
{ | |
rightDevices = new List<InputDevice>(); | |
leftDevices = new List<InputDevice>(); | |
} | |
#region ButtonStateUpdate | |
/// <summary> | |
/// 状態更新 | |
/// </summary> | |
private void Update() | |
{ | |
UpdateButtonState(); | |
} | |
/// <summary> | |
/// ボタンの状態を更新 | |
/// </summary> | |
private void UpdateButtonState() | |
{ | |
InputDevices.GetDevicesAtXRNode(XRNode.LeftHand, leftDevices); | |
InputDevices.GetDevicesAtXRNode(XRNode.RightHand, rightDevices); | |
foreach (InputDevice rightDevice in rightDevices) | |
{ | |
if (rightDevice.TryGetFeatureValue(CommonUsages.triggerButton, out _rightTriggerButton) && _rightTriggerButton) | |
{ | |
if (!_rightTriggerHolding) | |
{ | |
_rightTriggerHolding = true; | |
_rightTriggerState = ButtonState.Down; | |
} | |
else | |
{ | |
_rightTriggerState = ButtonState.Hold; | |
} | |
} | |
else | |
{ | |
if (_rightTriggerHolding) | |
{ | |
_rightTriggerHolding = false; | |
_rightTriggerState = ButtonState.Up; | |
} | |
else | |
{ | |
_rightTriggerState = ButtonState.None; | |
} | |
} | |
} | |
foreach (InputDevice leftDevice in leftDevices) | |
{ | |
if (leftDevice.TryGetFeatureValue(CommonUsages.triggerButton, out _leftTriggerButton) && _leftTriggerButton) | |
{ | |
if (!_leftTriggerHolding) | |
{ | |
_leftTriggerHolding = true; | |
_leftTriggerState = ButtonState.Down; | |
} | |
else | |
{ | |
_leftTriggerState = ButtonState.Hold; | |
} | |
} | |
else | |
{ | |
if (_leftTriggerHolding) | |
{ | |
_leftTriggerHolding = false; | |
_leftTriggerState = ButtonState.Up; | |
} | |
else | |
{ | |
_leftTriggerState = ButtonState.None; | |
} | |
} | |
} | |
} | |
#endregion | |
#region GetTriggerState | |
/// <summary> | |
/// 右トリガーが押された瞬間かどうか | |
/// </summary> | |
public bool RightTriggerDown() | |
{ | |
return _rightTriggerState == ButtonState.Down ? true : false; | |
} | |
/// <summary> | |
/// 右トリガーが押されているかどうか | |
/// </summary> | |
public bool RightTriggerHold() | |
{ | |
return _rightTriggerState == ButtonState.Hold ? true : false; | |
} | |
/// <summary> | |
/// 右トリガーが離された瞬間かどうか | |
/// </summary> | |
public bool RightTriggerUp() | |
{ | |
return _rightTriggerState == ButtonState.Up ? true : false; | |
} | |
/// <summary> | |
/// 左トリガーが押された瞬間かどうか | |
/// </summary> | |
public bool LeftTriggerDown() | |
{ | |
return _leftTriggerState == ButtonState.Down ? true : false; | |
} | |
/// <summary> | |
/// 左トリガーが押されているかどうか | |
/// </summary> | |
public bool LeftTriggerHold() | |
{ | |
return _leftTriggerState == ButtonState.Hold ? true : false; | |
} | |
/// <summary> | |
/// 左トリガーが離された瞬間かどうか | |
/// </summary> | |
public bool LeftTriggerUp() | |
{ | |
return _leftTriggerState == ButtonState.Up ? true : false; | |
} | |
#endregion | |
#region Vibration | |
/// <summary> | |
/// 右のコントローラの振動 | |
/// </summary> | |
/// <returns></returns> | |
public void VibrateRightController() | |
{ | |
if (_rightController == null) | |
{ | |
XRController[] devices = FindObjectsOfType<XRController>(); | |
foreach (XRController device in devices) | |
{ | |
if (device.controllerNode == XRNode.RightHand) | |
{ | |
_rightController = device; | |
break; | |
} | |
} | |
} | |
if (_rightController != null) | |
{ | |
_rightController.SendHapticImpulse(1, 0.03f); | |
} | |
} | |
/// <summary> | |
/// 左のコントローラの振動 | |
/// </summary> | |
/// <returns></returns> | |
public void VibrateLeftController() | |
{ | |
if (_leftController == null) | |
{ | |
XRController[] devices = FindObjectsOfType<XRController>(); | |
foreach (XRController device in devices) | |
{ | |
if (device.controllerNode == XRNode.LeftHand) | |
{ | |
_leftController = device; | |
break; | |
} | |
} | |
} | |
if (_leftController != null) | |
{ | |
_leftController.SendHapticImpulse(1, 0.03f); | |
} | |
} | |
#endregion | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment