2025-10-12 02:32:13 +08:00

138 lines
4.9 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
public class MapBuildPlacer : MonoBehaviour
{
[HideInInspector] public GameObject startPositionObject; // 坐标起始点
[HideInInspector] public float cellSize = 2; // 单元格大小
[HideInInspector] public Camera mainCamera;
[HideInInspector] public HomeMapSO.RoomType buildRoomType = HomeMapSO.RoomType.None;
[HideInInspector] public MapListener mapListener;
private Color sprite_render_color;
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 Rigidbody2D rigidbody_2d;
private LayerMask buildable_layer;
private void Awake()
{
rigidbody_2d = gameObject.AddComponent<Rigidbody2D>();
rigidbody_2d.isKinematic = true;
}
private void Start()
{
render_container = transform.Find("RenderContainer").gameObject;
sprite_render_children = transform.Find("RenderContainer/RoomSpriteRender").GetComponent<SpriteRenderer>();
UIContainer = transform.Find("RenderContainer/UI");
sprite_render_color = sprite_render_children.color;
foreach (Transform ui_child in UIContainer.transform)
{
ui_child.GetComponent<SpriteRenderer>().color = Color.green;
}
buildable_layer = 1 << LayerMask.NameToLayer("BuildableCell");
}
private void Update()
{
render_container.SetActive(isSnap); // 设置吸附状态的响应
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)
{
// 射线检测到格子, 吸附到格子坐标
snap_grid = hit.collider.GetComponent<MapBuildableCell>();
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();
if (is_trigger_with_has_build)
{
sprite_render_children.color = new Color32(166, 73, 73, 215); // 更改sr为不可建造的颜色
}
else
{
// 没有与已存在的建筑物接触
sprite_render_children.color = sprite_render_color; // 还原初始颜色
}
}
else
{
// 射线没有检测到格子, 自由移动
sprite_render_children.color = new Color32(166, 73, 73, 215); // 更改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);
// }
}