static int SearchRoad(IntPtr L) { try { ToLua.CheckArgsCount(L, 9); int[][] arg0 = ToLua.CheckObjectArray <int[]>(L, 1); int arg1 = (int)LuaDLL.luaL_checknumber(L, 2); int arg2 = (int)LuaDLL.luaL_checknumber(L, 3); int arg3 = (int)LuaDLL.luaL_checknumber(L, 4); int arg4 = (int)LuaDLL.luaL_checknumber(L, 5); int arg5 = (int)LuaDLL.luaL_checknumber(L, 6); int arg6 = (int)LuaDLL.luaL_checknumber(L, 7); bool arg7 = LuaDLL.luaL_checkboolean(L, 8); System.Action arg8 = null; LuaTypes funcType9 = LuaDLL.lua_type(L, 9); if (funcType9 != LuaTypes.LUA_TFUNCTION) { arg8 = (System.Action)ToLua.CheckObject(L, 9, typeof(System.Action)); } else { LuaFunction func = ToLua.ToLuaFunction(L, 9); arg8 = DelegateFactory.CreateDelegate(typeof(System.Action), func) as System.Action; } System.Collections.Generic.IList <Node> o = AStarPathFinding.SearchRoad(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); ToLua.PushObject(L, o); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
/// <summary> /// 重巡路径 /// </summary> private void ReFindPath() { //Debug.Log("重新寻路"); // 重新寻路设置目标点 // 清空当前目标点 clusterData.ClearTarget(); // 取最近的对方建筑 var buildingList = DisplayerManager.Single.GetBuildingByType(GetTypeArray(clusterData.AllData.MemberData.ObjID.ObjType)); // TODO 区分地面与空中 int[][] mapData = null; // 当前地图数据 switch (clusterData.AllData.MemberData.GeneralType) { case Utils.GeneralTypeAir: mapData = LoadMap.Single.GetAirMapData(); break; case Utils.GeneralTypeSurface: mapData = LoadMap.Single.GetSurfaceMapData(); break; } // 当前单位位置映射 var startPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, clusterData.transform.position, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); // 当前目标位置映射 var endPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, GetClosestBuildingPos(buildingList), ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); // 生成路径 var path = AStarPathFinding.SearchRoad(mapData, startPos[0], startPos[1], endPos[0], endPos[1], (int)clusterData.Diameter, (int)clusterData.Diameter + 1); if (path != null && path.Count > 0) { // 清空当前目标点 clusterData.ClearTarget(); clusterData.PushTargetList(Utils.NumToPostionByList(LoadMap.Single.MapPlane.transform.position, path, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight)); } else { Debug.Log("xingjin 目标点不可达:start:" + startPos[0] + "," + startPos[1] + " end:" + endPos[0] + "," + endPos[1]); } //clusterData.PushTargetList(Utils.NumToPostionByList(LoadMap.Single.MapPlane.transform.position, path, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight)); }
/// <summary> /// 重巡路径 /// </summary> /// <param name="fsm"></param> private void ReFindPath(SoldierFSMSystem fsm) { //Debug.Log(""); // 重新寻路设置目标点 // 当前地图数据 int[][] mapData = null; // 当前地图数据 switch (clusterData.AllData.MemberData.GeneralType) { case Utils.GeneralTypeAir: mapData = LoadMap.Single.GetAirMapData(); break; case Utils.GeneralTypeSurface: mapData = LoadMap.Single.GetSurfaceMapData(); break; } // 当前单位位置映射 var startPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, clusterData.transform.position, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); // 当前目标位置映射 var endPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, fsm.EnemyTarget.ClusterData.transform.position, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); // 生成路径 var path = AStarPathFinding.SearchRoad(mapData, startPos[0], startPos[1], endPos[0], endPos[1], (int)clusterData.Diameter, (int)clusterData.Diameter + 1); if (path != null && path.Count > 0) { // 清空当前目标点 clusterData.ClearTarget(); targetPos = fsm.EnemyTarget.ClusterData.transform.position; clusterData.PushTargetList(Utils.NumToPostionByList(LoadMap.Single.MapPlane.transform.position, path, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight)); } else { Debug.Log("zhuiji 目标点不可达:start:" + startPos[0] + "," + startPos[1] + " end:" + endPos[0] + "," + endPos[1]); } }
/// <summary> /// 控制 /// </summary> private void Control() { if (Input.GetMouseButtonDown(1)) { // 释放技能 var ray = MainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; Physics.Raycast(ray, out hit); if (hit.collider != null && hit.collider.name.Equals(LoadMap.MapPlane.name)) { SkillManager.Single.DoSkillNum(1009, new FormulaParamsPacker() { StartPos = new Vector3(hit.point.x, 0, hit.point.z), TargetPos = new Vector3(hit.point.x, 0, hit.point.z), ReleaseMember = new DisplayOwner(scaner.gameObject, scaner), ReceiverMenber = new DisplayOwner(scaner.gameObject, scaner), }); } } if (Input.GetMouseButtonDown(0)) { var skill = SkillManager.Single.CreateSkillInfo(20001); Debug.Log(skill.SkillName); // 加载地图数据 //Debug.Log(PacketManage.Single.GetPacket("mapdatapack").LoadString("mapdata")); // 获取地图上的点击点 var ray = MainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; Physics.Raycast(ray, out hit); // 点击到底板 if (hit.collider != null && hit.collider.name.Equals(LoadMap.MapPlane.name)) { var posOnMap = Utils.PositionToNum(LoadMap.MapPlane.transform.position, hit.point, UnitWidth, MapWidth, MapHeight); Debug.Log("start:" + lastTimeTargetX + "," + lastTimeTargetY + " end:" + posOnMap[0] + "," + posOnMap[1]); // 加载文件内容 var mapInfoData = InitMapInfo(); var path = AStarPathFinding.SearchRoad(mapInfoData, lastTimeTargetX, lastTimeTargetY, posOnMap[0], posOnMap[1], DiameterX, DiameterY, IsJumpPoint); // 根据path放地标, 使用组队寻路跟随过去 //StartCoroutine(Step(path)); var loadMapPos = LoadMap.GetCenter(); ClusterManager.Single.Init(loadMapPos.x, loadMapPos.z, MapWidth, MapHeight, UnitWidth, mapInfoData); //LoadMap.RefreshMap(); StartMoving(path, mapInfoData, lastTimeTargetX, lastTimeTargetY); // 缓存上次目标点 lastTimeTargetX = posOnMap[0]; lastTimeTargetY = posOnMap[1]; } //var target = GameObject.Find("item0"); //if (target != null) //{ // //var testEffect = EffectsFactory.Single.CreateLinerEffect("linePrfb.prefab", null, target, 3, null, 12); // var testEffect = EffectsFactory.Single.CreateLinerEffect("linePrfb.prefab", null, new Vector3(0,0,0), new Vector3(100, 0, 100), 3, null, 12); // testEffect.Begin(); //} Debug.Log(Profiler.GetMonoUsedSize() + "/" + Profiler.GetTotalAllocatedMemory()); } if (Input.GetMouseButtonDown(2)) { // 获取地图上的点击点 var ray = MainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; Physics.Raycast(ray, out hit); // 点击到底板 if (hit.collider != null && hit.collider.name.Equals(LoadMap.MapPlane.name)) { var posOnMap = Utils.PositionToNum(LoadMap.MapPlane.transform.position, hit.point, UnitWidth, MapWidth, MapHeight); // 加载文件内容 var mapInfoData = InitMapInfo(); // 根据path放地标, 使用组队寻路跟随过去 StartCoroutine(AStarPathFinding.ISearchRoad(mapInfoData, lastTimeTargetX, lastTimeTargetY, posOnMap[0], posOnMap[1], DiameterX, DiameterY)); // 缓存上次目标点 lastTimeTargetX = posOnMap[0]; lastTimeTargetY = posOnMap[1]; } } if (Input.GetMouseButton(0)) { Utils.DrawGraphics(new RectGraphics(new Vector2(0, 0), 10, 10, 90), Color.white); } // 上下左右移动 if (Input.GetKey(KeyCode.UpArrow)) { MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z + 1); } if (Input.GetKey(KeyCode.DownArrow)) { MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z - 1); } if (Input.GetKey(KeyCode.LeftArrow)) { MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x - 1, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z); } if (Input.GetKey(KeyCode.RightArrow)) { MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x + 1, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z); } // 升高下降 if (Input.GetKey(KeyCode.PageUp)) { MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y + 1, MainCamera.transform.localPosition.z); } if (Input.GetKey(KeyCode.PageDown)) { MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y - 1, MainCamera.transform.localPosition.z); } if (Input.GetKeyUp(KeyCode.P)) { // 暂停 ClusterManager.Single.Pause(); } if (Input.GetKeyUp(KeyCode.G)) { // 继续 ClusterManager.Single.GoOn(); } if (Input.GetKeyUp(KeyCode.R)) { InitMapInfo(); } //if (Input.GetKey(KeyCode.A)) //{ // // 添加统计单位 // FightDataStatistical.Single.AddCostData(new ArmyTypeData() // { // ArmyId = 1, // ArmyType = 1, // Camp = 1, // GeneralType = 1, // SingleCost = 10 // }); //} //if (Input.GetKey(KeyCode.S)) //{ // // 打印统计数据 // Debug.Log("cost:" + FightDataStatistical.Single.GetCostData(1)); //} // 绘制关闭列表 DrawCloseMap(AStarPathFinding.closePathMap); }
/// <summary> /// 执行 /// </summary> /// <param name="frame"></param> /// <param name="blackBoard"></param> public void OnceFrame(long frame, IBlackBoard blackBoard) { actionFrame = frame; // 检查是否死亡 if (Hp <= 0) { MemberManager.Remove(this); Debug.Log("单位死亡Id:" + Id); return; } if (IsLocal && IsAI) { if (pathList != null && pathList.Count > 0) { // 继续前进 var nextNode = pathList.Pop(); Debug.Log("继续前进:" + nextNode.X + "," + nextNode.Y); // 跑出显示命令, 并等待显示部分反馈的帧数 SendCmd(new Commend(MemberManager.FrameCount, Id, OptionType.Move) { Param = new Dictionary <string, string>() { { "fromX", "" + X }, { "fromY", "" + Y }, { "toX", "" + nextNode.X }, { "toY", "" + nextNode.Y }, } }); } else { var width = blackBoard.MapBase.MapWidth; var height = blackBoard.MapBase.MapHeight; var couldNotPass = true; int targetX = 0; int targetY = 0; while (couldNotPass) { // 随机获取目标位置 targetX = RandomPacker.Single.GetRangeI(0, width); targetY = RandomPacker.Single.GetRangeI(0, height); var path = AStarPathFinding.SearchRoad( BlackBoard.Single.MapBase.GetMapArray(MapManager.MapObstacleLayer), X, Y, targetX, targetY, 1, 1); if (path != null && path.Count > 0) { couldNotPass = false; pathList = new Stack <Node>(path.ToArray()); } var index = RandomPacker.Single.GetRangeI(0, MemberManager.MemberCount); // 随机攻击一个目标 var targetMember = MemberManager.Get(index); if (targetMember != null) { SendCmd(new Commend(MemberManager.FrameCount, targetMember.Id, OptionType.Attack) { Param = new Dictionary <string, string>() { { "atkId", "" + Id }, { "atkType", "" + 1 }, { "dmg", "" + 10 }, } }); } } // 向目标寻路, 如果不可达继续寻路 var nextNode = pathList.Pop(); Debug.Log("重新寻路前进:" + nextNode.X + "," + nextNode.Y); // 跑出显示命令, 并等待显示部分反馈的帧数 SendCmd(new Commend(MemberManager.FrameCount, Id, OptionType.Move) { Param = new Dictionary <string, string>() { { "fromX", "" + X }, { "fromY", "" + Y }, { "toX", "" + nextNode.X }, { "toY", "" + nextNode.Y }, } }); } } }