private void PanGestureUpdated(DigitalRubyShared.GestureRecognizer r) { if (!AllowPan) { r.Reset(); return; } Camera camera; GameObject obj = FingersScript.StartOrResetGesture(r, BringToFront, Cameras, gameObject, spriteRenderer, Mode, out camera); if (camera == null) { r.Reset(); return; } else if (r.State == GestureRecognizerState.Began) { SetStartState(r, obj, false); } else if (r.State == GestureRecognizerState.Executing && _transform != null) { if (PanGesture.ReceivedAdditionalTouches) { panZ = camera.WorldToScreenPoint(_transform.position).z; panOffset = _transform.position - camera.ScreenToWorldPoint(new Vector3(r.FocusX, r.FocusY, panZ)); } Vector3 gestureScreenPoint = new Vector3(r.FocusX, r.FocusY, panZ); Vector3 gestureWorldPoint = camera.ScreenToWorldPoint(gestureScreenPoint) + panOffset; if (rigidBody != null) { rigidBody.MovePosition(gestureWorldPoint); } else if (rigidBody2D != null) { rigidBody2D.MovePosition(gestureWorldPoint); } else if (canvasRenderer != null) { _transform.position = gestureScreenPoint; } else { _transform.position = gestureWorldPoint; } } else if (r.State == GestureRecognizerState.Ended) { if (spriteRenderer != null && BringToFront) { spriteRenderer.sortingOrder = startSortOrder; } ClearStartState(); } }
private void ScaleGestureUpdated(DigitalRubyShared.GestureRecognizer scaleGesture) { if (!AllowScale) { scaleGesture.Reset(); return; } else if (MinMaxScale.x < 0.0f || MinMaxScale.y < 0.0f || startScale == null) { // no scaling return; } Camera camera; GameObject obj = FingersScript.StartOrResetGesture(scaleGesture, BringToFront, Cameras, gameObject, spriteRenderer, Mode, out camera); if (camera == null) { scaleGesture.Reset(); return; } StateUpdated.Invoke(PanGesture); if (scaleGesture.State == GestureRecognizerState.Began) { SetStartState(scaleGesture, obj, false); } else if (scaleGesture.State == GestureRecognizerState.Executing && _transform != null) { // assume uniform scale Vector3 scale = new Vector3 ( (_transform.localScale.x * ScaleGesture.ScaleMultiplier), (_transform.localScale.y * ScaleGesture.ScaleMultiplier), (_transform.localScale.z * ScaleGesture.ScaleMultiplier) ); if (MinMaxScale.x > 0.0f || MinMaxScale.y > 0.0f) { float minValue = Mathf.Min(MinMaxScale.x, MinMaxScale.y); float maxValue = Mathf.Max(MinMaxScale.x, MinMaxScale.y); scale.x = Mathf.Clamp(scale.x, startScale.Value.x * minValue, startScale.Value.x * maxValue); scale.y = Mathf.Clamp(scale.y, startScale.Value.y * minValue, startScale.Value.y * maxValue); scale.z = Mathf.Clamp(scale.z, startScale.Value.z * minValue, startScale.Value.z * maxValue); } // don't mess with z scale for 2D scale.z = (rigidBody2D == null && spriteRenderer == null && canvasRenderer == null ? scale.z : _transform.localScale.z); _transform.localScale = scale; } else if (scaleGesture.State == GestureRecognizerState.Ended) { ClearStartState(); } }
private void LongPressGestureUpdated(DigitalRubyShared.GestureRecognizer r) { Camera camera; FingersScript.StartOrResetGesture(r, BringToFront, Cameras, gameObject, spriteRenderer, GestureRecognizerComponentScriptBase.GestureObjectMode.RequireIntersectWithGameObject, out camera); if (r.State == GestureRecognizerState.Began) { transform.localScale *= DragScale; panZ = camera.WorldToScreenPoint(transform.position).z; panOffset = transform.position - ScreenToWorldPoint(camera, r.FocusX, r.FocusY, panZ); if (DragStarted != null) { DragStarted.Invoke(this, System.EventArgs.Empty); } } else if (r.State == GestureRecognizerState.Executing) { Vector3 gestureScreenPoint = new Vector3(r.FocusX, r.FocusY, panZ); Vector3 gestureWorldPoint = ScreenToWorldPoint(camera, gestureScreenPoint.x, gestureScreenPoint.y, gestureScreenPoint.z) + panOffset; if (rigidBody != null) { rigidBody.MovePosition(gestureWorldPoint); } else if (rigidBody2D != null) { rigidBody2D.MovePosition(gestureWorldPoint); } else { transform.position = gestureWorldPoint; } if (DragUpdated != null) { DragUpdated.Invoke(this, System.EventArgs.Empty); } } else if (r.State == GestureRecognizerState.Ended) { transform.localScale /= DragScale; if (spriteRenderer != null && BringToFront) { spriteRenderer.sortingOrder = startSortOrder; } if (DragEnded != null) { DragEnded.Invoke(this, System.EventArgs.Empty); } } }
private void RotateGestureUpdated(DigitalRubyShared.GestureRecognizer rotateGesture) { if (!AllowRotate) { rotateGesture.Reset(); return; } Camera camera; GameObject obj = FingersScript.StartOrResetGesture(rotateGesture, BringToFront, Cameras, gameObject, spriteRenderer, Mode, out camera); if (camera == null) { rotateGesture.Reset(); return; } StateUpdated.Invoke(rotateGesture); if (rotateGesture.State == GestureRecognizerState.Began) { SetStartState(rotateGesture, obj, false); } else if (rotateGesture.State == GestureRecognizerState.Executing && _transform != null) { if (rigidBody != null) { float angle = RotateGesture.RotationDegreesDelta; Quaternion rotation = Quaternion.AngleAxis(angle, camera.transform.forward); rigidBody.MoveRotation(rigidBody.rotation * rotation); } else if (rigidBody2D != null) { rigidBody2D.MoveRotation(rigidBody2D.rotation + RotateGesture.RotationDegreesDelta); } else if (canvasRenderer != null) { _transform.Rotate(Vector3.forward, RotateGesture.RotationDegreesDelta, Space.Self); } else { _transform.Rotate(camera.transform.forward, RotateGesture.RotationDegreesDelta, Space.Self); } } else if (rotateGesture.State == GestureRecognizerState.Ended) { ClearStartState(); } }
private void ScaleGestureUpdated(DigitalRubyShared.GestureRecognizer r) { if (!AllowScale) { r.Reset(); return; } else if (MinMaxScale.x == MinMaxScale.y && MinMaxScale.y == 1.0f) { return; } Camera camera; GameObject obj = FingersScript.StartOrResetGesture(r, BringToFront, Cameras, gameObject, spriteRenderer, Mode, out camera); if (camera == null) { r.Reset(); return; } else if (r.State == GestureRecognizerState.Began) { SetStartState(r, obj, false); } else if (r.State == GestureRecognizerState.Executing && _transform != null) { // assume uniform scale float scale = _transform.localScale.x * ScaleGesture.ScaleMultiplier; if (MinMaxScale.x > 0.0f && MinMaxScale.y >= MinMaxScale.x) { scale = Mathf.Clamp(scale, MinMaxScale.x, MinMaxScale.y); } // don't mess with z scale for 2D float zScale = (rigidBody2D == null && spriteRenderer == null && canvasRenderer == null ? scale : _transform.localScale.z); _transform.localScale = new Vector3(scale, scale, zScale); } else if (r.State == GestureRecognizerState.Ended) { ClearStartState(); } }