diff --git a/DungeonShooting_Godot/resource/map/tiledata/Room1.json b/DungeonShooting_Godot/resource/map/tiledata/Room1.json index e7c7b48..d96be35 100644 --- a/DungeonShooting_Godot/resource/map/tiledata/Room1.json +++ b/DungeonShooting_Godot/resource/map/tiledata/Room1.json @@ -14,5 +14,5 @@ "End": 304 } ], - "Navigation": null + "NavigationList": [] } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRoomInfo.cs b/DungeonShooting_Godot/src/framework/map/DungeonRoomInfo.cs index 03b67ed..8a661bc 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonRoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonRoomInfo.cs @@ -29,5 +29,5 @@ /// 导航数据 /// </summary> [JsonInclude] - public NavigationPolygonData Navigation; + public List<NavigationPolygonData> NavigationList; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs index 04edd8a..60dd0a1 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs @@ -674,6 +674,7 @@ roomInfo.Position = new SerializeVector2(position); roomInfo.Size = new SerializeVector2(size); roomInfo.DoorAreaInfos = doorConfigs; + roomInfo.NavigationList = new List<NavigationPolygonData>(); var config = new JsonSerializerOptions(); config.WriteIndented = true; @@ -721,13 +722,15 @@ { // 下面这句代码在 Godot4.0_rc2的编辑器模式下, 重载脚本会导致编辑器一直报错!, 所以暂时先用下面的方法 //var roomInfo = JsonSerializer.Deserialize<DungeonRoomInfo>(text); - + var obj = Json.ParseString(text).AsGodotDictionary(); var roomInfo = new DungeonRoomInfo(); var position = obj["Position"].AsGodotDictionary(); roomInfo.Position = new SerializeVector2(position["X"].AsInt32(), position["Y"].AsInt32()); + var size = obj["Size"].AsGodotDictionary(); roomInfo.Size = new SerializeVector2(size["X"].AsInt32(), size["Y"].AsInt32()); + var doorAreaInfos = obj["DoorAreaInfos"].AsGodotArray<Variant>(); roomInfo.DoorAreaInfos = new List<DoorAreaInfo>(); foreach (var item in doorAreaInfos) @@ -740,6 +743,25 @@ roomInfo.DoorAreaInfos.Add(doorInfo); } + var navigationArray = obj["NavigationList"].AsGodotArray<Variant>(); + roomInfo.NavigationList = new List<NavigationPolygonData>(); + for (var i = 0; i < navigationArray.Count; i++) + { + var navigation = navigationArray[i].AsGodotDictionary(); + var polygonData = new NavigationPolygonData(); + + polygonData.Type = (NavigationPolygonType)navigation["Type"].AsInt32(); + polygonData.Points = new List<SerializeVector2>(); + var pointArray = navigation["Points"].AsGodotArray<Variant>(); + for (var j = 0; j < pointArray.Count; j++) + { + var point = pointArray[j].AsGodotDictionary(); + polygonData.Points.Add(new SerializeVector2(point["X"].AsInt32(), point["Y"].AsInt32())); + } + + roomInfo.NavigationList.Add(polygonData); + } + return roomInfo; } #endif