107 lines
3.5 KiB
C#
Raw Normal View History

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