96 lines
3.8 KiB
C#
Raw Normal View History

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class MapBuilding : MonoBehaviour
{
2025-10-09 04:03:32 +08:00
[Tooltip("Camera")] public Camera mainCamera;
[Tooltip("地图SO数据")] public HomeMapSO SO_HomeMap;
[Tooltip("坐标起始点")] public GameObject startPositionObject;
2025-10-08 20:48:27 +08:00
[Tooltip("可建造区域单元格的预制件")] public GameObject promptAreaPrefab;
[Tooltip("测试房间")] public GameObject testRoomPrefab;
2025-10-09 04:03:32 +08:00
[Tooltip("测试房间2")] public GameObject testRoomPrefabTwo;
[Tooltip("单元格大小")] public int cellSize = 2;
// private function
private void create_direction_grid()
{
// 需要创建格子的坐标
List<Vector2Int> neighbor_position_list = new List<Vector2Int>();
// 方向列表:上下左右
List<Vector2Int> direction_list = new List<Vector2Int>
{
new Vector2Int(1, 0), // 右
new Vector2Int(0, 1), // 上
new Vector2Int(-1, 0), // 左
new Vector2Int(0, -1) // 下
};
// 收集已有房间的格子坐标
List<Vector2Int> has_room_position_list = SO_HomeMap.get_position_by_has_room();
// 从已有房间的坐标推导出方向坐标列表
foreach (var hr_position in has_room_position_list)
{
foreach (var dir_position in direction_list)
{
var neighbor_position = hr_position + dir_position;
if (neighbor_position.x >= 1) continue; // 地面上的空间不生成
if (!has_room_position_list.Contains(neighbor_position))
{
neighbor_position_list.Add(neighbor_position);
}
}
}
// 生成四周的空间预制件
foreach (var _position in neighbor_position_list)
{
GameObject room = Instantiate<GameObject>(
2025-10-08 20:48:27 +08:00
promptAreaPrefab,
position: (startPositionObject.transform.position +
new Vector3(_position.y, _position.x, 0) * cellSize),
rotation: Quaternion.identity);
Transform neighbor_container = startPositionObject.transform.Find("neighborContainer");
room.name = $"Cell_{_position.x}.{_position.y}";
room.transform.SetParent(neighbor_container);
2025-10-09 04:03:32 +08:00
MapBuildableCell roomScriptsComponent = room.GetComponent<MapBuildableCell>();
roomScriptsComponent.set_grid_position(_position);
}
}
2025-10-08 20:48:27 +08:00
// 生成跟随鼠标移动的建筑物
2025-10-09 04:03:32 +08:00
private void create_room_follow_mouse(GameObject roomPrefab)
2025-10-08 20:48:27 +08:00
{
2025-10-09 04:03:32 +08:00
Vector3 mouse_world_position = mainCamera.ScreenToWorldPoint(Input.mousePosition);
2025-10-08 20:48:27 +08:00
mouse_world_position.z = 0;
2025-10-09 04:03:32 +08:00
GameObject current_test_room = Instantiate(roomPrefab,
2025-10-08 20:48:27 +08:00
mouse_world_position, Quaternion.identity);
current_test_room.name = "BuildingPreview";
current_test_room.transform.SetParent(startPositionObject.transform);
2025-10-09 04:03:32 +08:00
current_test_room.layer = LayerMask.NameToLayer("UseBuild");
2025-10-08 20:48:27 +08:00
2025-10-09 04:03:32 +08:00
// 挂载脚本
MapBuildPlacer placer = current_test_room.GetComponent<MapBuildPlacer>();
2025-10-08 20:48:27 +08:00
placer.SO_HomeMap = SO_HomeMap;
placer.startPositionObject = startPositionObject;
placer.cellSize = cellSize;
2025-10-09 04:03:32 +08:00
placer.mainCamera = mainCamera;
// 挂载脚本
2025-10-08 20:48:27 +08:00
}
// UI function
public void m_button_start_build()
{
2025-10-09 04:03:32 +08:00
create_direction_grid(); // 在已有建筑物四周生成可建造的格子
create_room_follow_mouse(testRoomPrefab); // 生成一个跟随鼠标移动的建筑物
}
public void m_button_start_build_two_cell()
{
create_direction_grid(); // 在已有建筑物四周生成可建造的格子
create_room_follow_mouse(testRoomPrefabTwo);
}
}