Skip to content

Instantly share code, notes, and snippets.

@TSUMIKISEISAKU
Created September 7, 2023 05:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TSUMIKISEISAKU/e4fcfdb4ebe24715c569773e20d226dd to your computer and use it in GitHub Desktop.
Save TSUMIKISEISAKU/e4fcfdb4ebe24715c569773e20d226dd to your computer and use it in GitHub Desktop.
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