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