diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/Preview.png index 7b54f23..d987c60 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/Preview.png +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/RoomInfo.json index 484c844..54cd81b 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/RoomInfo.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/RoomInfo.json @@ -1 +1 @@ -{"Position":{"X":-4,"Y":-6},"Size":{"X":14,"Y":14},"DoorAreaInfos":[{"Direction":0,"Start":80,"End":144},{"Direction":2,"Start":16,"End":160},{"Direction":1,"Start":96,"End":160},{"Direction":3,"Start":48,"End":160}],"GroupName":"TestGroup2","RoomType":1,"RoomName":"Start1","Weight":100,"Remark":""} \ No newline at end of file +{"Position":{"X":-3,"Y":-6},"Size":{"X":13,"Y":13},"DoorAreaInfos":[{"Direction":0,"Start":32,"End":112},{"Direction":2,"Start":0,"End":160},{"Direction":1,"Start":64,"End":176},{"Direction":3,"Start":32,"End":144}],"GroupName":"TestGroup2","RoomType":1,"RoomName":"Start1","Weight":100,"Remark":""} \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/TileInfo.json index 0b84828..3550281 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/TileInfo.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup2/inlet/Start1/TileInfo.json @@ -1 +1 @@ -{"NavigationList":[],"Floor":[0,-2,0,0,4,0,-1,0,0,4,0,0,0,0,4,0,1,0,0,4,1,1,0,0,4,2,1,0,0,4,3,1,0,0,4,4,1,0,0,4,5,1,0,0,4,5,-3,0,0,4,5,-2,0,0,4,5,-1,0,0,4,5,0,0,0,4,3,-3,0,0,4,4,-2,0,0,4,4,-1,0,0,4,4,0,0,0,4,3,0,0,0,4,2,0,0,0,4,1,0,0,0,4,3,-2,0,0,4,3,-1,0,0,4,1,-2,0,0,4,2,-1,0,0,4,1,-1,0,0,4,1,2,0,0,4,2,2,0,0,4,5,2,0,0,4,6,2,0,0,4,7,2,0,0,4,3,2,0,0,4,0,2,0,0,4,-1,2,0,0,4,-2,2,0,0,4,-3,2,0,0,4,-2,3,0,0,4,-1,3,0,0,4,0,3,0,0,4,0,4,0,0,4,1,4,0,0,4,2,4,0,0,4,3,4,0,0,4,4,4,0,0,4,5,4,0,0,4,6,4,0,0,4,7,4,0,0,4,7,3,0,0,4,6,3,0,0,4,5,3,0,0,4,3,3,0,0,4,2,3,0,0,4,1,3,0,0,4,-2,4,0,0,4,-1,4,0,0,4,7,5,0,0,4,6,5,0,0,4,5,5,0,0,4,4,5,0,0,4,3,5,0,0,4,2,5,0,0,4,1,5,0,0,4,0,5,0,0,4,-1,5,0,0,4,-2,5,0,0,4,-2,6,0,0,4,-1,6,0,0,4,0,6,0,0,4,1,6,0,0,4,2,6,0,0,4,3,6,0,0,4,4,6,0,0,4,5,6,0,0,4,6,6,0,0,4,6,-3,0,0,4,6,-2,0,0,4,6,-1,0,0,4,6,0,0,0,4,6,1,0,0,4,2,-2,0,0,4,7,-2,0,0,4,7,-1,0,0,4,7,0,0,0,4,7,1,0,0,4,8,1,0,0,4,8,0,0,0,4,8,-1,0,0,4,8,-2,0,0,4,7,-3,0,0,4,4,-3,0,0,4,-1,1,0,0,4,-2,1,0,0,4,-3,1,0,0,4,-3,0,0,0,4,-2,0,0,0,4,-1,0,0,0,4,-1,-1,0,0,4,-2,-1,0,0,4,-3,-1,0,0,4,-1,-2,0,0,4,8,-3,0,0,4,2,-3,0,0,4,1,-3,0,0,4,0,-3,0,0,4,-1,-3,0,0,4,-1,-4,0,0,4,0,-4,0,0,4,1,-4,0,0,4,2,-4,0,0,4,3,-4,0,0,4,4,-4,0,0,4,5,-4,0,0,4,6,-4,0,0,4,7,-4,0,0,4,8,-4,0,0,4,-2,-4,0,0,4,4,2,0,0,4,4,3,0,0,4],"Middle":[],"Top":[-4,-6,0,9,2,-4,-5,0,9,2,-4,-4,0,9,2,-4,-3,0,6,2,-4,-2,0,11,2,-4,-1,0,11,2,-4,0,0,11,2,-4,1,0,11,2,-4,2,0,11,2,-4,3,0,6,1,-4,4,0,9,2,-4,5,0,9,2,-4,6,0,9,2,-4,7,0,9,2,-3,-6,0,6,2,-3,-5,0,11,2,-3,-4,0,11,2,-3,-3,0,6,3,-3,-2,0,2,4,-3,3,0,11,0,-3,4,0,11,2,-3,5,0,11,2,-3,6,0,11,2,-3,7,0,6,1,-2,-6,0,9,3,-2,-5,0,2,4,-2,-3,0,3,3,-2,-2,0,3,4,-2,7,0,10,0,-1,-6,0,9,3,-1,-5,0,2,4,-1,7,0,10,0,0,-6,0,9,3,0,-5,0,2,4,0,7,0,10,0,1,-6,0,9,3,1,-5,0,2,4,1,7,0,10,0,2,-6,0,9,3,2,-5,0,2,4,2,7,0,10,0,3,-6,0,9,3,3,-5,0,2,4,3,7,0,10,0,4,-6,0,9,3,4,-5,0,2,4,4,7,0,10,0,5,-6,0,9,3,5,-5,0,2,4,5,7,0,10,0,6,-6,0,9,3,6,-5,0,2,4,6,7,0,10,0,7,-6,0,9,3,7,-5,0,2,4,7,6,0,8,0,7,7,0,5,1,8,-6,0,9,3,8,-5,0,2,4,8,2,0,8,0,8,3,0,8,1,8,4,0,8,1,8,5,0,8,1,8,6,0,5,1,8,7,0,9,2,9,-6,0,5,2,9,-5,0,8,1,9,-4,0,8,1,9,-3,0,8,1,9,-2,0,8,1,9,-1,0,8,1,9,0,0,8,1,9,1,0,8,1,9,2,0,5,1,9,3,0,9,2,9,4,0,9,2,9,5,0,9,2,9,6,0,9,2,9,7,0,9,2]} \ No newline at end of file +{"NavigationVertices":[{"X":54,"Y":70},{"X":122,"Y":98},{"X":-26,"Y":98},{"X":-6,"Y":70},{"X":-26,"Y":-10},{"X":-6,"Y":18},{"X":138,"Y":-42},{"X":138,"Y":34},{"X":122,"Y":34},{"X":102,"Y":6},{"X":102,"Y":-30},{"X":106,"Y":-42},{"X":22,"Y":18},{"X":6,"Y":-10},{"X":58,"Y":6},{"X":54,"Y":34},{"X":22,"Y":34},{"X":6,"Y":-58},{"X":106,"Y":-58},{"X":58,"Y":-30}],"NavigationPolygon":[[0,1,2,3],[3,2,4,5],[6,7,8,9,10,11],[12,5,4,13,14],[9,8,1,0,15,14],[15,16,12,14],[13,17,18,19],[19,14,13],[10,19,18,11]],"Floor":[0,-2,0,0,4,0,-1,0,0,4,0,0,0,0,4,1,1,0,0,4,2,1,0,0,4,3,1,0,0,4,4,1,0,0,4,5,1,0,0,4,5,-3,0,0,4,5,0,0,0,4,3,-3,0,0,4,4,0,0,0,4,3,0,0,0,4,2,0,0,0,4,1,0,0,0,4,3,-2,0,0,4,3,-1,0,0,4,1,-2,0,0,4,2,-1,0,0,4,1,-1,0,0,4,5,2,0,0,4,6,2,0,0,4,7,2,0,0,4,3,2,0,0,4,-1,2,0,0,4,-2,2,0,0,4,-2,3,0,0,4,-1,3,0,0,4,0,4,0,0,4,1,4,0,0,4,2,4,0,0,4,3,4,0,0,4,4,4,0,0,4,5,4,0,0,4,6,4,0,0,4,7,4,0,0,4,7,3,0,0,4,6,3,0,0,4,5,3,0,0,4,3,3,0,0,4,-2,4,0,0,4,-1,4,0,0,4,7,5,0,0,4,6,5,0,0,4,5,5,0,0,4,4,5,0,0,4,3,5,0,0,4,2,5,0,0,4,1,5,0,0,4,0,5,0,0,4,-1,5,0,0,4,-2,5,0,0,4,6,-3,0,0,4,6,-2,0,0,4,6,-1,0,0,4,6,0,0,0,4,6,1,0,0,4,2,-2,0,0,4,7,-2,0,0,4,7,-1,0,0,4,7,0,0,0,4,7,1,0,0,4,8,1,0,0,4,8,0,0,0,4,8,-1,0,0,4,8,-2,0,0,4,7,-3,0,0,4,4,-3,0,0,4,-1,1,0,0,4,-2,1,0,0,4,-2,0,0,0,4,-1,0,0,0,4,-1,-1,0,0,4,-2,-1,0,0,4,8,-3,0,0,4,2,-3,0,0,4,1,-3,0,0,4,0,-3,0,0,4,0,-4,0,0,4,1,-4,0,0,4,2,-4,0,0,4,3,-4,0,0,4,4,-4,0,0,4,5,-4,0,0,4,6,-4,0,0,4,4,2,0,0,4,4,3,0,0,4],"Middle":[],"Top":[-3,-6,0,9,2,-3,-5,0,9,2,-3,-4,0,9,2,-3,-3,0,6,2,-3,-2,0,11,2,-3,-1,0,11,2,-3,0,0,11,2,-3,1,0,11,2,-3,2,0,11,2,-3,3,0,11,2,-3,4,0,11,2,-3,5,0,11,2,-3,6,0,6,1,-2,-6,0,9,2,-2,-5,0,9,2,-2,-4,0,9,2,-2,-3,0,9,3,-2,-2,0,2,4,-2,6,0,10,0,-1,-6,0,6,2,-1,-5,0,11,2,-1,-4,0,11,2,-1,-3,0,11,3,-1,-2,0,3,4,-1,6,0,10,0,0,-6,0,9,3,0,-5,0,2,4,0,1,0,0,0,0,2,0,1,2,0,3,0,1,4,0,6,0,10,0,1,-6,0,9,3,1,-5,0,2,4,1,2,0,2,3,1,3,0,2,4,1,6,0,10,0,2,-6,0,9,3,2,-5,0,2,4,2,2,0,3,3,2,3,0,3,4,2,6,0,10,0,3,-6,0,9,3,3,-5,0,2,4,3,6,0,10,0,4,-6,0,9,3,4,-5,0,2,4,4,-2,0,1,3,4,-1,0,1,4,4,6,0,10,0,5,-6,0,9,3,5,-5,0,2,4,5,-2,0,3,3,5,-1,0,3,4,5,6,0,10,0,6,-6,0,9,3,6,-5,0,2,4,6,6,0,10,0,7,-6,0,5,2,7,-5,0,8,3,7,-4,0,1,4,7,6,0,10,0,8,-6,0,9,2,8,-5,0,9,3,8,-4,0,2,4,8,2,0,8,0,8,3,0,8,1,8,4,0,8,1,8,5,0,8,1,8,6,0,5,1,9,-6,0,9,2,9,-5,0,5,2,9,-4,0,8,1,9,-3,0,8,1,9,-2,0,8,1,9,-1,0,8,1,9,0,0,8,1,9,1,0,8,1,9,2,0,5,1,9,3,0,9,2,9,4,0,9,2,9,5,0,9,2,9,6,0,9,2]} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs index c4003b4..53508b7 100644 --- a/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/serialize/DungeonTileInfo.cs @@ -1,14 +1,21 @@ using System.Collections.Generic; using System.Text.Json.Serialization; +using Godot; public class DungeonTileInfo { /// <summary> - /// 导航数据 + /// 导航顶点数据 /// </summary> [JsonInclude] - public List<NavigationPolygonData> NavigationList; + public List<SerializeVector2> NavigationVertices; + + /// <summary> + /// 导航多边形数据 + /// </summary> + [JsonInclude] + public List<int[]> NavigationPolygon; /// <summary> /// 底层数据, 五个一组, 分别为: 地图x坐标, 地图y坐标, 资源id, 图集x坐标, 图集y坐标 diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 6444ff1..ca0c3be 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -377,31 +377,32 @@ //挂载房间导航区域 private void MountNavFromRoomInfo(RoomInfo roomInfo) { - var polygonArray = roomInfo.RoomSplit.TileInfo.NavigationList; - var polygon = new NavigationPolygon(); - var offset = roomInfo.GetOffsetPosition(); - for (var i = 0; i < polygonArray.Count; i++) - { - var navigationPolygonData = polygonArray[i]; - var tempPosArray = navigationPolygonData.GetPoints(); - var polygonPointArray = new Vector2[tempPosArray.Length]; - //这里的位置需要加上房间位置 - for (var j = 0; j < tempPosArray.Length; j++) - { - polygonPointArray[j] = tempPosArray[j] + roomInfo.GetWorldPosition() - offset; - } - polygon.AddOutline(polygonPointArray); - - //存入汇总列表 - var polygonData = new NavigationPolygonData(navigationPolygonData.Type); - polygonData.SetPoints(polygonPointArray); - _roomStaticNavigationList.Add(polygonData); - } - polygon.MakePolygonsFromOutlines(); - var navigationPolygon = new NavigationRegion2D(); - navigationPolygon.Name = "NavigationRegion" + (GetChildCount() + 1); - navigationPolygon.NavigationPolygon = polygon; - World.TileRoot.AddChild(navigationPolygon); + throw new NotImplementedException(); + // var polygonArray = roomInfo.RoomSplit.TileInfo.NavigationList; + // var polygon = new NavigationPolygon(); + // var offset = roomInfo.GetOffsetPosition(); + // for (var i = 0; i < polygonArray.Count; i++) + // { + // var navigationPolygonData = polygonArray[i]; + // var tempPosArray = navigationPolygonData.GetPoints(); + // var polygonPointArray = new Vector2[tempPosArray.Length]; + // //这里的位置需要加上房间位置 + // for (var j = 0; j < tempPosArray.Length; j++) + // { + // polygonPointArray[j] = tempPosArray[j] + roomInfo.GetWorldPosition() - offset; + // } + // polygon.AddOutline(polygonPointArray); + // + // //存入汇总列表 + // var polygonData = new NavigationPolygonData(navigationPolygonData.Type); + // polygonData.SetPoints(polygonPointArray); + // _roomStaticNavigationList.Add(polygonData); + // } + // polygon.MakePolygonsFromOutlines(); + // var navigationPolygon = new NavigationRegion2D(); + // navigationPolygon.Name = "NavigationRegion" + (GetChildCount() + 1); + // navigationPolygon.NavigationPolygon = polygon; + // World.TileRoot.AddChild(navigationPolygon); } //创建门 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs index c8223a6..5398fe2 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Godot; using Godot.Collections; using UI.MapEditorTools; @@ -168,6 +169,7 @@ RenderingServer.FramePostDraw += OnFramePostDraw; var navigationRegion = _editorTileMap.L_NavigationRegion.Instance; + navigationRegion.Visible = false; navigationRegion.NavigationPolygon.AgentRadius = GameConfig.NavigationAgentRadius; navigationRegion.BakeFinished += OnBakeFinished; } @@ -502,6 +504,21 @@ { RunCheckHandler(); } + else + { + //导航网格 + if (tileInfo.NavigationPolygon != null && tileInfo.NavigationVertices != null) + { + var polygon = _editorTileMap.L_NavigationRegion.Instance.NavigationPolygon; + polygon.Vertices = tileInfo.NavigationVertices.Select(v => v.AsVector2()).ToArray(); + foreach (var p in tileInfo.NavigationPolygon) + { + polygon.AddPolygon(p); + } + + OnBakeFinished(); + } + } //聚焦 //MapEditorPanel.CallDelay(0.1f, OnClickCenterTool); //CallDeferred(nameof(OnClickCenterTool), null); @@ -652,7 +669,6 @@ { _generateTimer = _generateInterval; _isGenerateTerrain = false; - _editorTileMap.L_NavigationRegion.Instance.Visible = false; ClearLayer(AutoTopLayer); ClearLayer(AutoMiddleLayer); CloseErrorCell(); @@ -856,7 +872,6 @@ new Vector2(CurrRoomPosition.X, endPos.Y) * GameConfig.TileCellSize }); navigationRegion.BakeNavigationPolygon(false); - navigationRegion.Visible = true; } //设置显示的错误cell, 会标记上红色的闪烁动画 @@ -1046,9 +1061,25 @@ { //存入本地 var tileInfo = CurrRoomSplit.TileInfo; - tileInfo.NavigationList.Clear(); - Debug.LogError("存入导航网格数据"); - //tileInfo.NavigationList.AddRange(_dungeonTileMap.GetPolygonData()); + if (tileInfo.NavigationPolygon == null) + { + tileInfo.NavigationPolygon = new List<int[]>(); + } + else + { + tileInfo.NavigationPolygon.Clear(); + } + if (tileInfo.NavigationVertices == null) + { + tileInfo.NavigationVertices = new List<SerializeVector2>(); + } + else + { + tileInfo.NavigationVertices.Clear(); + } + var polygon = _editorTileMap.L_NavigationRegion.Instance.NavigationPolygon; + tileInfo.NavigationPolygon.AddRange(polygon.Polygons); + tileInfo.NavigationVertices.AddRange(polygon.Vertices.Select(v => new SerializeVector2(v))); tileInfo.Floor.Clear(); tileInfo.Middle.Clear(); tileInfo.Top.Clear(); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs index 7ad311a..f21283a 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreateRoom/MapEditorCreateRoomPanel.cs @@ -144,7 +144,8 @@ roomSplit.RoomInfo = roomInfo; var tileInfo = new DungeonTileInfo(); - tileInfo.NavigationList = new List<NavigationPolygonData>(); + tileInfo.NavigationVertices = new List<SerializeVector2>(); + tileInfo.NavigationPolygon = new List<int[]>(); tileInfo.Floor = new List<int>(); tileInfo.Middle = new List<int>(); tileInfo.Top = new List<int>();