using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class MapBuildPlacer : MonoBehaviour { [HideInInspector] public GameObject startPositionObject; // 坐标起始点 [HideInInspector] public float cellSize = 2; // 单元格大小 [HideInInspector] public Camera mainCamera; [Tooltip("可建造格子的图层")] public LayerMask buildableCellLayer; private Color sprite_render_color; private SpriteRenderer sprite_render_children; private MapBuildableCell adsorb_component; private bool is_trigger_with_has_build = false; private SpriteRenderer stopUI_sprite_render; private bool isSnap = false; private GameObject render_container; private void Start() { render_container = transform.Find("RenderContainer").gameObject; sprite_render_children = transform.Find("RenderContainer/RoomSpriteRender").GetComponent(); sprite_render_color = sprite_render_children.color; stopUI_sprite_render = transform.Find("RenderContainer/UI/StopUI").GetComponent(); } private void Update() { self_move_with_mouse_with_ray(); self_set_snap_response(); } private void self_set_snap_response() { render_container.SetActive(isSnap); } // 跟随鼠标移动使用射线检测 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: buildableCellLayer); if (hit.collider) { // 吸附到格子坐标 adsorb_component = hit.collider.GetComponent(); Vector3 adsorb_position = startPositionObject.transform.position + adsorb_component.m_get_grid_position_with_vector3() * cellSize; transform.position = adsorb_position; isSnap = true; // 判断是否与以建造的建筑物触发器接触 if (is_trigger_with_has_build == false) { sprite_render_children.color = sprite_render_color; stopUI_sprite_render.enabled = false; } } else { // 鼠标不在格子上时触发, 还原默认状态 if (adsorb_component) { stopUI_sprite_render.enabled = true; adsorb_component = null; } isSnap = false; transform.position = mouse_world_position; sprite_render_children.color = new Color32(166, 73, 73, 215); } } public bool m_get_placer_is_snap() => isSnap; // trigger 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 OnTriggerEnter2D(Collider2D other) { self_on_trigger_event(other, true); } private void OnTriggerExit2D(Collider2D other) { self_on_trigger_event(other, false); } }