public void SetFocus(GameObject focus) { m_FocusedObject = focus; m_FirstTouchedTime = Time.time; m_LastMovedTime = Time.time + kMinSelectionTime; //Add the new material, but set it as blank so it doesn't really show up. List <Material> materials = new List <Material>(focus.renderer.materials); Material newMaterial = new Material(m_HighlightMaterial); newMaterial.color = new Color(0, 0, 0, 0); materials.Add(newMaterial); focus.renderer.materials = materials.ToArray(); LeapTouchable tcb = (LeapTouchable)focus.GetComponent(typeof(LeapTouchable)); if (tcb != null) { tcb.PreventOverlappingCollision = true; } LeapInput.DraggingMode = true; LeapInput.DraggingFingers[0] = m_ObjectTouched[0].finger.transform.parent.gameObject; LeapInput.DraggingFingers[1] = m_ObjectTouched[1].finger.transform.parent.gameObject; }
void OnCollisionExit(Collision collisionInfo) { // Do something here //Debug.Log ("Touchable OnCollisionExit " + gameObject + " " + collisionInfo.gameObject); LeapTouchable tcb = (LeapTouchable)collisionInfo.gameObject.GetComponent(typeof(LeapTouchable)); if (tcb != null) { collisionInfo.gameObject.rigidbody.constraints = tcb.OrgRigidBodyConstraints; } if (collisionInfo.gameObject.tag == "Touchable") { if (preventOverlappingCollision && !LeapInput.DraggingMode) { /*Debug.Log(gameObject + " need to prevent overlapping collision of itself and object it is colliding with."); * Debug.Log(gameObject.renderer.bounds.size.y); * Debug.Log(gameObject.renderer.bounds.center.y); * Debug.Log(collisionInfo.gameObject.renderer.bounds.size.y/2); * Debug.Log(collisionInfo.gameObject.renderer.bounds.center.y);*/ gameObject.rigidbody.isKinematic = true; collisionInfo.gameObject.rigidbody.isKinematic = true; Vector3 newPos = gameObject.transform.position; newPos.y = collisionInfo.gameObject.renderer.bounds.center.y + collisionInfo.gameObject.renderer.bounds.size.y / 2 + 0.2f; gameObject.transform.position = newPos; collisionInfo.gameObject.rigidbody.isKinematic = false; collisionInfo.gameObject.rigidbody.velocity = new Vector3(0, 0, 0); gameObject.rigidbody.isKinematic = false; gameObject.rigidbody.velocity = new Vector3(0, 0, 0); preventOverlappingCollision = false; } } }
void Update() { Leap.Frame thisFrame = LeapInput.Frame; if (thisFrame == null) { return; } if (LeapInput.NumberOfFingers[0] + LeapInput.NumberOfFingers[1] == 10) { //Application.LoadLevel(Application.loadedLevel); foreach (objectTouched touchedObject in m_ObjectTouched) { touchedObject.finger.collider.isTrigger = false; } ClearFocus(); GameObject[] allTouchable = GameObject.FindGameObjectsWithTag("Touchable"); foreach (GameObject obj in allTouchable) { LeapTouchable tcb = (LeapTouchable)obj.GetComponent(typeof(LeapTouchable)); if (tcb != null) { tcb.reset(); } } return; } //Remove fingers which have been disabled int index; while ((index = m_Touching.FindIndex(i => i.collider && i.collider.enabled == false)) != -1) { m_Touching[index].collider.isTrigger = false; m_Touching.RemoveAt(index); m_LastPos.RemoveAt(index); } while ((index = m_ObjectTouched.FindIndex(i => i.finger.collider && i.finger.collider.enabled == false)) != -1) { m_ObjectTouched[index].finger.collider.isTrigger = false; m_ObjectTouched.RemoveAt(index); } while ((index = m_ObjectTouched.FindIndex(i => i.finger.collider && i.finger.collider.enabled == false)) != -1) { m_ObjectTouched.RemoveAt(index); } if (m_LastFrame != null && thisFrame != null && m_Selected) { float transMagnitude = thisFrame.Translation(m_LastFrame).MagnitudeSquared; if (transMagnitude > kMovementThreshold) { m_LastMovedTime = Time.time; } } //Set selection after the time has elapsed if (!m_Selected && m_FocusedObject && (Time.fixedTime - m_FirstTouchedTime) >= kSelectionTime) { m_Selected = true; } //Update the focused object's color float selectedT = m_FocusedObject != null ? (Time.time - m_FirstTouchedTime) / kSelectionTime : 0.0f; //If we have passed the minimum deselection threshold and are past the minimum time to start deselecting... if (m_Selected && Time.time - m_FirstTouchedTime > kIdleStartDeselectTime + kSelectionTime) { selectedT = 1.3f - (((Time.time - m_LastMovedTime) - kIdleStartDeselectTime) / kSelectionTime); } SetHighlightColor(Color.Lerp(kBlankColor, m_HighlightMaterial.color, selectedT)); //Process the movement of the selected object. if (m_Selected && thisFrame != m_LastFrame) { //End selection if we don't see any fingers or the scaling factor is going down quickly ( indicating we are making a fist ) if (CheckEndSelection(thisFrame)) { foreach (objectTouched touchedObject in m_ObjectTouched) { touchedObject.finger.collider.isTrigger = false; } ClearFocus(); } else { if (CheckShouldMove(thisFrame)) { DoMovement(thisFrame); } if (CheckShouldRotate(thisFrame)) { DoRotation(thisFrame); } if (CheckShouldScale(thisFrame)) { DoScaling(thisFrame); } } } m_LastFrame = thisFrame; for (int i = 0; i < m_Touching.Count; ++i) { m_LastPos[i] = m_Touching[i].transform.position; } }