public virtual bool CanAddAdjacentToReachable(PathFinding search, CellData adjacent) { // 如果已经在关闭集 if (search.IsCellInExpored(adjacent)) { return(false); } // 已经加入过开放集 if (search.IsCellInReachable(adjacent)) { return(false); } // 计算消耗 = 当前cell的消耗 + 邻居cell的消耗 float g = search.currentCell.g + CalcGPerCell(search, adjacent); // 不在范围内 if (g < 0f || g > search.range.y) { return(false); } adjacent.g = g; return(true); }
public override float CalcGPerCell(PathFinding search, CellData adjacent) { // 获取邻居的Tile SrpgTile tile = search.map.GetTile(adjacent.position); // 返回本格子的消耗 return(search.GetMoveConsumption(tile.terrainType)); }
public override float CalcH(PathFinding search, CellData adjacent) { Vector2 hVec; hVec.x = Mathf.Abs(adjacent.position.x - search.endCell.position.x); hVec.y = Mathf.Abs(adjacent.position.y - search.endCell.position.y); return(hVec.x + hVec.y); }
/// <summary> /// 用H计算攻击距离 /// </summary> /// <param name="search"></param> /// <param name="adjacent"></param> /// <returns></returns> public virtual float CalcH(PathFinding search, CellData adjacent) { CellData startCell = search.startCell ?? search.endCell; Vector2 hVec; hVec.x = Mathf.Abs(adjacent.position.x - startCell.position.x); hVec.y = Mathf.Abs(adjacent.position.y - startCell.position.y); return(hVec.x + hVec.y); }
public override void BuildResult(PathFinding search) { // 当没有达到目标点时,已经建立过结果 if (search.result.Count > 0) { return; } search.BuildPath(search.endCell, true); }
public virtual void BuildResult(PathFinding search) { for (int i = 0; i < search.explored.Count; i++) { CellData cell = search.explored[i]; if (cell.g >= search.range.x && cell.g <= search.range.y) { search.result.Add(cell); } } }
public override bool CanAddAdjacentToReachable(PathFinding search, CellData adjacent) { //// 没有Tile //if (!adjacent.hasTile) //{ // return false; //} //// 已经有对象了 //if (adjacent.hasMapObject) //{ // return false; //} // 是否可移动 if (!adjacent.canMove) { return(false); } // 如果已经在关闭集 if (search.IsCellInExpored(adjacent)) { return(false); } // 计算消耗 = 当前cell的消耗 + 邻居cell的消耗 float g = search.currentCell.g + CalcGPerCell(search, adjacent); // 已经加入过开放集 if (search.IsCellInReachable(adjacent)) { // 如果新消耗更低 if (g < adjacent.g) { adjacent.g = g; adjacent.previous = search.currentCell; } return(false); } // 不在范围内 if (g < 0f || g > search.range.y) { return(false); } adjacent.g = g; adjacent.previous = search.currentCell; return(true); }
public virtual bool IsFinishedOnChose(PathFinding search) { if (search.currentCell == null) { return(true); } if (!search.IsCellInExpored(search.currentCell)) { search.explored.Add(search.currentCell); } return(false); }
public virtual CellData ChoseCell(PathFinding search) { if (search.reachable.Count == 0) { return(null); } int index = search.reachable.Count - 1; CellData chose = search.reachable[index]; search.reachable.RemoveAt(index); return(chose); }
public override CellData ChoseCell(PathFinding search) { if (search.reachable.Count == 0) { return(null); } /// 取得f最小的节点(因为我们没有计算h,这里就是g) /// 当你在寻找路径有卡顿时,请一定使用更好的查找方式, /// 例如可以改用二叉树的方式, /// 也可将PathFinding里面reachable.Add(adjacent)的方法改成边排序边加入的方法 search.reachable.Sort((cell1, cell2) => - cell1.f.CompareTo(cell2.f)); int index = search.reachable.Count - 1; CellData chose = search.reachable[index]; search.reachable.RemoveAt(index); return(chose); }
public virtual bool CanAddAdjacentToReachable(PathFinding search, CellData adjacent) { // 如果已经在关闭集 if (search.IsCellInExpored(adjacent)) { return(false); } // 已经加入过开放集 if (search.IsCellInReachable(adjacent)) { return(false); } //// 计算消耗 = 当前cell的消耗 + 邻居cell的消耗 //float g = search.currentCell.g + CalcGPerCell(search, adjacent); // 计算攻击距离 float h = CalcH(search, adjacent); //// 不在范围内 //if (g < 0f || g > search.range.y) //{ // return false; //} // 攻击距离不在范围内 if (h < 0f || h > search.range.y) { return(false); } //adjacent.g = g; adjacent.h = h; return(true); }
public override bool IsFinishedOnChose(PathFinding search) { // 如果开放集中已经空了,则说明没有达到目标点 if (search.currentCell == null) { // 使用h最小值建立结果 CellData minHCell = search.explored.First(cell => cell.h == search.explored.Min(c => c.h)); search.BuildPath(minHCell, true); return(true); } // 找到了目标点 if (search.currentCell == search.endCell) { return(true); } if (!search.IsCellInExpored(search.currentCell)) { search.explored.Add(search.currentCell); } return(false); }
public virtual float CalcGPerCell(PathFinding search, CellData adjacent) { return(1f); }
public virtual float CalcH(PathFinding search, CellData adjacent) { return(0f); }