Пример #1
0
        //到目标点的方向
        public _Dir getTargetDir(Vector3 fromPos, Vector3 toPos)
        {
            Vector3 euAngle = Utl.getAngle(fromPos, toPos);
            float   angle   = euAngle.y;

            if (angle < 0)
            {
                angle = 360 + angle;
            }
            if ((angle >= 0 && angle <= 45) ||
                (angle >= 315 && angle <= 360))
            {
                return(_Dir.up);
            }
            else if ((angle >= 45 && angle <= 135))
            {
                return(_Dir.right);
            }
            else if ((angle >= 135 && angle <= 225))
            {
                return(_Dir.bottom);
            }
            else if ((angle >= 225 && angle <= 315))
            {
                return(_Dir.left);
            }
            else
            {
                Debug.LogError("This angle not in switch case!!!! angle===" + angle);
            }
            return(_Dir.up);
        }
Пример #2
0
        public List <Vector3> doSearchPath(Vector3 toPos)
        {
            List <Vector3> list = null;

            if (canReach(originPosition, toPos, endReachedDistance))
            {
                list = new List <Vector3>();
                list.Add(mTransform.position);
                list.Add(toPos);
                return(list);
            }
            int searchTime = 0;

            list = searchPathByRay(originPosition, originPosition, toPos, Utl.getAngle(mTransform, toPos), ref searchTime);
            filterPath(ref list);
            if (list != null && list.Count > 0)
            {
                list.Insert(0, mTransform.position);
            }
            return(list);
        }
Пример #3
0
        public virtual void doFire(CLUnit attacker, CLUnit target, Vector3 orgPos, Vector3 dir, object attr, object data, object callbak)
        {
            this.attr        = attr;
            this.data        = data;
            this.attacker    = attacker;
            this.target      = target;
            onFinishCallback = callbak;

            int SpeedRandomFactor = MapEx.getBytes2Int(attr, "SpeedRandomFactor");

            //			int SpeedRandomFactor = NumEx.bio2Int (MapEx.getBytes (attr, "SpeedRandomFactor"));
            speed = MapEx.getBytes2Int(attr, "Speed") / 10.0f;
            //			speed = (NumEx.bio2Int (MapEx.getBytes (attr, "Speed"))) / 10.0f;
            if (SpeedRandomFactor > 0)
            {
                speed = speed + attacker.fakeRandom(-SpeedRandomFactor, SpeedRandomFactor) / 100.0f;
            }
            high = MapEx.getBytes2Int(attr, "High") / 10.0f;
            //			high = NumEx.bio2Int (MapEx.getBytes (attr, "High"));
            if (MapEx.getBool(attr, "IsHighOffset"))
            {
                high = high * (1.0f + attacker.fakeRandom(-200, 200) / 1000.0f);
            }
            bool isZeroY = high > 0 ? true : false;

            float dis = MapEx.getBytes2Int(attr, "Range") / 10.0f;

            //			float dis = NumEx.bio2Int (MapEx.getBytes (attr, "Range")) / 10.0f;
            isFollow            = MapEx.getBool(attr, "IsFollow");
            isMulHit            = MapEx.getBool(attr, "IsMulHit");
            needRotate          = MapEx.getBool(attr, "NeedRotate");
            RefreshTargetMSec   = MapEx.getBytes2Int(attr, "RefreshTargetMSec");
            lastResetTargetTime = DateEx.nowMS;
            lastResetToPosTime  = DateEx.nowMS;
            //dir.y = 0;
            Utl.RotateTowards(transform, dir);

            origin             = orgPos;
            transform.position = origin;
            Vector3 toPos = Vector3.zero;

            if (target != null && dis <= 0)
            {
                toPos = target.transform.position;
            }
            else
            {
                toPos = origin + dir.normalized * dis;
                //toPos.y = 0;
            }
            int PosRandomFactor = MapEx.getBytes2Int(attr, "PosRandomFactor");

            //			int PosRandomFactor = NumEx.bio2Int (MapEx.getBytes (attr, "PosRandomFactor"));
            if (PosRandomFactor > 0)
            {
                toPos.x += attacker.fakeRandom(-PosRandomFactor, PosRandomFactor) / 100.0f;
                toPos.y += attacker.fakeRandom(-PosRandomFactor, PosRandomFactor) / 100.0f;
            }

            //if (isZeroY) {
            //    toPos.y = 0;
            //}

            if (boxCollider != null)
            {
                if (MapEx.getBool(attr, "CheckTrigger"))
                {
                    boxCollider.enabled = true;
                }
                else
                {
                    boxCollider.enabled = false;
                }
            }
            haveCollider = (boxCollider != null && boxCollider.enabled);

            v3Diff = toPos - origin;

            if (angleOffset != 0)
            {
                Vector3 center = origin + v3Diff / 2.0f;
//				transform.position = center + new Vector3 (0, high, 0);
                Vector3 _v3 = Utl.RotateAround(center + new Vector3(0, high, 0), center, v3Diff, angleOffset * Mathf.Sin(Mathf.Deg2Rad * Utl.getAngle(v3Diff).y));
//				transform.RotateAround (center, v3Diff, angleOffset * Mathf.Sin (Mathf.Deg2Rad * Utl.getAngle (v3Diff).y));
                highV3 = _v3 - center;
            }
            else
            {
                highV3 = new Vector3(0, high, 0);
            }

            magnitude = v3Diff.magnitude <= 0.00001f ? 1 : 1.0f / v3Diff.magnitude;

            hitTarget  = null;
            curveTime  = 0;
            curveTime2 = 0;
            isStoped   = false;
            isFireNow  = true;
            RotateBullet();
            CancelInvoke("timeOut");
            int stayTime = MapEx.getBytes2Int(attr, "MaxStayTime");

//			int stayTime = NumEx.bio2Int (MapEx.getBytes (attr, "MaxStayTime"));
            if (stayTime > 0.00001)
            {
                Invoke("timeOut", stayTime / 10.0f);
            }
        }
Пример #4
0
        /// <summary>
        /// Searchs the path by ray.
        /// </summary>
        /// <returns>The path by ray.</returns>
        /// <param name="prefromPos">Prefrom position.前一个起始点</param>
        /// <param name="fromPos">From position.当前的起始点</param>
        /// <param name="toPos">To position.目标点</param>
        /// <param name="angle">Angle.当前点的朝向角度</param>
        List <Vector3> searchPathByRay(Vector3 prefromPos, Vector3 fromPos, Vector3 toPos, Vector3 angle, ref int searchTime)
        {
            if (maxSearchTimes > 0 && (searchTime + 1) >= maxSearchTimes)
            {
                Debug.LogWarning("search times at the maxtimes=" + maxSearchTimes);
                return(null);
            }
            //Vector3 dir = toPos - fromPos;
            List <Vector3> vetorList = null;

            if (canReach(fromPos, toPos, 0))
            {
                //可以到达目标点,把该点加到路径中返回
                vetorList = new List <Vector3>();
                vetorList.Add(toPos);
                return(vetorList);
            }
            else
            {
                //起始点不能到达目标点,则从起始点的周围开始重新寻路
                Vector3 angle2 = angle;
                Vector3 from   = fromPos;
                //left
                List <Vector3> left = new List <Vector3>();
                //right
                List <Vector3> right = new List <Vector3>();
                getPoints(from, angle2, rayDistance, ref left, ref right);
                List <Vector3> leftResult  = null;
                List <Vector3> rightResult = null;
                //------------------------------------------------------------------
                int     count          = left.Count;
                Vector3 oldPos         = Vector3.zero;
                bool    isFirstLeft    = true;
                bool    isFirstRight   = true;
                _Dir    curTargetDir   = getTargetDir(from, prefromPos);
                _Dir    toPosTargetDir = getTargetDir(from, toPos);
                for (int i = 0; i < count; i++)
                {
                    if (canLeftSearch && searchTime < maxSearchTimes)
                    {
                        if (canReach(from, left[i], 0) && !isInCircle(left[i], tmpVectorList1))
                        {
                            _Dir nextTargetDir = getTargetDir(left[i], from);

                            if ((curTargetDir == nextTargetDir) ||
                                (curTargetDir == _Dir.up && (nextTargetDir == _Dir.left || nextTargetDir == _Dir.right)) ||
                                (curTargetDir == _Dir.bottom && (nextTargetDir == _Dir.left || nextTargetDir == _Dir.right)) ||
                                (curTargetDir == _Dir.left && (nextTargetDir == _Dir.up || nextTargetDir == _Dir.bottom)) ||
                                (curTargetDir == _Dir.right && (nextTargetDir == _Dir.up || nextTargetDir == _Dir.bottom))
                                )
                            {
                                //Debug.Log("left:" + searchTime + "," + curTargetDir + "," + nextTargetDir);
                                Vector3 tmpPos1 = left[i];//from;
                                Vector3 tmpPos2 = toPos;
                                if (isFirstLeft)
                                {
                                    isFirstLeft = false;
                                    //oldPos = left[i];
                                }
                                else
                                {
                                    tmpPos2 = left[i - 1];
                                    tmpPos1 = left[i];
                                }
                                _Dir _targetDir = getTargetDir(left[i], toPos);
                                if (_targetDir == _Dir.left ||
                                    _targetDir == _Dir.right)
                                {
                                    tmpPos1.z = 0;
                                    tmpPos2.z = 0;
                                }
                                else
                                {
                                    tmpPos1.x = 0;
                                    tmpPos2.x = 0;
                                }

                                tmpPos1.y = 0;
                                tmpPos2.y = 0;
                                angle2    = Utl.getAngle(tmpPos1, tmpPos2);


                                //加入到临时点列表中
                                tmpVectorList1.Add(left[i]);
                                //把新的起始点当作起始点重新寻路
                                searchTime++;
                                leftResult = searchPathByRay(from, left[i], toPos, angle2, ref searchTime);
                            }
                        }
                    }
                    if (canRightSearch && searchTime < maxSearchTimes)
                    {
                        if (canReach(from, right[i], 0) && !isInCircle(right[i], tmpVectorList2))
                        {
                            _Dir nextTargetDir = getTargetDir(right[i], from);

                            if ((curTargetDir == nextTargetDir) ||
                                (curTargetDir == _Dir.up && (nextTargetDir == _Dir.left || nextTargetDir == _Dir.right)) ||
                                (curTargetDir == _Dir.bottom && (nextTargetDir == _Dir.left || nextTargetDir == _Dir.right)) ||
                                (curTargetDir == _Dir.left && (nextTargetDir == _Dir.up || nextTargetDir == _Dir.bottom)) ||
                                (curTargetDir == _Dir.right && (nextTargetDir == _Dir.up || nextTargetDir == _Dir.bottom))
                                )
                            {
                                //Debug.Log("right:" + searchTime + "," + curTargetDir + "," + nextTargetDir);
                                Vector3 tmpPos1 = right[i];//from;
                                Vector3 tmpPos2 = toPos;
                                if (isFirstRight)
                                {
                                    isFirstRight = false;
                                    oldPos       = right[i];
                                }
                                else
                                {
                                    tmpPos2 = oldPos;//right[i - 1];//;
                                    tmpPos1 = right[i];
                                }
                                _Dir _targetDir = getTargetDir(right[i], toPos);
                                if (_targetDir == _Dir.left ||
                                    _targetDir == _Dir.right)
                                {
                                    tmpPos1.z = 0;
                                    tmpPos2.z = 0;
                                }
                                else
                                {
                                    tmpPos1.x = 0;
                                    tmpPos2.x = 0;
                                }

                                tmpPos1.y = 0;
                                tmpPos2.y = 0;
                                angle2    = Utl.getAngle(tmpPos1, tmpPos2);


                                tmpVectorList2.Add(right[i]);
                                searchTime++;
                                rightResult = searchPathByRay(from, right[i], toPos, angle2, ref searchTime);
                            }
                        }
                    }

                    if (leftResult != null && rightResult == null)
                    {
                        leftResult.Insert(0, left[i]);
                        leftResult.Insert(0, from);
                        vetorList = leftResult;
                        break;
                    }
                    else if (leftResult == null && rightResult != null)
                    {
                        rightResult.Insert(0, right[i]);
                        rightResult.Insert(0, from);
                        vetorList = rightResult;
                        break;
                    }
                    else if (leftResult != null && rightResult != null)
                    {
                        leftResult.Insert(0, left[i]);
                        rightResult.Insert(0, right[i]);
                        vetorList = getShortList(leftResult, rightResult);
                        vetorList.Insert(0, from);
                        break;
                    }
                }
            }
            return(vetorList);
        }
Пример #5
0
 public void refreshToPos(Vector3 toPos, float angleOffset = 0)
 {
     if (isWoldPos)
     {
         v3Diff = toPos - origin;
     }
     else
     {
         v3Diff = toPos - origin;
     }
     if (angleOffset > -0.00001f && angleOffset < 0.00001f)
     {
         highV3 = new Vector3(0, high, 0);
     }
     else
     {
         Vector3 center = origin + v3Diff / 2.0f;
         Vector3 _v3    = Utl.RotateAround(center + new Vector3(0, high, 0), center, v3Diff, angleOffset * Mathf.Sin(Mathf.Deg2Rad * Utl.getAngle(v3Diff).y));
         highV3 = _v3 - center;
     }
 }
Пример #6
0
        //弹出
        public void flyout(Vector3 toPos, float speed, float ihight, float angleOffset,
                           object onMovingCallback, object finishCallback, object orgs, bool isWoldPos)
        {
            this.orgParams        = orgs;
            this.onFinishCallback = finishCallback;
            this.onMovingCallback = onMovingCallback;
            this.speed            = speed;
            this.high             = ihight;
            this.isWoldPos        = isWoldPos;
            isMoveForward         = false;

            if (isWoldPos)
            {
                origin = transform.position;
                v3Diff = toPos - transform.position;
            }
            else
            {
                origin = transform.localPosition;
                v3Diff = toPos - transform.localPosition;
            }

            if (angleOffset > -0.00001f && angleOffset < 0.00001f)
            {
                highV3 = new Vector3(0, high, 0);
            }
            else
            {
                Vector3 center = origin + v3Diff / 2.0f;
                Vector3 _v3    = Utl.RotateAround(center + new Vector3(0, high, 0), center, v3Diff, angleOffset * Mathf.Sin(Mathf.Deg2Rad * Utl.getAngle(v3Diff).y));
                highV3 = _v3 - center;
            }

            curveTime = 0;

            isMoveNow = true;
            enabled   = true;
        }
Пример #7
0
        /// <summary>
        /// Softens the path.软化路径
        /// </summary>
        /// <param name="list">List.路径列表</param>
        /// <param name="softenPathType">Soften path type.软化类型</param>
        /// <param name="slerpFactor">Soften factor.曲面差值次数</param>
        /// <param name="cellSize">Cell size.单元格大小</param>
        public static void softenPath(ref List <Vector3> list, SoftenPathType softenPathType, int slerpFactor, float cellSize)
        {
            if (list == null || list.Count < 3)
            {
                return;
            }
            int i = 1;

            float factor      = 0.25f;
            float slerpOffset = 0;

            if (softenPathType == SoftenPathType.Slerp)
            {
                factor      = 0.5f;
                slerpFactor = slerpFactor == 0 ? 1 : slerpFactor;
                slerpOffset = 1.0f / slerpFactor;
            }
            while (i < list.Count - 1)
            {
                Vector3 mid   = list[i];
                Vector3 left  = list[i - 1];
                Vector3 right = list[i + 1];

                Vector3 angle1 = Utl.getAngle(mid, left);
                Vector3 angle2 = Utl.getAngle(mid, right);
                if (Mathf.Abs(Mathf.Abs(angle1.y - angle2.y) - 180) <= 20)
                {
                    //基本在一条线上,直接跳过
                    i++;
                    continue;
                }

                Vector3 leftOffset = Vector3.zero;
                float   leftDis    = Vector3.Distance(mid, left);
                if (leftDis >= cellSize)
                {
                    leftOffset = (left - mid).normalized * cellSize * factor;
                }
                else
                {
                    leftOffset = (left - mid).normalized * leftDis * factor;
                }
                left = mid + leftOffset;

                Vector3 rightOffset = Vector3.zero;
                float   rightDis    = Vector3.Distance(mid, right);
                if (rightDis >= cellSize)
                {
                    rightOffset = (right - mid).normalized * cellSize * factor;
                }
                else
                {
                    rightOffset = (right - mid).normalized * rightDis * factor;
                }
                right = mid + rightOffset;

                Vector3 center = (left + right) / 2.0f;
                Vector3 mid2   = center + (center - mid).normalized * Vector3.Distance(center, mid) * 4f;

                list.RemoveAt(i); //把硬转角的点去掉
                                  //接下来加入一些新的点
                list.Insert(i, left);
                i++;
                if (softenPathType == SoftenPathType.Slerp)
                {
                    //加入球面插值的点
                    Vector3 v1 = left - mid2;
                    Vector3 v2 = right - mid2;
                    for (int j = 0; j < slerpFactor; j++)
                    {
                        Vector3 pos = Vector3.Slerp(v1, v2, slerpOffset * j);
                        list.Insert(i, (pos + mid2));
                        i++;
                    }
                }
                list.Insert(i, right);
                i++;
            }
        }