コード例 #1
0
    /// <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;
        }
        }
    }