using System; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UIElements; public class MapBuilding : MonoBehaviour { [HideInInspector] public Camera mainCamera; [HideInInspector] public GameObject startPositionObject; [HideInInspector] public float cellSize = 2; [HideInInspector] public MapListener mapListener; private Transform neighbor_container; private bool isBuild = false; private MapListener.RoomPrefabs choose_room_prefab = null; private MapPlacerItem map_placer_item; private MapBuildPlacer build_Placer; private MapListener.RoomPrefabs single_room_dataclass; private MapListener.RoomPrefabs area_room_dataclass; private MapListener.RoomPrefabs cage_room_dataclass; private void Start() { neighbor_container = startPositionObject.transform.Find("neighborContainer"); } private void Update() { this.m_self_on_mouse_down_right_cancel(); // 鼠标右键取消创建 this.self_on_click_down_left_yes(); // 鼠标左键确认创建 } public void m_recv_initialize_room_prefabs_list(List room_dataclass_list) { single_room_dataclass = mm_self_find_room_prefabs_dataclass(HomeMapSO.RoomType.SingleRoom); cage_room_dataclass = mm_self_find_room_prefabs_dataclass(HomeMapSO.RoomType.CageRoom); area_room_dataclass = mm_self_find_room_prefabs_dataclass(HomeMapSO.RoomType.AreaRoom); return; MapListener.RoomPrefabs mm_self_find_room_prefabs_dataclass(HomeMapSO.RoomType _room_type) { return room_dataclass_list.Find(item => item.roomType == _room_type); } } private void self_on_click_down_left_yes() { if (!Input.GetMouseButtonDown(0)) return; // 鼠标左键按下 if (!isBuild) return; // 当前不在创建状态 if (!build_Placer.m_recv_placer_is_snap_to_grid()) return; // 是否正在吸附单元格 if (build_Placer.m_recv_is_trigger_with_has_build()) return; // 是否与已有建筑物有交集 Vector2Int snap_grid_position = build_Placer.m_recv_placer_get_snap_grid_position_for_SO(); mapListener.m_send_SOMap_create_a_room(snap_grid_position, choose_room_prefab.prefab); this.mm_self__destroy_temp_grid_and_variable(); // 销毁临时格子 print("hello"); } private void m_self_on_mouse_down_right_cancel() // 鼠标右键取消创建 { if (!Input.GetMouseButtonDown(1)) return; // 鼠标右键按下 if (!isBuild) return; // 当前不在创建状态 this.mm_self__destroy_temp_grid_and_variable(); // 销毁临时格子 return; } private void mm_self__destroy_temp_grid_and_variable() { foreach (Transform child in neighbor_container) // 清理方向格子, 移除容器下所有格子 { Destroy(child.gameObject); } isBuild = false; // 取消创建状态 choose_room_prefab = null; // 清理已选择房间的预制体 Destroy(build_Placer.gameObject); } private void m_self_create_target_room_follow_mouse(GameObject roomPrefab) // 生成跟随鼠标移动的建筑物 { Vector3 mouse_world_position = mainCamera.ScreenToWorldPoint(Input.mousePosition); mouse_world_position.z = 0; GameObject build_target_room = Instantiate(roomPrefab, mouse_world_position, Quaternion.identity); build_target_room.name = "BuildingPreview"; build_target_room.transform.SetParent(startPositionObject.transform); build_target_room.layer = LayerMask.NameToLayer("UseBuild"); mm_self__create_target_room(build_target_room); // 生成目标房间 return; void mm_self__create_target_room(GameObject _build_room) // 挂载脚本 { build_Placer = _build_room.AddComponent(); build_Placer.startPositionObject = startPositionObject; build_Placer.cellSize = cellSize; build_Placer.mainCamera = mainCamera; build_Placer.mapListener = mapListener; mmm_self__set_placer_sort_layer("UseBuild"); } void mmm_self__set_placer_sort_layer(string layerName) // 设置排序图层 { Transform placer_sprite_render = build_Placer.transform.Find("RenderContainer/RoomSpriteRender"); Transform child_ui = build_Placer.transform.Find("RenderContainer/UI"); Transform render_container = build_Placer.transform.Find("RenderContainer"); // render_container.gameObject.SetActive(false); placer_sprite_render.GetComponent().sortingLayerName = layerName; foreach (Transform child in child_ui.transform) { if (!child.GetComponent()) continue; child.GetComponent().sortingLayerName = layerName; } } } private void m_self_create_direction_grid() // 创建可建造区域范围的格子 { List neighbor_position_list = new List(); // 存放可建造区域范围的格子坐标 List direction_list = new List // 存放可建造区域范围的格子坐标 { new Vector2Int(0, 1), new Vector2Int(0, -1), new Vector2Int(-1, 0), new Vector2Int(1, 0) }; List has_room_position_list = mapListener.m_send_SOMap_get_position_by_has_room(); // 收集已有房间的格子坐标 foreach (var has_room_position in has_room_position_list) // 从已有房间的坐标推导出方向坐标列表 { foreach (var dir_position in direction_list) { var neighbor_position = has_room_position + dir_position; if (neighbor_position.y >= 1) continue; // 地面上的空间不生成 if (has_room_position_list.Contains(neighbor_position)) continue; // 已有房间的格子不生成 neighbor_position_list.Add(neighbor_position); } } foreach (var _position in neighbor_position_list) // 生成四周的空间预制件 { mm_self_create_a_area_room(_position); } return; GameObject mm_self_create_a_area_room(Vector2Int __position) { GameObject _room = Instantiate(area_room_dataclass.prefab, position: (startPositionObject.transform.position + new Vector3(__position.x, __position.y, 0) * cellSize), rotation: Quaternion.identity); neighbor_container = startPositionObject.transform.Find("neighborContainer"); _room.name = $"AreaGrid_{__position.x}.{__position.y}"; _room.transform.SetParent(neighbor_container); MapBuildableCell roomScriptsComponent = _room.GetComponent(); roomScriptsComponent.m_set_grid_position(__position); return _room; } } public void m_ui_button_start_build() { if (isBuild) return; choose_room_prefab = single_room_dataclass; map_placer_item = choose_room_prefab.prefab.GetComponent(); m_self_create_direction_grid(); // 在已有建筑物四周生成可建造的格子 m_self_create_target_room_follow_mouse(choose_room_prefab.prefab); // 生成一个跟随鼠标移动的建筑物 isBuild = true; } public void m_ui_button_start_build_two_cell() { if (isBuild) return; choose_room_prefab = cage_room_dataclass; map_placer_item = choose_room_prefab.prefab.GetComponent(); m_self_create_direction_grid(); // 在已有建筑物四周生成可建造的格子 m_self_create_target_room_follow_mouse(choose_room_prefab.prefab); isBuild = true; } }