void Update() { // reset axis circularAxis = 0; straightAxis = 0; straightAxisAngle = 0; if (Input.GetMouseButtonDown(0)) { touchPositions = new List <Vector3>(); touchPositions.Add(Input.mousePosition); } // Continuous circular detection if (Input.GetMouseButton(0) && touchPositions.Count >= 1) { // calculate distance between last 2 points float distance = Vector3.Distance(Input.mousePosition, touchPositions[touchPositions.Count - 1]); // calculate whether it's a relatively short or a long distance, so we can include more/less points float distanceFactor = 1 - Mathf.Clamp01((Mathf.Abs(distance) - minDistanceBetweenPoints) / (maxDistanceBetweenPoitns - minDistanceBetweenPoints)); int pointSampleSize = (int)(distanceFactor * (maxPointSampleSize - minPointSampleSize) + minPointSampleSize); Debug.Log(distanceFactor + " " + pointSampleSize); // check if minimum distance is met if (distance > minDistanceBetweenPoints) { // add current touch touchPositions.Add(Input.mousePosition); // make sure we have enough points to do detection if (touchPositions.Count > 2) { // measure current and last angles var currentAngle = Vector3Extension.Angle2D(touchPositions[touchPositions.Count - Mathf.Min(touchPositions.Count, (int)pointSampleSize)], touchPositions[touchPositions.Count - 1]); var lastAngle = Vector3Extension.Angle2D(touchPositions[touchPositions.Count - Mathf.Min(touchPositions.Count, (int)pointSampleSize)], touchPositions[touchPositions.Count - 2]); var anglediff = Mathf.DeltaAngle(currentAngle, lastAngle); // if the difference is over the threshold if (Mathf.Abs(anglediff) > minAngleToDetectTurn) { // subtract threshold !!! not sure if needed -joon if (anglediff > 0) { anglediff -= minAngleToDetectTurn; } if (anglediff < 0) { anglediff += minAngleToDetectTurn; } // set axis, so it can be read circularAxis = Mathf.Clamp(anglediff, -angleToDetectTurnClamp, angleToDetectTurnClamp); // add debug GL lines if (debugCircularEnabled) { if (circularAxis > 0) { DebugCameraLines.AddLine(touchPositions[touchPositions.Count - (int)pointSampleSize], touchPositions[touchPositions.Count - 1], Color.red); } else { DebugCameraLines.AddLine(touchPositions[touchPositions.Count - (int)pointSampleSize], touchPositions[touchPositions.Count - 1], Color.blue); } } } else { // set straight axis straightAxis = distance; straightAxisAngle = lastAngle; //Debug.Log(straightAxis + " " + straightAxisAngle); if (debugCircularEnabled) { DebugCameraLines.AddLine(touchPositions[touchPositions.Count - (int)pointSampleSize], touchPositions[touchPositions.Count - 1], Color.yellow); } } if (debugCircularEnabled) { DebugCameraLines.AddLine(touchPositions[touchPositions.Count - (int)pointSampleSize], touchPositions[touchPositions.Count - 2], Color.white.SetA(0.4f)); } } } } }