コード例 #1
0
        public void DrawGizmo()
        {
            Bezier bezier = Bezier.CubicBezier(p1.origin, p1.forward, p2.backward, p2.origin);
            float  delta  = 1 / RESOLUTION;

            for (var i = 0; i < RESOLUTION; i++)
            {
                Gizmos.color = Color.Lerp(p1.color, p2.color, i * delta);
                Gizmos.DrawLine(bezier.Calculate(i * delta), bezier.Calculate((i + 1) * delta));
            }
        }
コード例 #2
0
 private void MoveAlongCurrentTrajectory()
 {
     progress = currentTrajectory.CalculateTByLength(progress, speed * Time.deltaTime);
     if (progress <= 1f)
     {
         transform.position = currentTrajectory.Calculate(progress);
         transform.forward  = currentTrajectory.CalculateForward(progress);
     }
 }
コード例 #3
0
    void RecalculteLine()
    {
        if (source == null)
        {
            return;
        }

        if (thisRect == null)
        {
            thisRect = GetComponent <RectTransform>();
        }
        thisRect.GetWorldCorners(ThisRectPoints);
        source.GetWorldCorners(sourcePoints);
        for (int i = 0; i < 4; i++)
        {
            ThisRectBorders[i] = (ThisRectPoints[i] + ThisRectPoints[(i + 1) % 4]) / 2;
            sourceBorders[i]   = (sourcePoints[i] + sourcePoints[(i + 1) % 4]) / 2;
        }

        float minDistnace = System.Single.MaxValue;

        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                float thisDistance = (ThisRectBorders[i] - sourceBorders[j]).magnitude;
                if (thisDistance < minDistnace)
                {
                    minDistnace   = thisDistance;
                    selectedFaces = new Vector2Int(i, j);
                    arrow[0]      = sourceBorders[j] + new Vector3(arrowAmt * ((i == 0 || i == 1) ? 1 : -1), arrowAmt * ((j == 0 || j == 1) ? 1 : -1));
                    arrow[1]      = sourceBorders[j] + new Vector3(arrowAmt * ((i == 0 || i == 3) ? 1 : -1), arrowAmt * ((j == 1 || j == 2) ? 1 : -1));
                }
            }
        }
        bezierAmount = minDistnace / Mathf.Max(thisRect.rect.width, source.rect.width, thisRect.rect.height, source.rect.height);

        computedPoints.Clear();


        Vector3 startPos = ThisRectBorders[selectedFaces.x];
        Vector3 endPos   = sourceBorders[selectedFaces.y];

        Vector3 startVect = startPos + bezierAmount * (startPos - thisRect.position);
        Vector3 endVect   = endPos + bezierAmount * (endPos - source.position);

        for (float i = 0; i <= 1; i += 0.05f)
        {
            computedPoints.Add(Bezier.Calculate(i, startPos, startVect, endVect, endPos) + forward);
        }
    }
コード例 #4
0
 public static Vector3 GetPointPosition(Vector3 start, Vector3 end, Vector3 helper, float t)
 {
     return(Bezier.Calculate(start, helper, end, t));
 }
コード例 #5
0
    public static Vector3 GetPointPosition(Vector3 start, Vector3 end, float t, float multiply)
    {
        Vector3 additionalPoint = Bezier.CenterOf(start, end) - new Vector3(0, multiply * Vector3.Distance(start, end) / 2, 0);

        return(Bezier.Calculate(start, additionalPoint, end, t));
    }
コード例 #6
0
    void RecalculteLine()
    {
#if UNITY_EDITOR
        if (target == null)
        {
            return;
        }
        if (thisRect == null)
        {
            thisRect = GetComponent <RectTransform>();
        }
        thisRect.GetWorldCorners(thisRectPoints);
        target.GetWorldCorners(targetPoints);
        Vector2 thisCenter   = Vector3.zero;
        Vector2 targetCenter = Vector3.zero;
        for (int i = 0; i < 4; i++)
        {
            thisRectBordersCenters[i] = Vector2.Lerp((Vector2)thisRectPoints[i], (Vector2)thisRectPoints[(i + 1) % 4], lineDetails.attachPointThis);
            sourceBorderCenters[i]    = Vector2.Lerp((Vector2)targetPoints[i], (Vector2)targetPoints[(i + 1) % 4], lineDetails.attachPoint);
            thisCenter   += thisRectBordersCenters[i];
            targetCenter += sourceBorderCenters[i];
        }
        float edgeLen = inverse ? (thisRectPoints[0] - thisRectPoints[2]).magnitude : (targetPoints[0] - targetPoints[2]).magnitude;
        edgeLen      /= 4;
        thisCenter   /= 4;
        targetCenter /= 4;
        float minDistnace = System.Single.MaxValue;

        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                float thisDistance = (thisRectBordersCenters[i] - sourceBorderCenters[j]).magnitude;
                if (thisDistance < minDistnace)
                {
                    minDistnace   = thisDistance;
                    selectedFaces = new Vector2Int(i, j);
                }
            }
        }
        bezierAmount = minDistnace / Mathf.Max(thisRect.rect.width, target.rect.width, thisRect.rect.height, target.rect.height);
        computedPoints.Clear();
        Vector3 sOfs         = arrowInfo.marginStart * .1f * edgeLen * GetOffset(selectedFaces.x);
        Vector3 eOfs         = arrowInfo.marginEnd * .1f * edgeLen * GetOffset(selectedFaces.y);
        Vector3 startPos     = (Vector3)thisRectBordersCenters[selectedFaces.x] + sOfs;
        Vector3 endPos       = (Vector3)sourceBorderCenters[selectedFaces.y] + eOfs;
        Vector3 sTan1        = (lineDetails.useAnchorPoint ? thisRect.position : (Vector3)thisCenter) + sOfs;
        Vector3 eTan1        = (lineDetails.useAnchorPoint ? target.position : (Vector3)targetCenter) + eOfs;
        Vector3 startTangent = startPos + bezierAmount * (startPos - sTan1) * lineDetails.bezierMultiplier * lineDetails.bezierMultiplier;
        Vector3 endTangent   = endPos + bezierAmount * (endPos - eTan1) * lineDetails.bezierMultiplier * lineDetails.bezierMultiplier;

        if (inverse)
        {
            zExt.Swap(ref startPos, ref endPos);
            zExt.Swap(ref startTangent, ref endTangent);
        }
        lineDetails.distance = ((Vector2)endPos - (Vector2)startPos).magnitude;

        float step = lineDetails.GetStep();
        if (lineDetails.bezierMultiplier > 0)
        {
            for (float i = 0; i <= 1; i += step)
            {
                computedPoints.Add(Bezier.Calculate(i, startPos, startTangent, endTangent, endPos));
            }
        }
        else
        {
            for (float i = 0; i <= 1; i += step)
            {
                computedPoints.Add(Vector3.Lerp(startPos, endPos, i));
            }
        }

        computedPoints.Add(endPos);
        if (colors == null || colors.Length != computedPoints.Count)
        {
            colors = new Color[computedPoints.Count];
        }
        if (computedPoints.Count > 0)
        {
            float lerpStep   = 1f / colors.Length;
            Color startColor = color;
            Color fadeColor  = color;
            fadeColor.a  *= inverse ? lineDetails.fadeStartAlpha : lineDetails.fadeEndAlpha;
            startColor.a *= !inverse ? lineDetails.fadeStartAlpha : lineDetails.fadeEndAlpha;;
            for (int i = 0; i < colors.Length; i++)
            {
                colors[i] = Color.Lerp(startColor, fadeColor, (inverse ? (colors.Length - i) : i) * lerpStep);
            }
            arrowInfo.SetPoints(computedPoints, edgeLen);
        }
        lineDetails.currentStepCount = computedPoints.Count;
#endif
    }