mirror of
https://udrimavric.com/MAVRIC/Stratasys-450mc-VR.git
synced 2025-01-23 23:58:36 -05:00
318 lines
12 KiB
C#
318 lines
12 KiB
C#
using UnityEngine.XR.Interaction.Toolkit;
|
|
using UnityEngine.XR.Interaction.Toolkit.Samples.StarterAssets;
|
|
|
|
namespace UnityEngine.XR.Content.Interaction
|
|
{
|
|
/// <summary>
|
|
/// Use this class as a central manager to configure locomotion control schemes and configuration preferences.
|
|
/// </summary>
|
|
public class LocomotionManager : MonoBehaviour
|
|
{
|
|
const ContinuousMoveProviderBase.GravityApplicationMode k_DefaultGravityApplicationMode =
|
|
ContinuousMoveProviderBase.GravityApplicationMode.AttemptingMove;
|
|
const ConstrainedMoveProvider.GravityApplicationMode k_DefaultGravityMode =
|
|
ConstrainedMoveProvider.GravityApplicationMode.AttemptingMove;
|
|
|
|
/// <summary>
|
|
/// Sets which movement control scheme to use.
|
|
/// </summary>
|
|
/// <seealso cref="leftHandLocomotionType"/>
|
|
/// <seealso cref="rightHandLocomotionType"/>
|
|
public enum LocomotionType
|
|
{
|
|
/// <summary>
|
|
/// Use smooth (continuous) movement control scheme.
|
|
/// </summary>
|
|
MoveAndStrafe,
|
|
|
|
/// <summary>
|
|
/// Use teleport movement control scheme.
|
|
/// </summary>
|
|
TeleportAndTurn,
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets which turn style of locomotion to use.
|
|
/// </summary>
|
|
/// <seealso cref="leftHandTurnStyle"/>
|
|
/// <seealso cref="rightHandTurnStyle"/>
|
|
public enum TurnStyle
|
|
{
|
|
/// <summary>
|
|
/// Use snap turning to rotate the direction you are facing by snapping by a specified angle.
|
|
/// </summary>
|
|
Snap,
|
|
|
|
/// <summary>
|
|
/// Use continuous turning to smoothly rotate the direction you are facing by a specified speed.
|
|
/// </summary>
|
|
Smooth,
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Stores the locomotion provider for smooth (continuous) movement.")]
|
|
DynamicMoveProvider m_DynamicMoveProvider;
|
|
|
|
/// <summary>
|
|
/// Stores the locomotion provider for smooth (continuous) movement.
|
|
/// </summary>
|
|
/// <seealso cref="DynamicMoveProvider"/>
|
|
public DynamicMoveProvider dynamicMoveProvider
|
|
{
|
|
get => m_DynamicMoveProvider;
|
|
set => m_DynamicMoveProvider = value;
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Stores the locomotion provider for smooth (continuous) turning.")]
|
|
ContinuousTurnProviderBase m_SmoothTurnProvider;
|
|
|
|
/// <summary>
|
|
/// Stores the locomotion provider for smooth (continuous) turning.
|
|
/// </summary>
|
|
/// <seealso cref="ContinuousTurnProviderBase"/>
|
|
public ContinuousTurnProviderBase smoothTurnProvider
|
|
{
|
|
get => m_SmoothTurnProvider;
|
|
set => m_SmoothTurnProvider = value;
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Stores the locomotion provider for snap turning.")]
|
|
SnapTurnProviderBase m_SnapTurnProvider;
|
|
|
|
/// <summary>
|
|
/// Stores the locomotion provider for snap turning.
|
|
/// </summary>
|
|
/// <seealso cref="SnapTurnProviderBase"/>
|
|
public SnapTurnProviderBase snapTurnProvider
|
|
{
|
|
get => m_SnapTurnProvider;
|
|
set => m_SnapTurnProvider = value;
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Stores the locomotion provider for two-handed grab movement.")]
|
|
TwoHandedGrabMoveProvider m_TwoHandedGrabMoveProvider;
|
|
|
|
/// <summary>
|
|
/// Stores the locomotion provider for two-handed grab movement.
|
|
/// </summary>
|
|
/// <seealso cref="TwoHandedGrabMoveProvider"/>
|
|
public TwoHandedGrabMoveProvider twoHandedGrabMoveProvider
|
|
{
|
|
get => m_TwoHandedGrabMoveProvider;
|
|
set => m_TwoHandedGrabMoveProvider = value;
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Reference to the manager that mediates the left-hand controllers.")]
|
|
ActionBasedControllerManager m_LeftHandManager;
|
|
|
|
[SerializeField]
|
|
[Tooltip("Reference to the manager that mediates the right-hand controllers.")]
|
|
ActionBasedControllerManager m_RightHandManager;
|
|
|
|
[SerializeField]
|
|
[Tooltip("Controls which movement control scheme to use for the left hand.")]
|
|
LocomotionType m_LeftHandLocomotionType;
|
|
|
|
/// <summary>
|
|
/// Controls which movement control scheme to use for the left hand.
|
|
/// </summary>
|
|
/// <seealso cref="LocomotionType"/>
|
|
public LocomotionType leftHandLocomotionType
|
|
{
|
|
get => m_LeftHandLocomotionType;
|
|
set
|
|
{
|
|
SetMoveScheme(value, true);
|
|
m_LeftHandLocomotionType = value;
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Controls which movement control scheme to use for the right hand.")]
|
|
LocomotionType m_RightHandLocomotionType;
|
|
|
|
/// <summary>
|
|
/// Controls which movement control scheme to use for the left hand.
|
|
/// </summary>
|
|
/// <seealso cref="LocomotionType"/>
|
|
public LocomotionType rightHandLocomotionType
|
|
{
|
|
get => m_RightHandLocomotionType;
|
|
set
|
|
{
|
|
SetMoveScheme(value, false);
|
|
m_RightHandLocomotionType = value;
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Controls which turn style of locomotion to use for the left hand.")]
|
|
TurnStyle m_LeftHandTurnStyle;
|
|
|
|
/// <summary>
|
|
/// Controls which turn style of locomotion to use for the left hand.
|
|
/// </summary>
|
|
/// <seealso cref="TurnStyle"/>
|
|
public TurnStyle leftHandTurnStyle
|
|
{
|
|
get => m_LeftHandTurnStyle;
|
|
set
|
|
{
|
|
SetTurnStyle(value, true);
|
|
m_LeftHandTurnStyle = value;
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Controls which turn style of locomotion to use for the right hand.")]
|
|
TurnStyle m_RightHandTurnStyle;
|
|
|
|
/// <summary>
|
|
/// Controls which turn style of locomotion to use for the left hand.
|
|
/// </summary>
|
|
/// <seealso cref="TurnStyle"/>
|
|
public TurnStyle rightHandTurnStyle
|
|
{
|
|
get => m_RightHandTurnStyle;
|
|
set
|
|
{
|
|
SetTurnStyle(value, false);
|
|
m_RightHandTurnStyle = value;
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Whether to enable the comfort mode that applies the tunneling vignette effect to smooth movement and turn.")]
|
|
bool m_EnableComfortMode;
|
|
|
|
public bool enableComfortMode
|
|
{
|
|
get => m_EnableComfortMode;
|
|
set
|
|
{
|
|
m_EnableComfortMode = value;
|
|
if (m_ComfortMode != null)
|
|
m_ComfortMode.SetActive(m_EnableComfortMode);
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Stores the GameObject for the comfort mode.")]
|
|
GameObject m_ComfortMode;
|
|
|
|
[SerializeField]
|
|
[Tooltip("Whether gravity affects continuous and grab movement when flying is disabled.")]
|
|
bool m_UseGravity;
|
|
|
|
/// <summary>
|
|
/// Whether gravity affects continuous and grab movement when flying is disabled.
|
|
/// </summary>
|
|
public bool useGravity
|
|
{
|
|
get => m_UseGravity;
|
|
set
|
|
{
|
|
m_UseGravity = value;
|
|
m_DynamicMoveProvider.useGravity = value;
|
|
m_TwoHandedGrabMoveProvider.useGravity = value;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.useGravity = value;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.useGravity = value;
|
|
if (value)
|
|
{
|
|
m_DynamicMoveProvider.gravityApplicationMode = k_DefaultGravityApplicationMode;
|
|
m_TwoHandedGrabMoveProvider.gravityMode = k_DefaultGravityMode;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.gravityMode = k_DefaultGravityMode;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.gravityMode = k_DefaultGravityMode;
|
|
}
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Whether to enable flying for continuous and grab movement. This overrides the use of gravity.")]
|
|
bool m_EnableFly;
|
|
|
|
/// <summary>
|
|
/// Whether to enable flying for continuous and grab movement. This overrides the use of gravity.
|
|
/// </summary>
|
|
public bool enableFly
|
|
{
|
|
get => m_EnableFly;
|
|
set
|
|
{
|
|
m_EnableFly = value;
|
|
m_DynamicMoveProvider.enableFly = value;
|
|
m_TwoHandedGrabMoveProvider.enableFreeYMovement = value;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.enableFreeYMovement = value;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.enableFreeYMovement = value;
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Tooltip("Whether to enable grab movement.")]
|
|
bool m_EnableGrabMovement;
|
|
|
|
/// <summary>
|
|
/// Whether to enable grab movement.
|
|
/// </summary>
|
|
public bool enableGrabMovement
|
|
{
|
|
get => m_EnableGrabMovement;
|
|
set
|
|
{
|
|
m_EnableGrabMovement = value;
|
|
m_TwoHandedGrabMoveProvider.enabled = value;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.enabled = value;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.enabled = value;
|
|
}
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
SetMoveScheme(m_LeftHandLocomotionType, true);
|
|
SetMoveScheme(m_RightHandLocomotionType, false);
|
|
SetTurnStyle(m_LeftHandTurnStyle, true);
|
|
SetTurnStyle(m_RightHandTurnStyle, false);
|
|
|
|
if (m_ComfortMode != null)
|
|
m_ComfortMode.SetActive(m_EnableComfortMode);
|
|
|
|
m_DynamicMoveProvider.useGravity = m_UseGravity;
|
|
m_TwoHandedGrabMoveProvider.useGravity = m_UseGravity;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.useGravity = m_UseGravity;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.useGravity = m_UseGravity;
|
|
if (m_UseGravity)
|
|
{
|
|
m_DynamicMoveProvider.gravityApplicationMode = k_DefaultGravityApplicationMode;
|
|
m_TwoHandedGrabMoveProvider.gravityMode = k_DefaultGravityMode;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.gravityMode = k_DefaultGravityMode;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.gravityMode = k_DefaultGravityMode;
|
|
}
|
|
|
|
m_DynamicMoveProvider.enableFly = m_EnableFly;
|
|
m_TwoHandedGrabMoveProvider.enableFreeYMovement = m_EnableFly;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.enableFreeYMovement = m_EnableFly;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.enableFreeYMovement = m_EnableFly;
|
|
|
|
m_TwoHandedGrabMoveProvider.enabled = m_EnableGrabMovement;
|
|
m_TwoHandedGrabMoveProvider.leftGrabMoveProvider.enabled = m_EnableGrabMovement;
|
|
m_TwoHandedGrabMoveProvider.rightGrabMoveProvider.enabled = m_EnableGrabMovement;
|
|
}
|
|
|
|
void SetMoveScheme(LocomotionType scheme, bool leftHand)
|
|
{
|
|
var targetHand = leftHand ? m_LeftHandManager : m_RightHandManager;
|
|
targetHand.smoothMotionEnabled = (scheme == LocomotionType.MoveAndStrafe);
|
|
}
|
|
|
|
void SetTurnStyle(TurnStyle style, bool leftHand)
|
|
{
|
|
var targetHand = leftHand ? m_LeftHandManager : m_RightHandManager;
|
|
targetHand.smoothTurnEnabled = (style == TurnStyle.Smooth);
|
|
}
|
|
}
|
|
}
|