You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			60 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand{
							 | 
						||
| 
								 | 
							
								    public class HandClippingGuard : MonoBehaviour{
							 | 
						||
| 
								 | 
							
								        //This script is designed to help prevent the hand from clipping through thin grabbables on release.
							 | 
						||
| 
								 | 
							
								        //Also recommeneded that the grabbable has 0 `ignore release time`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public Hand hand;
							 | 
						||
| 
								 | 
							
								        [Tooltip("This should be a sphere collider that covers the hand (similar, but seperate from the recommended trigger sphere collider)")]
							 | 
						||
| 
								 | 
							
								        public SphereCollider collisionGuard;
							 | 
						||
| 
								 | 
							
								        public Transform body;
							 | 
						||
| 
								 | 
							
								        public float guardTime = 0.02f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Vector3 grabPoint;
							 | 
						||
| 
								 | 
							
								        bool runProtection = false;
							 | 
						||
| 
								 | 
							
								        Coroutine guardRoutine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Start is called before the first frame update
							 | 
						||
| 
								 | 
							
								        void Start(){
							 | 
						||
| 
								 | 
							
								            collisionGuard.enabled = false;
							 | 
						||
| 
								 | 
							
								            hand.OnGrabJointBreak += OnRelease;
							 | 
						||
| 
								 | 
							
								            hand.OnBeforeGrabbed += BeforeGrab;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void BeforeGrab(Hand hand, Grabbable grab) {
							 | 
						||
| 
								 | 
							
								            if(body == null)
							 | 
						||
| 
								 | 
							
								                body = hand.transform.parent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (grab.ignoreReleaseTime == 0)
							 | 
						||
| 
								 | 
							
								                runProtection = true;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                runProtection = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            grabPoint = hand.transform.position;
							 | 
						||
| 
								 | 
							
								            if(guardRoutine != null){
							 | 
						||
| 
								 | 
							
								                StopCoroutine(guardRoutine);
							 | 
						||
| 
								 | 
							
								                collisionGuard.enabled = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void OnRelease(Hand hand, Grabbable grab) {
							 | 
						||
| 
								 | 
							
								            if (runProtection) {
							 | 
						||
| 
								 | 
							
								                guardRoutine = StartCoroutine(Guard(hand));
							 | 
						||
| 
								 | 
							
								                runProtection = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        IEnumerator Guard(Hand hand) {
							 | 
						||
| 
								 | 
							
								            hand.body.position = grabPoint;
							 | 
						||
| 
								 | 
							
								            hand.transform.position = grabPoint;
							 | 
						||
| 
								 | 
							
								            hand.transform.position = Vector3.MoveTowards(hand.transform.position, body.position, collisionGuard.radius);
							 | 
						||
| 
								 | 
							
								            collisionGuard.enabled = true;
							 | 
						||
| 
								 | 
							
								            yield return new WaitForSeconds(guardTime);
							 | 
						||
| 
								 | 
							
								            collisionGuard.enabled = false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								}
							 |