DeltaVR/Assets/_PROJECT/Components/NewHandPresence/XRControllerHintController.cs
2023-05-08 15:56:10 +03:00

86 lines
2.8 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
using UnityEngine.XR.Interaction.Toolkit;
namespace _PROJECT.NewHandPresence
{
public class XRControllerHintController : MonoBehaviour
{
public ControllerInformationScriptableObject controllerInformation;
public GameObject turnControl, smoothLocomotionControl, teleportControl;
// List due to Vive Wands having 2 grip buttons
public List<GameObject> gripControls;
public Billboard billboard;
[HideInInspector] public XRBaseController xrBaseController;
private int _defaultLayer, _outLineLayer;
private List<GameObject> _currentControls;
private void Start()
{
_defaultLayer = LayerMask.NameToLayer("Default");
_outLineLayer = LayerMask.NameToLayer("Outlined Objects");
_currentControls = new List<GameObject>();
billboard.HideHint();
}
private void ShowHint(GameObject control, string text)
{
control.layer = _outLineLayer;
billboard.ShowHint(text);
billboard.SetLineTarget(control);
_currentControls.Add(control);
}
private void ShowHints(List<GameObject> controls, string text)
{
controls.ForEach(control => control.layer = _outLineLayer);
billboard.ShowHint(text);
_currentControls.AddRange(controls);
}
public void HideHint()
{
_currentControls?.ForEach(control => control.layer = _defaultLayer);
_currentControls?.Clear();
billboard.HideHint();
}
public void ShowTurnHint()
{
if (turnControl == null) return;
ShowHint(turnControl, controllerInformation.turnHintText);
VibrateController();
}
public void ShowSmoothLocomotionHint()
{
if (smoothLocomotionControl == null) return;
ShowHint(smoothLocomotionControl, controllerInformation.moveHintText);
VibrateController();
}
public void ShowTeleportHint()
{
if (teleportControl == null) return;
ShowHint(teleportControl, controllerInformation.teleportStartHintText);
VibrateController();
}
public void ShowGripHint()
{
if (gripControls.Count == 0) return;
ShowHints(gripControls, controllerInformation.gripHintText);
VibrateController();
}
private void VibrateController()
{
if (xrBaseController == null) return;
xrBaseController.SendHapticImpulse(controllerInformation.vibrationStrength, controllerInformation.vibrationDuration);
}
}
}