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.
		
		
		
		
		
			
		
			
	
	
		
			64 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand {
							 | 
						||
| 
								 | 
							
								    //This component will freeze an attached grabbable joint with a fixed joint while not being held 
							 | 
						||
| 
								 | 
							
								    [RequireComponent(typeof(Grabbable))]
							 | 
						||
| 
								 | 
							
								    public class GrabbableOnlyJoint : MonoBehaviour {
							 | 
						||
| 
								 | 
							
								        public Grabbable jointedGrabbable;
							 | 
						||
| 
								 | 
							
								        public bool resetOnRelease = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Grabbable localGrabbable;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Joint freezeJoint;
							 | 
						||
| 
								 | 
							
								        Vector3 localStartPosition;
							 | 
						||
| 
								 | 
							
								        Quaternion localStartRotation;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void Start() {
							 | 
						||
| 
								 | 
							
								            localGrabbable = GetComponent<Grabbable>();
							 | 
						||
| 
								 | 
							
								            localGrabbable.OnGrabEvent += OnGrab;
							 | 
						||
| 
								 | 
							
								            localGrabbable.OnReleaseEvent += OnRelease;
							 | 
						||
| 
								 | 
							
								            localStartPosition = jointedGrabbable.transform.InverseTransformPoint(transform.position);
							 | 
						||
| 
								 | 
							
								            localStartRotation = Quaternion.Inverse(jointedGrabbable.transform.rotation) * transform.rotation;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            freezeJoint = localGrabbable.gameObject.AddComponent<FixedJoint>().GetCopyOf(Resources.Load<FixedJoint>("DefaultJoint"));
							 | 
						||
| 
								 | 
							
								            freezeJoint.anchor = Vector3.zero;
							 | 
						||
| 
								 | 
							
								            freezeJoint.breakForce = float.PositiveInfinity;
							 | 
						||
| 
								 | 
							
								            freezeJoint.breakTorque = float.PositiveInfinity;
							 | 
						||
| 
								 | 
							
								            freezeJoint.connectedBody = jointedGrabbable.body;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void OnGrab(Hand hand, Grabbable grab) {
							 | 
						||
| 
								 | 
							
								            if(grab.GetHeldBy().Count == 1) {
							 | 
						||
| 
								 | 
							
								                Destroy(freezeJoint);
							 | 
						||
| 
								 | 
							
								                freezeJoint = null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        void OnRelease(Hand hand, Grabbable grab) {
							 | 
						||
| 
								 | 
							
								            if(grab.GetHeldBy().Count == 0) {
							 | 
						||
| 
								 | 
							
								                transform.position = jointedGrabbable.transform.TransformPoint(localStartPosition);
							 | 
						||
| 
								 | 
							
								                transform.rotation = jointedGrabbable.transform.rotation * localStartRotation;
							 | 
						||
| 
								 | 
							
								                localGrabbable.body.position = transform.position;
							 | 
						||
| 
								 | 
							
								                localGrabbable.body.rotation = transform.rotation;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                Invoke("CreateJoint", Time.fixedDeltaTime + Time.deltaTime);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private void LateUpdate() {
							 | 
						||
| 
								 | 
							
								            if(freezeJoint != null) {
							 | 
						||
| 
								 | 
							
								                transform.position = jointedGrabbable.transform.TransformPoint(localStartPosition);
							 | 
						||
| 
								 | 
							
								                transform.rotation = jointedGrabbable.transform.rotation * localStartRotation;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void CreateJoint() {
							 | 
						||
| 
								 | 
							
								            freezeJoint = localGrabbable.gameObject.AddComponent<FixedJoint>().GetCopyOf(Resources.Load<FixedJoint>("DefaultJoint"));
							 | 
						||
| 
								 | 
							
								            freezeJoint.anchor = Vector3.zero;
							 | 
						||
| 
								 | 
							
								            freezeJoint.breakForce = float.PositiveInfinity;
							 | 
						||
| 
								 | 
							
								            freezeJoint.breakTorque = float.PositiveInfinity;
							 | 
						||
| 
								 | 
							
								            freezeJoint.connectedBody = jointedGrabbable.body;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |