//到目标点的方向 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); }
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); }
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); } }
/// <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); }
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; } }
//弹出 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; }
/// <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++; } }