|
// SDK Input Override|Utilities|90170
|
|
namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
[Serializable]
|
|
public class VRTK_SDKInputOverrideType
|
|
{
|
|
[Header("SDK settings")]
|
|
|
|
[Tooltip("An optional SDK Setup to use to determine when to modify the transform.")]
|
|
public VRTK_SDKSetup loadedSDKSetup;
|
|
[Tooltip("An optional SDK controller type to use to determine when to modify the transform.")]
|
|
public SDK_BaseController.ControllerType controllerType;
|
|
}
|
|
|
|
[Serializable]
|
|
public class VRTK_SDKButtonInputOverrideType : VRTK_SDKInputOverrideType
|
|
{
|
|
[Header("Button Override")]
|
|
|
|
[Tooltip("The button to override to.")]
|
|
public VRTK_ControllerEvents.ButtonAlias overrideButton = VRTK_ControllerEvents.ButtonAlias.Undefined;
|
|
}
|
|
|
|
[Serializable]
|
|
public class VRTK_SDKVector2AxisInputOverrideType : VRTK_SDKInputOverrideType
|
|
{
|
|
[Header("Vector2 Axis Override")]
|
|
|
|
[Tooltip("The Vector2 axis to override to.")]
|
|
public VRTK_ControllerEvents.Vector2AxisAlias overrideAxis = VRTK_ControllerEvents.Vector2AxisAlias.Undefined;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Provides the ability to switch button mappings based on the current SDK or controller type
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// **Script Usage:**
|
|
/// * Place the `VRTK_SDKInputOverride` script on any active scene GameObject.
|
|
/// * Customise the input button for each script type for each SDK controller type.
|
|
/// </remarks>
|
|
public class VRTK_SDKInputOverride : VRTK_SDKControllerReady
|
|
{
|
|
[Header("Interact Grab")]
|
|
|
|
[Tooltip("The Interact Grab script to override the controls on.")]
|
|
public VRTK_InteractGrab interactGrabScript;
|
|
[Tooltip("The list of overrides.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> interactGrabOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Interact Use")]
|
|
|
|
[Tooltip("The Interact Use script to override the controls on.")]
|
|
public VRTK_InteractUse interactUseScript;
|
|
[Tooltip("The list of overrides.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> interactUseOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Pointer")]
|
|
|
|
[Tooltip("The Pointer script to override the controls on.")]
|
|
public VRTK_Pointer pointerScript;
|
|
[Tooltip("The list of overrides for the activation button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> pointerActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the selection button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> pointerSelectionOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("UI Pointer")]
|
|
|
|
[Tooltip("The UI Pointer script to override the controls on.")]
|
|
public VRTK_UIPointer uiPointerScript;
|
|
[Tooltip("The list of overrides for the activation button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> uiPointerActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the selection button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> uiPointerSelectionOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Pointer Direction Indicator")]
|
|
|
|
[Tooltip("The Pointer Direction Indicator script to override the controls on.")]
|
|
public VRTK_PointerDirectionIndicator pointerDirectionIndicatorScript;
|
|
[Tooltip("The list of overrides for the coordinate axis.")]
|
|
public List<VRTK_SDKVector2AxisInputOverrideType> directionIndicatorCoordinateOverrides = new List<VRTK_SDKVector2AxisInputOverrideType>();
|
|
|
|
[Header("Touchpad Control")]
|
|
|
|
[Tooltip("The Touchpad Control script to override the controls on.")]
|
|
public VRTK_TouchpadControl touchpadControlScript;
|
|
[Tooltip("The list of overrides for the Touchpad Control coordinate axis.")]
|
|
public List<VRTK_SDKVector2AxisInputOverrideType> touchpadControlCoordinateOverrides = new List<VRTK_SDKVector2AxisInputOverrideType>();
|
|
[Tooltip("The list of overrides for the activation button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> touchpadControlActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the modifier button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> touchpadControlModifierOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Button Control")]
|
|
|
|
[Tooltip("The ButtonControl script to override the controls on.")]
|
|
public VRTK_ButtonControl buttonControlScript;
|
|
[Tooltip("The list of overrides for the forward button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> buttonControlForwardOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the backward button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> buttonControlBackwardOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the left button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> buttonControlLeftOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the right button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> buttonControlRightOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Slingshot Jump")]
|
|
|
|
[Tooltip("The SlingshotJump script to override the controls on.")]
|
|
public VRTK_SlingshotJump slingshotJumpScript;
|
|
[Tooltip("The list of overrides for the activation button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> slingshotJumpActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
[Tooltip("The list of overrides for the cancel button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> slingshotJumpCancelOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Move In Place")]
|
|
|
|
[Tooltip("The MoveInPlace script to override the controls on.")]
|
|
public VRTK_MoveInPlace moveInPlaceScript;
|
|
[Tooltip("The list of overrides for the engage button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> moveInPlaceEngageOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
[Header("Step Multiplier")]
|
|
|
|
[Tooltip("The Step Multiplier script to override the controls on.")]
|
|
public VRTK_StepMultiplier stepMultiplierScript;
|
|
[Tooltip("The list of overrides for the activation button.")]
|
|
public List<VRTK_SDKButtonInputOverrideType> stepMultiplierActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
|
|
|
|
/// <summary>
|
|
/// The ForceManage method forces the inputs to be updated even without an SDK change event occuring.
|
|
/// </summary>
|
|
public virtual void ForceManage()
|
|
{
|
|
ManageInputs();
|
|
}
|
|
|
|
protected override void OnEnable()
|
|
{
|
|
base.OnEnable();
|
|
ManageInputs();
|
|
}
|
|
|
|
protected override void OnDisable()
|
|
{
|
|
if (!gameObject.activeSelf)
|
|
{
|
|
base.OnDisable();
|
|
}
|
|
}
|
|
|
|
protected override void ControllerReady(VRTK_ControllerReference controllerReference)
|
|
{
|
|
if (VRTK_SDKManager.GetLoadedSDKSetup() != null && gameObject.activeInHierarchy)
|
|
{
|
|
ManageInputs();
|
|
}
|
|
}
|
|
|
|
protected virtual VRTK_SDKButtonInputOverrideType GetSelectedModifier(List<VRTK_SDKButtonInputOverrideType> overrideTypes, VRTK_ControllerReference controllerReference)
|
|
{
|
|
VRTK_SDKButtonInputOverrideType selectedModifier = null;
|
|
//attempt to find by the overall SDK set up to start with
|
|
if (VRTK_SDKManager.GetLoadedSDKSetup() != null)
|
|
{
|
|
selectedModifier = overrideTypes.FirstOrDefault(item => item.loadedSDKSetup == VRTK_SDKManager.GetLoadedSDKSetup());
|
|
}
|
|
|
|
//If no sdk set up is found or it is null then try and find by the SDK controller
|
|
if (selectedModifier == null)
|
|
{
|
|
SDK_BaseController.ControllerType currentControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference);
|
|
selectedModifier = overrideTypes.FirstOrDefault(item => item.controllerType == currentControllerType);
|
|
}
|
|
return selectedModifier;
|
|
}
|
|
|
|
protected virtual VRTK_SDKVector2AxisInputOverrideType GetSelectedModifier(List<VRTK_SDKVector2AxisInputOverrideType> overrideTypes, VRTK_ControllerReference controllerReference)
|
|
{
|
|
//attempt to find by the overall SDK set up to start with
|
|
VRTK_SDKVector2AxisInputOverrideType selectedModifier = overrideTypes.FirstOrDefault(item => item.loadedSDKSetup == VRTK_SDKManager.GetLoadedSDKSetup());
|
|
|
|
//If no sdk set up is found or it is null then try and find by the SDK controller
|
|
if (selectedModifier == null)
|
|
{
|
|
SDK_BaseController.ControllerType currentControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference);
|
|
selectedModifier = overrideTypes.FirstOrDefault(item => item.controllerType == currentControllerType);
|
|
}
|
|
return selectedModifier;
|
|
}
|
|
|
|
protected virtual void ManageInputs()
|
|
{
|
|
ManageInteractGrab();
|
|
ManageInteractUse();
|
|
ManagePointer();
|
|
ManageUIPointer();
|
|
ManagePointerDirectionIndicator();
|
|
ManageTouchpadControl();
|
|
ManageButtonControl();
|
|
ManageSlingshotJump();
|
|
ManageMoveInPlace();
|
|
ManageStepMultiplier();
|
|
}
|
|
|
|
protected virtual VRTK_ControllerReference GetReferenceFromEvents(VRTK_ControllerEvents controllerEvents)
|
|
{
|
|
return VRTK_ControllerReference.GetControllerReference((controllerEvents != null ? controllerEvents.gameObject : null));
|
|
}
|
|
|
|
protected virtual VRTK_ControllerReference GetRightThenLeftReference()
|
|
{
|
|
VRTK_ControllerReference controllerReference = VRTK_ControllerReference.GetControllerReference(SDK_BaseController.ControllerHand.Right);
|
|
return (VRTK_ControllerReference.IsValid(controllerReference) ? controllerReference : VRTK_ControllerReference.GetControllerReference(SDK_BaseController.ControllerHand.Left));
|
|
}
|
|
|
|
protected virtual void ManageInteractGrab()
|
|
{
|
|
if (interactGrabScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(interactGrabScript.controllerEvents);
|
|
VRTK_SDKButtonInputOverrideType selectedModifier = GetSelectedModifier(interactGrabOverrides, controllerReference);
|
|
if (selectedModifier != null && selectedModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
interactGrabScript.enabled = false;
|
|
interactGrabScript.grabButton = selectedModifier.overrideButton;
|
|
interactGrabScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageInteractUse()
|
|
{
|
|
if (interactUseScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(interactUseScript.controllerEvents);
|
|
VRTK_SDKButtonInputOverrideType selectedModifier = GetSelectedModifier(interactUseOverrides, controllerReference);
|
|
if (selectedModifier != null && selectedModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
interactUseScript.enabled = false;
|
|
interactUseScript.useButton = selectedModifier.overrideButton;
|
|
interactUseScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManagePointer()
|
|
{
|
|
if (pointerScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(pointerScript.controllerEvents);
|
|
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(pointerActivationOverrides, controllerReference);
|
|
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
pointerScript.enabled = false;
|
|
pointerScript.activationButton = selectedActivationModifier.overrideButton;
|
|
pointerScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedSelectionModifier = GetSelectedModifier(pointerSelectionOverrides, controllerReference);
|
|
if (selectedSelectionModifier != null && selectedSelectionModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
pointerScript.enabled = false;
|
|
pointerScript.selectionButton = selectedSelectionModifier.overrideButton;
|
|
pointerScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageUIPointer()
|
|
{
|
|
if (uiPointerScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(uiPointerScript.controllerEvents);
|
|
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(uiPointerActivationOverrides, controllerReference);
|
|
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
uiPointerScript.enabled = false;
|
|
uiPointerScript.activationButton = selectedActivationModifier.overrideButton;
|
|
uiPointerScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedSelectionModifier = GetSelectedModifier(uiPointerSelectionOverrides, controllerReference);
|
|
if (selectedSelectionModifier != null && selectedSelectionModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
uiPointerScript.enabled = false;
|
|
uiPointerScript.selectionButton = selectedSelectionModifier.overrideButton;
|
|
uiPointerScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManagePointerDirectionIndicator()
|
|
{
|
|
if (pointerDirectionIndicatorScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(pointerDirectionIndicatorScript.GetControllerEvents());
|
|
VRTK_SDKVector2AxisInputOverrideType selectedCoorinateModifier = GetSelectedModifier(directionIndicatorCoordinateOverrides, controllerReference);
|
|
if (selectedCoorinateModifier != null && selectedCoorinateModifier.overrideAxis != VRTK_ControllerEvents.Vector2AxisAlias.Undefined)
|
|
{
|
|
pointerDirectionIndicatorScript.enabled = false;
|
|
pointerDirectionIndicatorScript.coordinateAxis = selectedCoorinateModifier.overrideAxis;
|
|
pointerDirectionIndicatorScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageTouchpadControl()
|
|
{
|
|
if (touchpadControlScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(touchpadControlScript.controller);
|
|
VRTK_SDKVector2AxisInputOverrideType selectedCoorinateModifier = GetSelectedModifier(touchpadControlCoordinateOverrides, controllerReference);
|
|
if (selectedCoorinateModifier != null && selectedCoorinateModifier.overrideAxis != VRTK_ControllerEvents.Vector2AxisAlias.Undefined)
|
|
{
|
|
touchpadControlScript.enabled = false;
|
|
touchpadControlScript.coordinateAxis = selectedCoorinateModifier.overrideAxis;
|
|
touchpadControlScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(touchpadControlActivationOverrides, controllerReference);
|
|
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
touchpadControlScript.enabled = false;
|
|
touchpadControlScript.primaryActivationButton = selectedActivationModifier.overrideButton;
|
|
touchpadControlScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedActionModifier = GetSelectedModifier(touchpadControlModifierOverrides, controllerReference);
|
|
if (selectedActionModifier != null && selectedActionModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
touchpadControlScript.enabled = false;
|
|
touchpadControlScript.actionModifierButton = selectedActionModifier.overrideButton;
|
|
touchpadControlScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageButtonControl()
|
|
{
|
|
if (buttonControlScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(buttonControlScript.controller);
|
|
VRTK_SDKButtonInputOverrideType selectedForwardModifier = GetSelectedModifier(buttonControlForwardOverrides, controllerReference);
|
|
if (selectedForwardModifier != null && selectedForwardModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
buttonControlScript.enabled = false;
|
|
buttonControlScript.forwardButton = selectedForwardModifier.overrideButton;
|
|
buttonControlScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedBackwardModifier = GetSelectedModifier(buttonControlBackwardOverrides, controllerReference);
|
|
if (selectedBackwardModifier != null && selectedBackwardModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
buttonControlScript.enabled = false;
|
|
buttonControlScript.backwardButton = selectedBackwardModifier.overrideButton;
|
|
buttonControlScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedLeftModifier = GetSelectedModifier(buttonControlLeftOverrides, controllerReference);
|
|
if (selectedLeftModifier != null && selectedLeftModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
buttonControlScript.enabled = false;
|
|
buttonControlScript.leftButton = selectedLeftModifier.overrideButton;
|
|
buttonControlScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedRightModifier = GetSelectedModifier(buttonControlRightOverrides, controllerReference);
|
|
if (selectedRightModifier != null && selectedRightModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
buttonControlScript.enabled = false;
|
|
buttonControlScript.rightButton = selectedRightModifier.overrideButton;
|
|
buttonControlScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageSlingshotJump()
|
|
{
|
|
if (slingshotJumpScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetRightThenLeftReference();
|
|
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(slingshotJumpActivationOverrides, controllerReference);
|
|
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
slingshotJumpScript.enabled = false;
|
|
slingshotJumpScript.SetActivationButton(selectedActivationModifier.overrideButton);
|
|
slingshotJumpScript.enabled = true;
|
|
}
|
|
|
|
VRTK_SDKButtonInputOverrideType selectedCancelModifier = GetSelectedModifier(slingshotJumpCancelOverrides, controllerReference);
|
|
if (selectedCancelModifier != null && selectedCancelModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
slingshotJumpScript.enabled = false;
|
|
slingshotJumpScript.SetCancelButton(selectedCancelModifier.overrideButton);
|
|
slingshotJumpScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageMoveInPlace()
|
|
{
|
|
if (moveInPlaceScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetRightThenLeftReference();
|
|
VRTK_SDKButtonInputOverrideType selectedEngageModifier = GetSelectedModifier(moveInPlaceEngageOverrides, controllerReference);
|
|
if (selectedEngageModifier != null && selectedEngageModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
moveInPlaceScript.enabled = false;
|
|
moveInPlaceScript.engageButton = selectedEngageModifier.overrideButton;
|
|
moveInPlaceScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ManageStepMultiplier()
|
|
{
|
|
if (stepMultiplierScript != null)
|
|
{
|
|
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(stepMultiplierScript.controllerEvents);
|
|
VRTK_SDKButtonInputOverrideType selectedModifier = GetSelectedModifier(stepMultiplierActivationOverrides, controllerReference);
|
|
if (selectedModifier != null && selectedModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
|
|
{
|
|
stepMultiplierScript.enabled = false;
|
|
stepMultiplierScript.activationButton = selectedModifier.overrideButton;
|
|
stepMultiplierScript.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|