Пример #1
0
 void Start()
 {
     generalisedGrabDetector = FindObjectOfType <GeneralisedGrabDetector>();
     SetLineRendererWidthScale(1);
 }
Пример #2
0
    List <Vector3> GenerateArcPositions(float _arcLengthPercentage, float _arcAngle)
    {
        if (generalisedGrabDetector == null)
        {
            // try to re-find it!
            generalisedGrabDetector = FindObjectOfType <GeneralisedGrabDetector>();

            if (generalisedGrabDetector == null)
            {
                return(new List <Vector3>());
            }
        }

        float circleCentreOffsetBase    = cursorDotSize * CircleCentreOffsetBaseScale * _screenScale;
        float arcMidpointRadius         = cursorDotSize * ArcMidpointOffsetScale * _screenScale;
        float currentCircleOffsetRadius = ScreenControlUtility.MapRangeToRange(radiusScale.Evaluate(generalisedGrabDetector.GeneralisedGrabStrength), 1, 0, arcMidpointRadius / 2, circleCentreOffsetBase);

        Vector2 anchoredPosition = Camera.main.ScreenToWorldPoint(cursorTransform.anchoredPosition);

        Vector2 arcOffset = new Vector2()
        {
            x = arcMidpointRadius * Mathf.Cos(Mathf.Deg2Rad * _arcAngle),
            y = arcMidpointRadius * Mathf.Sin(Mathf.Deg2Rad * _arcAngle)
        };

        Vector2 currentCircleOffset = new Vector2()
        {
            x = currentCircleOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (_arcAngle + 180)),
            y = currentCircleOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (_arcAngle + 180))
        };

        Vector3 arcMidpoint = new Vector3()
        {
            x = anchoredPosition.x + arcOffset.x,
            y = anchoredPosition.y + arcOffset.y,
            z = transform.position.z,
        };

        Vector3 circleCentre = new Vector3()
        {
            x = arcMidpoint.x + currentCircleOffset.x,
            y = arcMidpoint.y + currentCircleOffset.y,
            z = arcMidpoint.z,
        };

        float finalOffsetRadius = arcMidpointRadius / 2;
        float arcLength         = (float)(2 * Math.PI * finalOffsetRadius) * _arcLengthPercentage;

        Vector2 delta         = (circleCentre - arcMidpoint);
        float   thetaMidpoint = (Mathf.Deg2Rad * 180) + Mathf.Atan2(delta.y, delta.x);

        float thetaMin = thetaMidpoint - ((arcLength / 2) / currentCircleOffsetRadius);
        float thetaMax = thetaMidpoint + ((arcLength / 2) / currentCircleOffsetRadius);

        List <Vector3> positions = new List <Vector3>();

        for (int i = 0; i < LineRendererPositions; i++)
        {
            float currentTheta = thetaMin + (i * (thetaMax - thetaMin) / LineRendererPositions);
            positions.Add(new Vector3()
            {
                x = circleCentre.x + Mathf.Cos(currentTheta) * currentCircleOffsetRadius,
                y = circleCentre.y + Mathf.Sin(currentTheta) * currentCircleOffsetRadius,
                z = circleCentre.z
            });
        }
        return(positions);
    }