using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.UIElements; public class MapBuildPlacer : MonoBehaviour { [HideInInspector] public GameObject startPositionObject; // 坐标起始点 [HideInInspector] public float cellSize = 2; // 单元格大小 [HideInInspector] public Camera mainCamera; [HideInInspector] public MapListener mapListener; private Collider2D hit_oldest; private Color sprite_render_color; private readonly Color sprite_render_unable_color = new Color32(166, 73, 73, 255); private SpriteRenderer sprite_render_children; private MapBuildableCell snap_grid; // 吸附的格子 private bool is_trigger_with_has_build = false; private bool isSnap = false; private GameObject render_container; private Vector2Int snap_grid_position_for_SO = Vector2Int.zero; // SO的坐标数据 , 不是世界坐标 private Transform UIContainer; private LayerMask buildable_layer; private MapPlacerItem map_placer_item; private void Awake() { gameObject.AddComponent().isKinematic = true; map_placer_item = gameObject.GetComponent(); } private void Start() { render_container = transform.Find("RenderContainer").gameObject; sprite_render_children = transform.Find("RenderContainer/RoomSpriteRender").GetComponent(); UIContainer = transform.Find("RenderContainer/UI"); sprite_render_color = sprite_render_children.color; foreach (Transform ui_child in UIContainer.transform) { ui_child.GetComponent().color = Color.green; } buildable_layer = 1 << LayerMask.NameToLayer("BuildableCell"); } private void Update() { // render_container.SetActive(); // 设置吸附状态的响应 self_move_with_mouse_with_ray(); } // private void self__trigger_with_already_build(MapBuildableCell snap_grid) // { // switch (buildRoomType) // { // case HomeMapSO.RoomType.CageRoom: // Vector2Int snap_position_ = _self_get_snap_position(); // // is_trigger_with_has_build = // // mapListener.m_send_SOMap_get_placeholder_area_has_room(snap_position_, buildRoomType); // break; // default: // break; // } // // Vector2Int _self_get_snap_position() => snap_grid.m_recv_get_grid_position_with_vector2(); // } // 跟随鼠标移动使用射线检测 private void self_move_with_mouse_with_ray() { Vector3 mouse_world_position = mainCamera.ScreenToWorldPoint(Input.mousePosition); mouse_world_position.z = 0; RaycastHit2D hit = Physics2D.Raycast( origin: mouse_world_position, direction: Vector2.zero, distance: 0.1f, layerMask: buildable_layer); if (hit.collider) // 射线检测到格子, 吸附到格子坐标 { if (hit.collider != hit_oldest) // 射线检测到的格子发生变化 { snap_grid = hit.collider.GetComponent(); hit_oldest = hit.collider; } mm_self_gameobject_snap_move(); } else { mm_self_gameobject_free_move(); } return; void mm_self_gameobject_snap_move() // 射线检测到格子, 吸附到格子坐标 { Vector3 snap_grid_position = startPositionObject.transform.position + snap_grid.m_recv_get_grid_position_with_vector3() * cellSize; transform.position = snap_grid_position; isSnap = true; snap_grid_position_for_SO = snap_grid.m_recv_get_grid_position_with_vector2(); is_trigger_with_has_build = mapListener.m_send_SOMap_trigger_placeholder_area_has_room( snap_grid_position_for_SO, map_placer_item ); sprite_render_children.color = is_trigger_with_has_build ? sprite_render_unable_color : sprite_render_color; // 更改SR颜色 } void mm_self_gameobject_free_move() // 射线没有检测到格子, 自由移动 { sprite_render_children.color = sprite_render_unable_color; // 更改sr为不可建造的颜色 transform.position = mouse_world_position; isSnap = false; is_trigger_with_has_build = true; snap_grid_position_for_SO = Vector2Int.zero; } } public Vector2Int m_recv_placer_get_snap_grid_position_for_SO() => snap_grid_position_for_SO; public bool m_recv_placer_is_snap_to_grid() => isSnap; public bool m_recv_is_trigger_with_has_build() => is_trigger_with_has_build; // private void self_on_trigger_event(Collider2D other, bool status) // { // // 检测是否与某个图层的碰撞器相交 // if (other.gameObject.layer == LayerMask.NameToLayer("AlreadyBuild")) // { // is_trigger_with_has_build = status; // } // } // private void OnTriggerStay2D(Collider2D other) // { // self_on_trigger_event(other, true); // } // // private void OnTriggerExit2D(Collider2D other) // { // self_on_trigger_event(other, false); // } }