void OnRelease(GrabSensor.GrabInfo grabInfo) { if (grabInfo.obj == gameObject) { GameObject.DestroyImmediate(GetComponent <FixedJoint>()); } }
void OnGrab(GrabSensor.GrabInfo grabInfo) { if (grabInfo.obj == gameObject) { FixedJoint fj = gameObject.AddComponent <FixedJoint>(); fj.connectedBody = GameObject.Find("Robot_RightHand").GetComponent <Rigidbody>(); } }
void Update() { // debug if (Input.GetKeyDown(KeyCode.Return)) { GrabSensor.GrabInfo grab = new GrabSensor.GrabInfo(); grab.hand = GameObject.Find("Robot_RightHandMiddle1").transform; OnGrab(grab); } }
private void SetToGrabAnchor(GrabSensor.GrabInfo grab) { transform.rotation = grab.hand.rotation * Quaternion.Inverse(grabAnchor.localRotation); transform.position = grab.hand.position + Vector3.Scale(grabAnchor.localPosition, transform.lossyScale); Rigidbody[] rigids = GetComponentsInChildren <Rigidbody>(); for (int i = 0; i < rigids.Length; ++i) { rigids[i].velocity = Vector3.zero; rigids[i].angularVelocity = Vector3.zero; } }
void OnSelect(GrabSensor.GrabInfo info) { if (verbose) { Debug.LogFormat("Select {0} by {1} and {2} selectAngle = {3}", info.obj, info.left.name, info.right.name, info.selectAngle); } Renderer renderer = info.obj.GetComponent <Renderer>(); if (renderer != null) { oldMaterial = renderer.sharedMaterial; renderer.material = selectMaterial; } }
void OnGrab(GrabSensor.GrabInfo info) { // on grab if (verbose) { Debug.LogFormat("Grabbed {0} by {1} and {2} grabAngle = {3}", info.obj, info.left.name, info.right.name, info.grabAngle); } currentGrab = info; oldLayer = currentGrab.obj.layer; if (currentGrab.IsLeftHand) { currentAnchor = leftHandAnchor; } else if (currentGrab.IsRightHand) { currentAnchor = rightHandAnchor; } else { currentAnchor = bothHandAnchor; } currentAnchor.position = currentGrab.obj.transform.position; currentAnchor.rotation = currentGrab.obj.transform.rotation; velocityHistory.Clear(); angularVelocityHistory.Clear(); Renderer renderer = currentGrab.obj.GetComponent <Renderer>(); if (renderer != null) { GameObject.DestroyImmediate(renderer.material); renderer.material = grabMaterial; } currentGrab.obj.layer = LayerMask.NameToLayer("Grabbed"); currentGrab.hand = currentAnchor; Interactable interact = currentGrab.obj.GetComponent <Interactable>(); if (interact != null) { interact.OnGrab(currentGrab); } }
void OnDeselect(GrabSensor.GrabInfo info) { if (verbose) { Debug.LogFormat("Deselect {0} by {1} and {2} selectAngle = {3}", info.obj, info.left.name, info.right.name, info.selectAngle); } Renderer renderer = info.obj.GetComponent <Renderer>(); if (renderer != null) { GameObject.DestroyImmediate(renderer.material); renderer.material = oldMaterial; oldMaterial = null; } }
// call before release public override void OnRelease(GrabSensor.GrabInfo grab) { EndInteraction(); EmitCompleteEvent = true; }
public override void OnGrab(GrabSensor.GrabInfo grab) { BeginInteraction(grab.hand); }
// call before release public virtual void OnRelease(GrabSensor.GrabInfo grab) { Debug.LogFormat("OnSelected"); }
// call after grabbed public virtual void OnGrab(GrabSensor.GrabInfo grab) { SetToGrabAnchor(grab); Debug.LogFormat("OnSelected"); }
// call before deselected public void OnDeselected(GrabSensor.GrabInfo grab) { Debug.LogFormat("OnSelected"); }
public override void OnRelease(GrabSensor.GrabInfo grab) { IsAttached = false; EmitCompleteEvent = true; print("release ..."); }
public override void OnGrab(GrabSensor.GrabInfo grab) { IsAttached = true; }
void OnRelease(GrabSensor.GrabInfo info) { if (verbose) { Debug.LogFormat("Released {0} by {1} and {2} grabAngle = {3}", info.obj, info.left.name, info.right.name, info.grabAngle); } if (currentGrab != null && currentGrab.obj != null) { GameObject obj = currentGrab.obj; if (currentGrab.obj.GetComponent <Rigidbody>().velocity.magnitude < releaseDelayVelocity) { Debug.LogFormat("Immediate change layer"); ChangeLayer(currentGrab.obj, oldLayer); } else { StartCoroutine(DelayChangeLayer(currentGrab.obj, releaseDelay, oldLayer)); } //Vector3 velocityTarget = Vector3.zero; //Vector3 angularTarget = Vector3.zero; //for( int i = 0; i < velocityHistory.Count; ++i ) //{ // velocityTarget += velocityHistory[i]; // angularTarget += angularVelocityHistroy[i]; //} ////velocityTarget /= velocityHistory.Count; ////angularTarget /= velocityHistory.Count; //ApplyVelocity(obj.GetComponent<Rigidbody>(), velocityTarget, angularTarget); Vector3 maxVelocity = Vector3.zero; Vector3 maxAngularVelocity = Vector3.zero; GetMaxVelocityInHistroy(out maxVelocity, out maxAngularVelocity); lastMaxVelocity = maxVelocity; lastMaxVelocityPosition = obj.transform.position; Rigidbody rb = obj.GetComponent <Rigidbody>(); ApplyVelocity(rb, maxVelocity, maxAngularVelocity); if (rb.useGravity == true) { // additional force by last several cached positions float curveLength = 0.0f; if (positionHistory.Count > 0 && positionHistory.Count - ignoreFrameCount > 0) { for (int i = 1; i < positionHistory.Count; ++i) { curveLength += (positionHistory[i] - positionHistory[i - 1]).magnitude; } Vector3 forceDir = positionHistory[positionHistory.Count - 1] - positionHistory[positionHistory.Count - 2]; rb.AddForce(forceDir.normalized * curveLength * positionMagic, ForceMode.VelocityChange); positionHistory.Clear(); } } // restore object material Renderer renderer = currentGrab.obj.GetComponent <Renderer>(); if (renderer != null) { GameObject.DestroyImmediate(renderer.material); renderer.material = oldMaterial; oldMaterial = null; } } currentGrab = null; }
// call before release public override void OnRelease(GrabSensor.GrabInfo grab) { EndInteraction(); }