43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Unity.XR.CoreUtils;
 | |
| using UnityEngine.XR.Interaction.Toolkit;
 | |
| 
 | |
| namespace UnityEngine.XR.Content.Interaction
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Add this to your interactable to make it snap to the source of the XR Ray Interactor
 | |
|     /// instead of staying at a distance. Has a similar outcome as enabling Force Grab.
 | |
|     /// </summary>
 | |
|     public class RayAttachModifier : MonoBehaviour
 | |
|     {
 | |
|         IXRSelectInteractable m_SelectInteractable;
 | |
| 
 | |
|         protected void OnEnable()
 | |
|         {
 | |
|             m_SelectInteractable = GetComponent<IXRSelectInteractable>();
 | |
|             if (m_SelectInteractable as Object == null)
 | |
|             {
 | |
|                 Debug.LogError($"Ray Attach Modifier missing required Select Interactable on {name}", this);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             m_SelectInteractable.selectEntered.AddListener(OnSelectEntered);
 | |
|         }
 | |
| 
 | |
|         protected void OnDisable()
 | |
|         {
 | |
|             if (m_SelectInteractable as Object != null)
 | |
|                 m_SelectInteractable.selectEntered.RemoveListener(OnSelectEntered);
 | |
|         }
 | |
| 
 | |
|         void OnSelectEntered(SelectEnterEventArgs args)
 | |
|         {
 | |
|             if (!(args.interactorObject is XRRayInteractor))
 | |
|                 return;
 | |
| 
 | |
|             var attachTransform = args.interactorObject.GetAttachTransform(m_SelectInteractable);
 | |
|             var originalAttachPose = args.interactorObject.GetLocalAttachPoseOnSelect(m_SelectInteractable);
 | |
|             attachTransform.SetLocalPose(originalAttachPose);
 | |
|         }
 | |
|     }
 | |
| }
 |