70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| using UnityEngine.XR.Interaction.Toolkit;
 | |
| 
 | |
| namespace _PROJECT.Scripts.Bow
 | |
| {
 | |
|     [RequireComponent(typeof(ArrowSpawner))]
 | |
|     public class Notch : XRSocketInteractor
 | |
|     {
 | |
|         [SerializeField, Range(0, 1)] private float releaseThreshold = 0.25f;
 | |
| 
 | |
|         public global::Bow Bow { get; private set; }
 | |
|         public PullMeasurer PullMeasurer { get; private set; }
 | |
|         
 | |
|         private ArrowSpawner _arrowSpawner;
 | |
| 
 | |
|         protected override void Awake()
 | |
|         {
 | |
|             base.Awake();
 | |
|             Bow = GetComponentInParent<global::Bow>();
 | |
|             _arrowSpawner = GetComponent<ArrowSpawner>();
 | |
|             PullMeasurer = GetComponentInChildren<PullMeasurer>();
 | |
|         }
 | |
| 
 | |
|         protected override void OnEnable()
 | |
|         {
 | |
|             base.OnEnable();
 | |
|             PullMeasurer.selectExited.AddListener(ReleaseArrow);
 | |
|         }
 | |
| 
 | |
|         protected override void OnDisable()
 | |
|         {
 | |
|             base.OnDisable();
 | |
|             PullMeasurer.selectExited.RemoveListener(ReleaseArrow);
 | |
|         }
 | |
| 
 | |
|         public void ReleaseArrow(SelectExitEventArgs args)
 | |
|         {
 | |
|             Debug.Log("Requesting arrow launch...");
 | |
|             _arrowSpawner.LaunchArrow();
 | |
|         }
 | |
| 
 | |
|         public override void ProcessInteractor(XRInteractionUpdateOrder.UpdatePhase updatePhase)
 | |
|         {
 | |
|             base.ProcessInteractor(updatePhase);
 | |
| 
 | |
|             // Move attach when bow is pulled, this updates the renderer as well
 | |
|             attachTransform.position = PullMeasurer.PullPosition;
 | |
|         }
 | |
|         
 | |
|         public override bool CanSelect(IXRSelectInteractable interactable)
 | |
|         {
 | |
|             return QuickSelect(interactable) && CanHover(interactable) && interactable is Arrow;
 | |
|         }
 | |
|     
 | |
|         private bool QuickSelect(IXRSelectInteractable interactable)
 | |
|         {
 | |
|             // This lets the Notch automatically grab the arrow
 | |
|             return !hasSelection || IsSelecting(interactable);
 | |
|         }
 | |
| 
 | |
|         private bool CanHover(IXRSelectInteractable interactable)
 | |
|         {
 | |
|             if (interactable is IXRHoverInteractable hoverInteractable)
 | |
|                 return CanHover(hoverInteractable);
 | |
| 
 | |
|             return false;
 | |
|         } 
 | |
|     }
 | |
| }
 |