void Update() { if (Input.touchCount == 1) { Touch touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved) { Physics.Raycast(mainCamera.ScreenPointToRay(touch.position), out RaycastHit hit, 1000, selectMask); transform.position = hit.point; willSelect = true; } else if (touch.phase == TouchPhase.Ended) { PositionField positions = new PositionField(transform.position, selected.Count, 1.7f); while (selected.Count > 0) { Unit unit = selected.Pop(); unit.MoveTo(positions.AllocatePosition(unit.agent)); unit.Deselect(); } willSelect = false; transform.position = new Vector3(0, -10, 0); } } else if (Input.touchCount >= 2) { willSelect = false; transform.position = new Vector3(0, -10, 0); Touch[] touches = { Input.GetTouch(0), Input.GetTouch(1) }; if (touches[0].phase == TouchPhase.Began || touches[1].phase == TouchPhase.Began) { CalculateTouchVariables(touches[0].position, touches[1].position, out lastTouchDistance, out lastTouchAveragePosition); } else if (touches[0].phase == TouchPhase.Moved || touches[1].phase == TouchPhase.Moved) { CalculateTouchVariables(touches[0].position, touches[1].position, out float touchDistance, out Vector2 touchAveragePosition); Transform cameraTransform = mainCamera.transform; Vector2 deltaAveragePosition = (lastTouchAveragePosition - touchAveragePosition); cameraTransform.Translate(Quaternion.Euler(0, cameraTransform.rotation.eulerAngles.y, 0) * new Vector3(deltaAveragePosition.x, 0, deltaAveragePosition.y) * panSpeed, Space.World); // Pan cameraTransform.Translate(new Vector3(0, 0, (lastTouchDistance - touchDistance) * -zoomSpeed), Space.Self); // Zoom cameraTransform.position = new Vector3(cameraTransform.position.x, Mathf.Clamp(cameraTransform.position.y, 5, 15), cameraTransform.position.z); CalculateTouchVariables(touches[0].position, touches[1].position, out lastTouchDistance, out lastTouchAveragePosition); } } }