forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using Audio;
 | 
						|
using UnityEngine.XR.Interaction.Toolkit;
 | 
						|
 | 
						|
namespace Bow
 | 
						|
{
 | 
						|
    public class Notch : XRSocketInteractor
 | 
						|
    {
 | 
						|
        public AudioClipGroup nockSounds;
 | 
						|
        public AudioClipGroup releaseSounds;
 | 
						|
 | 
						|
        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)) return;
 | 
						|
            
 | 
						|
            _currentArrow = arrow;
 | 
						|
            nockSounds.Play();
 | 
						|
        }
 | 
						|
 | 
						|
        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;
 | 
						|
            releaseSounds.Play();
 | 
						|
        }
 | 
						|
 | 
						|
        public override XRBaseInteractable.MovementType? selectedInteractableMovementTypeOverride =>
 | 
						|
            XRBaseInteractable.MovementType.Instantaneous;
 | 
						|
    }
 | 
						|
} |