SummerGame/Assets/Scripts/FurnitureController.cs

118 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using UnityEngine.EventSystems;
public class FurnitureBuilder : MonoBehaviour
{
public enum EditTool { Move, Rotate }
[Header("Настройки")]
public GameObject currentPrefab;
public LayerMask floorLayer;
[SerializeField] private GameObject shopPanel;
[Header("Режим редактирования (UI)")]
[SerializeField] private GameObject editPanel;
public float rotationSpeed = 5f;
// Внутренние переменные состояния
private GameObject _activeFurniture;
private FurnitureObject _activeFurnitureScript; // <--- ИЗМЕНИЛИ ИМЯ ЗДЕСЬ
private EditTool _currentTool = EditTool.Move;
private Camera _cam;
private void Start()
{
_cam = Camera.main;
currentPrefab = null;
editPanel.SetActive(false);
}
void Update()
{
if (_activeFurniture != null)
{
HandleEditing();
}
else if (currentPrefab != null)
{
if (Input.GetMouseButtonDown(0) && !shopPanel.activeSelf && !IsPointerOverUI())
{
TryPlaceFurniture();
}
}
}
private void HandleEditing()
{
Vector3 screenPos = _cam.WorldToScreenPoint(_activeFurniture.transform.position);
editPanel.transform.position = screenPos + new Vector3(0, 100, 0);
if (Input.GetMouseButton(0) && !IsPointerOverUI())
{
if (_currentTool == EditTool.Move)
{
Ray ray = _cam.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, 100f, floorLayer))
{
_activeFurniture.transform.position = hit.point;
}
}
else if (_currentTool == EditTool.Rotate)
{
float rotX = Input.GetAxis("Mouse X");
_activeFurniture.transform.Rotate(Vector3.up, -rotX * rotationSpeed);
}
}
}
void TryPlaceFurniture()
{
Ray ray = _cam.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, 100f, floorLayer))
{
_activeFurniture = Instantiate(currentPrefab, hit.point, Quaternion.identity);
// <--- ИЗМЕНИЛИ ИМЯ ЗДЕСЬ
_activeFurnitureScript = _activeFurniture.GetComponent<FurnitureObject>();
_activeFurnitureScript.SetEditMode(true);
editPanel.SetActive(true);
_currentTool = EditTool.Move;
currentPrefab = null;
}
}
public void SelectMoveTool() { _currentTool = EditTool.Move; }
public void SelectRotateTool() { _currentTool = EditTool.Rotate; }
public void ConfirmPlacement()
{
if (_activeFurnitureScript != null && _activeFurnitureScript.IsPlacementValid)
{
_activeFurnitureScript.SetEditMode(false);
_activeFurniture = null;
_activeFurnitureScript = null;
editPanel.SetActive(false);
}
else
{
Debug.Log("Нельзя поставить сюда! Мебель пересекается с препятствием.");
}
}
public void SelectFurnitureAndCloseShop(GameObject prefabToSelect)
{
currentPrefab = prefabToSelect;
shopPanel.SetActive(false);
}
private bool IsPointerOverUI()
{
if (EventSystem.current != null)
{
if (EventSystem.current.IsPointerOverGameObject()) return true;
if (Input.touchCount > 0 && EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) return true;
}
return false;
}
}