From 36e656cf46b70a476df48f3c47eb718590d59970 Mon Sep 17 00:00:00 2001 From: Cold-Mint Date: Fri, 19 Jul 2024 22:25:55 +0800 Subject: [PATCH] =?UTF-8?q?Connect=20room=20gaps=20using=20NavigationLink2?= =?UTF-8?q?D.=20=E4=BD=BF=E7=94=A8NavigationLink2D=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=88=BF=E9=97=B4=E9=97=B4=E9=9A=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/map/MapGenerator.cs | 15 ++--- scripts/map/dateBean/RoomPlacementData.cs | 11 +++- scripts/map/dateBean/RoomSlot.cs | 26 ++++++++ scripts/map/room/Room.cs | 2 + .../PatchworkRoomPlacementStrategy.cs | 59 +++++++++++++++---- 5 files changed, 92 insertions(+), 21 deletions(-) diff --git a/scripts/map/MapGenerator.cs b/scripts/map/MapGenerator.cs index dc5a91b..a2b6b44 100644 --- a/scripts/map/MapGenerator.cs +++ b/scripts/map/MapGenerator.cs @@ -241,7 +241,7 @@ public static class MapGenerator //If the room injection processor cannot be found, a print error occurs. //如果找不到房间注入处理器,那么打印错误。 LogCat.LogErrorWithFormat("room_injection_processor_does_not_exist", - LogCat.LogLabel.Default, LogCat.UploadFormat,injectionProcessorData.Id); + LogCat.LogLabel.Default, LogCat.UploadFormat, injectionProcessorData.Id); continue; } @@ -278,7 +278,7 @@ public static class MapGenerator if (roomPlacementData == null) { LogCat.LogWithFormat("failed_to_calculate_the_room_location", LogCat.LogLabel.Default, - LogCat.UploadFormat,roomNodeData.Id); + LogCat.UploadFormat, roomNodeData.Id); continue; } @@ -317,25 +317,26 @@ public static class MapGenerator //The input parameters are incomplete. //输入参数不全。 if (_roomPlacementStrategy == null || _mapRoot == null || string.IsNullOrEmpty(roomNodeDataId) || - roomPlacementData.Room == null) + roomPlacementData.NewRoom == null) { return false; } if (dictionary.ContainsKey(roomNodeDataId)) { - LogCat.LogWithFormat("place_existing_rooms", LogCat.LogLabel.Default, LogCat.UploadFormat,roomNodeDataId); + LogCat.LogWithFormat("place_existing_rooms", LogCat.LogLabel.Default, LogCat.UploadFormat, roomNodeDataId); return false; } if (!await _roomPlacementStrategy.PlaceRoom(_mapRoot, roomPlacementData)) { - LogCat.LogWarningWithFormat("room_placement_failed", LogCat.UploadFormat,LogCat.LogLabel.Default, roomNodeDataId); + LogCat.LogWarningWithFormat("room_placement_failed", LogCat.UploadFormat, LogCat.LogLabel.Default, + roomNodeDataId); return false; } - dictionary.Add(roomNodeDataId, roomPlacementData.Room); - LogCat.LogWithFormat("room_placement_information", LogCat.LogLabel.Default, LogCat.UploadFormat,roomNodeDataId, + dictionary.Add(roomNodeDataId, roomPlacementData.NewRoom); + LogCat.LogWithFormat("room_placement_information", LogCat.LogLabel.Default, LogCat.UploadFormat, roomNodeDataId, roomPlacementData.Position.ToString()); return true; } diff --git a/scripts/map/dateBean/RoomPlacementData.cs b/scripts/map/dateBean/RoomPlacementData.cs index 854a397..bda725e 100644 --- a/scripts/map/dateBean/RoomPlacementData.cs +++ b/scripts/map/dateBean/RoomPlacementData.cs @@ -14,18 +14,25 @@ public class RoomPlacementData /// 放置的位置 /// public Vector2? Position { get; set; } + /// /// Place the room template /// 放置的房间模板 /// - public Room? Room { get; set; } + public Room? NewRoom { get; set; } + /// + /// Parent room + /// 父级房间 + /// + public Room? ParentRoom { get; set; } + /// /// Parent room slot /// 父级房间的插槽 /// public RoomSlot? ParentRoomSlot { get; set; } - + /// /// A slot for the new room /// 新房间的插槽 diff --git a/scripts/map/dateBean/RoomSlot.cs b/scripts/map/dateBean/RoomSlot.cs index 3f050ec..a948b19 100644 --- a/scripts/map/dateBean/RoomSlot.cs +++ b/scripts/map/dateBean/RoomSlot.cs @@ -16,8 +16,34 @@ public class RoomSlot /// public bool Matched { get; set; } + /// + /// The starting position of the room slot + /// 房间插槽的开始位置 + /// + /// + ///As opposed to a tile map. Convert to local location please call + ///相对于瓦片地图而言的。转换为本地位置请调用 + /// public Vector2I StartPosition { get; set; } + + /// + /// The midpoint of the slot + /// 插槽的中点位置 + /// + /// + ///As opposed to a tile map. Convert to local location please call + ///相对于瓦片地图而言的。转换为本地位置请调用 + /// + public Vector2I MidpointPosition { get; set; } + /// + /// The end position of the room slot + /// 房间插槽的结束位置 + /// + /// + ///As opposed to a tile map. Convert to local location please call + ///相对于瓦片地图而言的。转换为本地位置请调用 + /// public Vector2I EndPosition { get; set; } /// diff --git a/scripts/map/room/Room.cs b/scripts/map/room/Room.cs index 8a497db..73b89db 100644 --- a/scripts/map/room/Room.cs +++ b/scripts/map/room/Room.cs @@ -194,10 +194,12 @@ public class Room //转为瓦片地图的坐标(中点) var tileMapStartPosition = tileMap.LocalToMap(startPosition); var tileMapEndPosition = tileMap.LocalToMap(endPosition); + var midpointPosition = tileMap.LocalToMap(midpointOfRoomSlots); var roomSlot = new RoomSlot { EndPosition = tileMapEndPosition, StartPosition = tileMapStartPosition, + MidpointPosition = midpointPosition, //Calculate the orientation of the slot (the midpoint of the room is the origin, the vector pointing to the midpoint of the slot) //计算槽位的方向(房间中点为原点,指向槽位中点的向量) DistanceToMidpointOfRoom = CoordinateUtils.VectorToOrientationArray(midpoint, midpointOfRoomSlots) diff --git a/scripts/map/roomPlacer/PatchworkRoomPlacementStrategy.cs b/scripts/map/roomPlacer/PatchworkRoomPlacementStrategy.cs index d6e138c..c7e77d5 100644 --- a/scripts/map/roomPlacer/PatchworkRoomPlacementStrategy.cs +++ b/scripts/map/roomPlacer/PatchworkRoomPlacementStrategy.cs @@ -98,19 +98,53 @@ public class PatchworkRoomPlacementStrategy : IRoomPlacementStrategy public Task PlaceRoom(Node mapRoot, RoomPlacementData roomPlacementData) { - if (roomPlacementData.Room == null || roomPlacementData.Position == null) + if (roomPlacementData.NewRoom == null || roomPlacementData.Position == null) { return Task.FromResult(false); } - if (roomPlacementData.Room.RootNode == null) + if (roomPlacementData.NewRoom.RootNode == null) { return Task.FromResult(false); } - var rootNode = roomPlacementData.Room.RootNode; - mapRoot.AddChild(rootNode); - rootNode.Position = roomPlacementData.Position.Value; + var newRootRootNode = roomPlacementData.NewRoom.RootNode; + mapRoot.AddChild(newRootRootNode); + newRootRootNode.Position = roomPlacementData.Position.Value; + //Place navigation Link + //放置导航Link + Vector2? navigationLink2DStartPosition = null; + if (roomPlacementData is { ParentRoom: not null, ParentRoomSlot: not null }) + { + var parentRoomTileMap = roomPlacementData.ParentRoom.TileMap; + var parentRoomRootNode = roomPlacementData.ParentRoom.RootNode; + if (parentRoomTileMap != null && parentRoomRootNode != null) + { + navigationLink2DStartPosition = parentRoomRootNode.Position + + parentRoomTileMap.MapToLocal(roomPlacementData.ParentRoomSlot + .EndPosition); + } + } + + Vector2? navigationLink2DEndPosition = null; + if (roomPlacementData.NewRoomSlot != null) + { + var newRoomTileMap = roomPlacementData.NewRoom.TileMap; + if (newRoomTileMap != null) + { + navigationLink2DEndPosition = newRootRootNode.Position + + newRoomTileMap.MapToLocal(roomPlacementData.NewRoomSlot.EndPosition); + } + } + + if (navigationLink2DStartPosition != null && navigationLink2DEndPosition != null) + { + var navigationLink2D = new NavigationLink2D(); + navigationLink2D.StartPosition = navigationLink2DStartPosition.Value; + navigationLink2D.EndPosition = navigationLink2DEndPosition.Value; + mapRoot.AddChild(navigationLink2D); + } + return Task.FromResult(true); } @@ -142,7 +176,7 @@ public class PatchworkRoomPlacementStrategy : IRoomPlacementStrategy //Saves all data in the room template that matches the parent room. //保存房间模板内所有与父房间匹配的数据。 - var useableRoomPlacementData = new List(); + var usableRoomPlacementData = new List(); foreach (var roomRes in roomResArray) { var newRoom = RoomFactory.CreateRoom(roomRes, newRoomNodeData.EnterRoomEventHandlerId, @@ -168,22 +202,23 @@ public class PatchworkRoomPlacementStrategy : IRoomPlacementStrategy if (position == null) continue; var roomPlacementData = new RoomPlacementData { - Room = newRoom, + NewRoom = newRoom, + ParentRoom = parentRoomNode, Position = position, ParentRoomSlot = mainRoomSlot, NewRoomSlot = newRoomSlot }; - useableRoomPlacementData.Add(roomPlacementData); + usableRoomPlacementData.Add(roomPlacementData); } - if (useableRoomPlacementData.Count == 0) + if (usableRoomPlacementData.Count == 0) { return null; } else { - var index = randomNumberGenerator.Randi() % useableRoomPlacementData.Count; - var roomPlacementData = useableRoomPlacementData[(int)index]; + var index = randomNumberGenerator.Randi() % usableRoomPlacementData.Count; + var roomPlacementData = usableRoomPlacementData[(int)index]; //Be sure to mark its slot as a match when you use it. //一定要在使用时,将其插槽标记为匹配。 if (roomPlacementData.ParentRoomSlot != null) @@ -217,7 +252,7 @@ public class PatchworkRoomPlacementStrategy : IRoomPlacementStrategy var index = randomNumberGenerator.Randi() % roomResArray.Length; var roomPlacementData = new RoomPlacementData { - Room = RoomFactory.CreateRoom(roomResArray[index], startRoomNodeData.EnterRoomEventHandlerId, + NewRoom = RoomFactory.CreateRoom(roomResArray[index], startRoomNodeData.EnterRoomEventHandlerId, startRoomNodeData.ExitRoomEventHandlerId), Position = Vector2.Zero };