void Start() { generalisedGrabDetector = FindObjectOfType <GeneralisedGrabDetector>(); SetLineRendererWidthScale(1); }
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); }