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.
		
		
		
		
		
			
		
			
	
	
		
			120 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			120 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand {
							 | 
						||
| 
								 | 
							
								    public class HeldPlaceJoint : PlacePoint {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [AutoHeader("Held Place Joint")]
							 | 
						||
| 
								 | 
							
								        public bool ignoreMe1;
							 | 
						||
| 
								 | 
							
								        public Grabbable connectedGrabbable;
							 | 
						||
| 
								 | 
							
								        public Vector3 pivotOffset;
							 | 
						||
| 
								 | 
							
								        public float heldMassScale = 1f;
							 | 
						||
| 
								 | 
							
								        [Space]
							 | 
						||
| 
								 | 
							
								        public float xMaxLimit = 0f;
							 | 
						||
| 
								 | 
							
								        public float xMinLimit = 0f;
							 | 
						||
| 
								 | 
							
								        public float xSpring = 0f;
							 | 
						||
| 
								 | 
							
								        [Space]
							 | 
						||
| 
								 | 
							
								        public float yMaxLimit = 0f;
							 | 
						||
| 
								 | 
							
								        public float yMinLimit = 0f;
							 | 
						||
| 
								 | 
							
								        public float ySpring = 0f;
							 | 
						||
| 
								 | 
							
								        [Space]
							 | 
						||
| 
								 | 
							
								        public float zMaxLimit = 0f;
							 | 
						||
| 
								 | 
							
								        public float zMinLimit = 0f;
							 | 
						||
| 
								 | 
							
								        public float zSpring = 0f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Space]
							 | 
						||
| 
								 | 
							
								        [Range(0, 1), Tooltip("The percentage from the min/max distance needed to trigger the event, good for creating a buffer for the event to trigger slightly before the max range to help prevent missed event")]
							 | 
						||
| 
								 | 
							
								        public float eventOffset = 0.05f;
							 | 
						||
| 
								 | 
							
								        public UnityHandGrabEvent OnMinDistanceEvent;
							 | 
						||
| 
								 | 
							
								        public UnityHandGrabEvent OnMaxDistanceEvent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        GrabbableHeldJoint heldJoint = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected  void Start() {
							 | 
						||
| 
								 | 
							
								            //base.Start();
							 | 
						||
| 
								 | 
							
								            //heldPlaceOnly = true;
							 | 
						||
| 
								 | 
							
								            disableRigidbodyOnPlace = false;
							 | 
						||
| 
								 | 
							
								            parentOnPlace = true;
							 | 
						||
| 
								 | 
							
								            forceHandRelease = false;
							 | 
						||
| 
								 | 
							
								            makePlacedKinematic = false;
							 | 
						||
| 
								 | 
							
								            forcePlace = true;
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override bool CanPlace(Grabbable placeObj, bool checkRoot = true) {
							 | 
						||
| 
								 | 
							
								            if(placeObj.body == connectedGrabbable.body)
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return base.CanPlace(placeObj);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override void Place(Grabbable placeObj) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Debug.Log("Place");
							 | 
						||
| 
								 | 
							
								            Dictionary<Hand, Transform> grabPoint = new Dictionary<Hand, Transform>();
							 | 
						||
| 
								 | 
							
								            var hands = new Hand[(placeObj.GetHeldBy().Count)];
							 | 
						||
| 
								 | 
							
								            placeObj.GetHeldBy().CopyTo(hands, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            placeObj.transform.position = placedOffset.position;
							 | 
						||
| 
								 | 
							
								            placeObj.transform.rotation = placedOffset.rotation;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            foreach(var hand in hands) {
							 | 
						||
| 
								 | 
							
								                grabPoint.Add(hand, hand.handGrabPoint);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            base.Place(placeObj);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            foreach(var hand in hands) {
							 | 
						||
| 
								 | 
							
								                //hand.BreakGrabConnection();
							 | 
						||
| 
								 | 
							
								                //hand.CreateGrabConnection(placeObj, grabPoint[hand].position, grabPoint[hand].rotation, placeObj.transform.position, placeObj.transform.rotation, true);
							 | 
						||
| 
								 | 
							
								                hand.heldJoint.connectedBody = connectedGrabbable.body;
							 | 
						||
| 
								 | 
							
								                hand.heldJoint.connectedAnchor = connectedGrabbable.body.transform.InverseTransformPoint(hand.handGrabPoint.position);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            placeObj.DeactivateRigidbody();
							 | 
						||
| 
								 | 
							
								            placeObj.transform.parent = connectedGrabbable.body.transform;
							 | 
						||
| 
								 | 
							
								            placeObj.body = connectedGrabbable.body;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(heldJoint == null) {
							 | 
						||
| 
								 | 
							
								                heldJoint = placeObj.gameObject.AddComponent<GrabbableHeldJoint>();
							 | 
						||
| 
								 | 
							
								                heldJoint.connectedGrabbable = connectedGrabbable;
							 | 
						||
| 
								 | 
							
								                heldJoint.xMaxLimit = xMaxLimit;
							 | 
						||
| 
								 | 
							
								                heldJoint.xMinLimit = xMinLimit;
							 | 
						||
| 
								 | 
							
								                heldJoint.xSpring = xSpring;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                heldJoint.yMaxLimit = yMaxLimit;
							 | 
						||
| 
								 | 
							
								                heldJoint.yMinLimit = yMinLimit;
							 | 
						||
| 
								 | 
							
								                heldJoint.ySpring = ySpring;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                heldJoint.zMaxLimit = zMaxLimit;
							 | 
						||
| 
								 | 
							
								                heldJoint.zMinLimit = zMinLimit;
							 | 
						||
| 
								 | 
							
								                heldJoint.zSpring = zSpring;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                heldJoint.eventOffset = eventOffset;
							 | 
						||
| 
								 | 
							
								                heldJoint.OnMaxDistanceEvent = OnMaxDistanceEvent;
							 | 
						||
| 
								 | 
							
								                heldJoint.OnMinDistanceEvent = OnMinDistanceEvent;
							 | 
						||
| 
								 | 
							
								                heldJoint.Start();
							 | 
						||
| 
								 | 
							
								                if(hands.Length > 0)
							 | 
						||
| 
								 | 
							
								                    heldJoint.OnGrabbed(hands[0], placeObj);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                heldJoint.UpdateJoint();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override void Remove(Grabbable placeObj) {
							 | 
						||
| 
								 | 
							
								            Debug.Log("Remove");
							 | 
						||
| 
								 | 
							
								            if(heldJoint != null) {
							 | 
						||
| 
								 | 
							
								                Destroy(heldJoint);
							 | 
						||
| 
								 | 
							
								                heldJoint = null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            base.Remove(placeObj);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |