mirror of
https://github.com/DerTyp7/harvestdale-unity.git
synced 2025-10-29 12:52:07 +01:00
152 lines
3.7 KiB
C#
152 lines
3.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Tilemaps;
|
|
|
|
public class GridBuildingSystem : MonoBehaviour
|
|
{
|
|
|
|
public PlaceableObject TESTPO; //! DEBUG
|
|
public Tilemap collisionTm;
|
|
public TileBase occupiedTile;
|
|
|
|
private PlaceableObject placeableObject;
|
|
private GameObject newBuildingObject;
|
|
private bool isDemolishing = false;
|
|
|
|
private void Update()
|
|
{
|
|
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
|
|
int snappedX = Mathf.RoundToInt(mousePosition.x);
|
|
int snappedY = Mathf.RoundToInt(mousePosition.y);
|
|
Vector3Int snappedMousePosition = new Vector3Int(snappedX, snappedY, 0);
|
|
|
|
if (Input.GetKeyDown(KeyCode.N))
|
|
{
|
|
isDemolishing = !isDemolishing;
|
|
Debug.Log(isDemolishing);
|
|
}
|
|
|
|
if (!isDemolishing)
|
|
{
|
|
//! DEBUG
|
|
if (Input.GetKeyDown(KeyCode.B))
|
|
{
|
|
SelectBuilding(TESTPO);
|
|
}
|
|
|
|
if (Input.GetMouseButtonDown(1))
|
|
{
|
|
UnselectBuilding();
|
|
}
|
|
|
|
if (newBuildingObject)
|
|
{
|
|
Cursor.visible = false;
|
|
|
|
newBuildingObject.transform.position = snappedMousePosition;
|
|
bool isOccupied = IsOccupied(snappedMousePosition, placeableObject.GetSizeVector());
|
|
|
|
if (isOccupied)
|
|
{
|
|
newBuildingObject.GetComponent<SpriteRenderer>().color = Color.red;
|
|
}
|
|
else
|
|
{
|
|
newBuildingObject.GetComponent<SpriteRenderer>().color = Color.white;
|
|
}
|
|
|
|
if (Input.GetMouseButtonDown(0) && !isOccupied)
|
|
{
|
|
newBuildingObject.GetComponent<Building>().Place();
|
|
newBuildingObject.GetComponent<Building>().placeableObject = placeableObject;
|
|
OccupyTiles(snappedMousePosition, placeableObject.GetSizeVector());
|
|
newBuildingObject = null;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Cursor.visible = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (Input.GetMouseButtonDown(0))
|
|
{
|
|
Building demoBuilding = BuildingManager.GetBuildingByGridPosition(snappedMousePosition);
|
|
|
|
if (demoBuilding)
|
|
{
|
|
demoBuilding.Demolish();
|
|
UnOccupyTiles(demoBuilding.GetGridPosition(), demoBuilding.placeableObject.GetSizeVector());
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public void SelectBuilding(PlaceableObject newPo)
|
|
{
|
|
if (newBuildingObject)
|
|
{
|
|
Destroy(newBuildingObject);
|
|
}
|
|
|
|
placeableObject = newPo;
|
|
newBuildingObject = Instantiate(placeableObject.prefab, Vector3.zero, Quaternion.identity);
|
|
}
|
|
|
|
public void UnselectBuilding()
|
|
{
|
|
if (newBuildingObject)
|
|
{
|
|
Destroy(newBuildingObject);
|
|
}
|
|
newBuildingObject = null;
|
|
placeableObject = null;
|
|
}
|
|
|
|
private void OccupyTiles(Vector3Int startPos, Vector3Int poSize)
|
|
{
|
|
BoundsInt area = new BoundsInt(startPos, poSize);
|
|
TileBase[] tileArray = new TileBase[area.size.x * area.size.y * area.size.z];
|
|
for (int index = 0; index < tileArray.Length; index++)
|
|
{
|
|
tileArray[index] = occupiedTile;
|
|
}
|
|
|
|
collisionTm.SetTilesBlock(area, tileArray);
|
|
|
|
}
|
|
|
|
private void UnOccupyTiles(Vector3Int startPos, Vector3Int poSize)
|
|
{
|
|
BoundsInt area = new BoundsInt(startPos, poSize);
|
|
TileBase[] tileArray = new TileBase[area.size.x * area.size.y * area.size.z];
|
|
for (int index = 0; index < tileArray.Length; index++)
|
|
{
|
|
tileArray[index] = null;
|
|
}
|
|
|
|
collisionTm.SetTilesBlock(area, tileArray);
|
|
}
|
|
|
|
private bool IsOccupied(Vector3Int startPos, Vector3Int poSize)
|
|
{
|
|
|
|
|
|
BoundsInt area = new BoundsInt(startPos, poSize);
|
|
TileBase[] tileArray = collisionTm.GetTilesBlock(area);
|
|
|
|
foreach (TileBase tile in tileArray)
|
|
{
|
|
if (tile != null)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|