public void Pickup() { //Get Nearest currentInteractable = GetNearestInteractable(); oldPosition = currentInteractable.transform.position; oldRotation = currentInteractable.transform.rotation; //Null check - do we have something? if (!currentInteractable) { return; } //Already held? Check if (currentInteractable.activeHand) { if (currentInteractable.activeHand) { currentInteractable.activeHand.Drop(); } } //Position to controller currentInteractable.ApplyOffset(transform); //Attach Rigidbody targetBody = currentInteractable.GetComponent <Rigidbody>(); joint.connectedBody = targetBody; //Set Active Hand currentInteractable.activeHand = this; }
private CustomInteractable GetNearestInteractable() { CustomInteractable nearest = null; float minDistance = float.MaxValue; float distance = 0.0f; foreach (CustomInteractable interactable in ContactInteractables) { distance = (interactable.transform.position - transform.position).sqrMagnitude; if (distance < minDistance) { minDistance = distance; nearest = interactable; } } return(nearest); }
public void Drop() { //Null Check if (!currentInteractable) { return; } //Detach from joint joint.connectedBody = null; //Return to original position currentInteractable.transform.position = oldPosition; currentInteractable.transform.rotation = oldRotation; //Clear activeHand/currentInteractable currentInteractable.activeHand = null; currentInteractable = null; }
private void GrabCheck() { if (grabType != GrabType.None && grabInteractable) { if (grabType == GrabType.Pinch && pinchButton.GetStateUp(handType)) { grabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver); GrabEnd(); } if (grabType == GrabType.Grip && grabButton.GetStateUp(handType)) { grabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver); GrabEnd(); } } if (!grabPoser) { if (blend > 0) { blendToAnimation += 1f / blend * Time.deltaTime; blendToAnimation = Mathf.Clamp01(blendToAnimation); blendToPose += 1f / blendPosition * Time.deltaTime; blendToPose = Mathf.Clamp01(blendToPose); blendToPoseMoveObject += 1f / blendPosition * Time.deltaTime; blendToPoseMoveObject = Mathf.Clamp01(blendToPoseMoveObject); } else { blendToAnimation = 1; } CustomInteractable __oldGrabInteractable = grabInteractable; if (selectedIndexInteractable) { grabInteractable = selectedIndexInteractable; if (grabInteractable != __oldGrabInteractable) { if (__oldGrabInteractable) { __oldGrabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver); } if (grabInteractable) { grabInteractable.SendMessage("GrabStart", this, SendMessageOptions.DontRequireReceiver); setHandTransform = false; grabType = GrabType.Select; RenderModelVisible(!grabInteractable.hideController); SkeletonUpdate(); blendToPose = 1; blendToPoseMoveObject = 1; _endFramePos = transform.parent.InverseTransformPoint(skeleton.transform.position); _endFrameRot = skeleton.transform.rotation; } } } else { if (selectedPinchInteractable && pinchButton.GetStateDown(handType)) { grabInteractable = selectedPinchInteractable; if (grabInteractable != __oldGrabInteractable) { if (__oldGrabInteractable) { __oldGrabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver); } if (grabInteractable) { grabInteractable.SendMessage("GrabStart", this, SendMessageOptions.DontRequireReceiver); setHandTransform = false; grabType = GrabType.Pinch; RenderModelVisible(!grabInteractable.hideController); SkeletonUpdate(); blendToPose = 1; blendToPoseMoveObject = 1; _endFramePos = transform.parent.InverseTransformPoint(skeleton.transform.position); _endFrameRot = skeleton.transform.rotation; } } } else { if (selectedGripInteractable && grabButton.GetStateDown(handType)) { grabInteractable = selectedGripInteractable; if (grabInteractable != __oldGrabInteractable) { if (__oldGrabInteractable) { __oldGrabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver); } if (grabInteractable) { grabInteractable.SendMessage("GrabStart", this, SendMessageOptions.DontRequireReceiver); setHandTransform = false; grabType = GrabType.Grip; RenderModelVisible(!grabInteractable.hideController); SkeletonUpdate(); blendToPose = 1; blendToPoseMoveObject = 1; _endFramePos = transform.parent.InverseTransformPoint(skeleton.transform.position); _endFrameRot = skeleton.transform.rotation; } } } } } } }