/// <summary> /// 生成贝塞尔曲线的控制点 /// </summary> /// <param name="startPos">Start position.</param> /// <param name="endPos">End position.</param> /// <param name="config">Config.</param> /// <param name="middlePos1">Middle pos1.</param> /// <param name="middlePos2">Middle pos2.</param> public static void BesizeControlPos(Vector3 startPos, Vector3 endPos, BesizeControlConfig config, out Vector3 middlePos1, out Vector3 middlePos2, bool left = true) { Vector3 originalStartPos = startPos; int minAngle = config.MinAngle; int maxAngle = config.MaxAngle; float minDist = config.MinDistRatio; float maxDist = config.MaxDistRatio; int angle = UnityEngine.Random.Range(minAngle, maxAngle); if (!left) { angle = -angle; } endPos = endPos - startPos; endPos.z = 0; startPos = Vector3.zero; Vector3 dis = new Vector3(endPos.x - startPos.x, endPos.y - startPos.y, 0); float r = Mathf.Atan2(dis.y, dis.x) * 180 / Mathf.PI; angle += (int)r; //计算两点之间随机值 float dist = UnityEngine.Random.Range(minDist, maxDist); bool negativeFlag = false; if (dist < 0) { dist = Mathf.Abs(dist); negativeFlag = true; } Vector3 middlePos = Vector3.Lerp(startPos, endPos, dist); dist = Vector3.Distance(startPos, middlePos); float distx = Mathf.Cos(Mathf.Deg2Rad * angle) * dist; float disty = Mathf.Sin(Mathf.Deg2Rad * angle) * dist; if (negativeFlag) { distx = -distx; disty = -disty; } middlePos1 = new Vector3(distx, disty, 0) + originalStartPos; middlePos1.z = 0; middlePos2 = middlePos1; }
/// <summary> /// 创建Besize曲线的Action /// </summary> /// <param name="targetTF">Target T.</param> /// <param name="startPos">Start position.</param> /// <param name="endPos">End position.</param> /// <param name="showTime">Show time.</param> /// <param name="config">Config.</param> public static MTBezierTo CreateBesizeAction(Transform targetTF, Vector3 startPos, Vector3 endPos, float showTime, BesizeControlConfig config, BesizeControlConfig config2) { bool left = MTRandom.GetRandomInt(1, 2) > 1; Vector3 controller1; EffectUtil.BesizeControlPos(startPos, endPos, config, out controller1, out controller1, left); controller1.z = 0; Vector3 controller2; EffectUtil.BesizeControlPos(startPos, endPos, config2, out controller2, out controller2, left); controller2.z = 0; startPos = targetTF.InverseTransformPoint(startPos); startPos.z = 0; endPos = targetTF.InverseTransformPoint(endPos); endPos.z = 0; controller1 = targetTF.InverseTransformPoint(controller1); controller1.z = 0; controller2 = targetTF.InverseTransformPoint(controller2); controller2.z = 0; MTBezierConfig bconfig = new MTBezierConfig(); bconfig.ControlPoint1 = controller1; bconfig.ControlPoint2 = controller2; bconfig.EndPosition = endPos; return(new MTBezierTo(showTime, bconfig)); }