public void StartDragging() { if (typeOfHandle == HandleType.translateY || typeOfHandle == HandleType.ScaleUniform || typeOfHandle == HandleType.ScaleNonUniform) { // create plane dragPlane = new Plane(); Vector3 groundPointBelowCam = new Vector3(Camera.main.transform.position.x, 0f, Camera.main.transform.position.z); Vector3 groundPointBelowObject = new Vector3(connectObject.transform.position.x, 0f, connectObject.transform.position.z); dragPlane.SetNormalAndPosition(groundPointBelowCam - groundPointBelowObject, transform.position); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (dragPlane.Raycast(ray, out rayDistance)) { posOnDragBegin = ray.GetPoint(rayDistance); if (typeOfHandle == HandleType.translateY) { offsetOnDragBegin = connectObject.transform.position - posOnDragBegin; } else if (typeOfHandle == HandleType.ScaleUniform) { offsetOnDragBegin = connectObject.boundingBox.GetTopCenter() - posOnDragBegin; scaleOneBeginDrag = connectObject.cube.transform.parent.localScale; // get current scale Top to bottom InitialTopToBottom = connectObject.boundingBox.GetTopCenter() - connectObject.boundingBox.GetBottomCenter(); } else if (typeOfHandle == HandleType.ScaleUniform) { offsetOnDragBegin = connectObject.boundingBox.GetTopCenter() - posOnDragBegin; scaleOneBeginDrag = connectObject.cube.transform.parent.localScale; // get current scale Top to bottom InitialTopToBottom = connectObject.boundingBox.GetTopCenter() - connectObject.boundingBox.GetBottomCenter(); } else if (typeOfHandle == HandleType.ScaleNonUniform) { offsetOnDragBegin = transform.parent.position - posOnDragBegin; scaleOneBeginDrag = connectObject.cube.transform.parent.localScale; // get current scale Top to bottom InitialHandleToCenter = transform.parent.position - connectObject.boundingBox.GetCenter(); } } dragging = true; connectObject.HideHandlesExcept(transform.parent.gameObject); } }