68 lines
1.8 KiB
C#
68 lines
1.8 KiB
C#
using UnityEngine.XR.Interaction.Toolkit;
|
|
|
|
namespace Bow
|
|
{
|
|
public class Notch : XRSocketInteractor
|
|
{
|
|
private Puller _puller = null;
|
|
private Arrow _currentArrow = null;
|
|
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
_puller = GetComponent<Puller>();
|
|
}
|
|
|
|
protected override void OnEnable()
|
|
{
|
|
base.OnEnable();
|
|
_puller.onSelectExited.AddListener(TryToReleaseArrow);
|
|
}
|
|
|
|
protected override void OnDisable()
|
|
{
|
|
base.OnDisable();
|
|
_puller.onSelectExited.RemoveListener(TryToReleaseArrow);
|
|
}
|
|
|
|
protected override void OnSelectEntered(XRBaseInteractable interactable)
|
|
{
|
|
base.OnSelectEntered(interactable);
|
|
StoreArrow(interactable);
|
|
}
|
|
|
|
private void StoreArrow(XRBaseInteractable interactable)
|
|
{
|
|
if (interactable is Arrow arrow)
|
|
{
|
|
_currentArrow = arrow;
|
|
}
|
|
}
|
|
|
|
private void TryToReleaseArrow(XRBaseInteractor interactor)
|
|
{
|
|
if (!_currentArrow) return;
|
|
|
|
ForceDeselect();
|
|
ReleaseArrow();
|
|
}
|
|
|
|
private void ForceDeselect()
|
|
{
|
|
_currentArrow.OnSelectExiting(this);
|
|
_currentArrow.OnSelectExited(this);
|
|
base.OnSelectExiting(_currentArrow);
|
|
base.OnSelectExited(_currentArrow);
|
|
}
|
|
|
|
private void ReleaseArrow()
|
|
{
|
|
_currentArrow.Release(_puller.PullAmount);
|
|
_currentArrow = null;
|
|
}
|
|
|
|
public override XRBaseInteractable.MovementType? selectedInteractableMovementTypeOverride =>
|
|
XRBaseInteractable.MovementType.Instantaneous;
|
|
}
|
|
} |