/// <summary> /// Called by Unity engine when the player is dragging mouse /// </summary> void IDragHandler.OnDrag(PointerEventData eventData) { switch (eventData.button) { // If Left mouse button, look for new points case PointerEventData.InputButton.Left: { // Determine active Track Segment TrackSegment currentTrack = _track.Last(); // Convert position from Screen Coordinates into World ones Vector2 newPosition = eventData.position.ScreenToWorld(); // Update Line Renderer preview accordingly currentTrack.SetCurrentPoint(newPosition); // Check min distance has been passed Vector2 lastTrackPoint = currentTrack.LastPoint; float currentDistance = (lastTrackPoint - newPosition).magnitude; if (currentDistance < MinDistance) { return; } // Boost first point assignment (it cannot snap due to angle comparison) if (currentTrack.PointCount <= 1) { currentDistance *= 3f; } // Check if max distance has been passed.. if (currentDistance > MaxDistance) { // ..create a new point currentTrack.AddPoint(newPosition); return; } // Check angle is over min threshold.. if (currentTrack.PointCount <= 1) { return; } Vector2 currentDirection = newPosition - lastTrackPoint; Vector2 previousDirection = lastTrackPoint - currentTrack[currentTrack.PointCount - 2]; float currentAngle = currentDirection.GetZAngle(); float previousAngle = previousDirection.GetZAngle(); if (Mathf.Abs(Mathf.DeltaAngle(previousAngle, currentAngle)) > MaxAngleDifference) { // ..create a new point currentTrack.AddPoint(newPosition); } break; } // If right button is pressed, drag camera case PointerEventData.InputButton.Right: { // Convert new and previous positions from Screen Coordinates into World ones Vector2 currentPosition = eventData.position.ScreenToWorld(); Vector2 previousPosition = (eventData.position - eventData.delta).ScreenToWorld(); // Drag camera based in their World-space distance Vector3 distance = currentPosition - previousPosition; Camera.main.transform.position -= distance; break; } } }