건축 및 고용에 비용 소모 기능 추가

This commit is contained in:
2026-02-02 20:26:44 +09:00
parent 9dea9daaa9
commit 958ae1cb75
6 changed files with 159 additions and 11 deletions

View File

@@ -328,16 +328,20 @@ namespace Northbound
if (Physics.Raycast(ray, out RaycastHit hit, maxPlacementDistance, groundLayer))
{
// Check if placement is valid
bool isValid = BuildingManager.Instance.IsValidPlacement(data, hit.point, currentRotation, out Vector3 snappedPosition);
// Check affordability
var coreResourceManager = CoreResourceManager.Instance;
bool canAfford = coreResourceManager != null && coreResourceManager.CanAfford(data.mana);
// Update preview position (placementOffset 적용)
previewObject.transform.position = snappedPosition + data.placementOffset;
previewObject.transform.rotation = Quaternion.Euler(0, currentRotation * 90f, 0);
// Update material based on validity
Material targetMat = isValid ? validMaterial : invalidMaterial;
// Update material based on validity and affordability
Material targetMat = (isValid && canAfford) ? validMaterial : invalidMaterial;
foreach (var renderer in previewRenderers)
{
Material[] mats = new Material[renderer.materials.Length];
@@ -462,6 +466,10 @@ namespace Northbound
Vector3 dragEndPosition = hit.point;
List<Vector3> positions = CalculateDragBuildingPositions(dragStartPosition, dragEndPosition, data);
// Check affordability for all buildings
var coreResourceManager = CoreResourceManager.Instance;
bool canAffordAll = coreResourceManager != null && coreResourceManager.CanAfford(data.mana * positions.Count);
// 기존 프리뷰 정리
ClearDragPreviews();
@@ -476,9 +484,9 @@ namespace Northbound
}
bool isValid = BuildingManager.Instance.IsValidPlacement(data, pos, currentRotation, out Vector3 snappedPosition);
GameObject preview = Instantiate(data.prefab);
// Remove NetworkObject and Building components
if (preview.GetComponent<NetworkObject>() != null)
Destroy(preview.GetComponent<NetworkObject>());
@@ -490,7 +498,7 @@ namespace Northbound
preview.transform.rotation = Quaternion.Euler(0, currentRotation * 90f, 0);
// Apply materials
Material targetMat = isValid ? validMaterial : invalidMaterial;
Material targetMat = (isValid && canAffordAll) ? validMaterial : invalidMaterial;
Renderer[] renderers = preview.GetComponentsInChildren<Renderer>();
foreach (var renderer in renderers)
{
@@ -569,6 +577,14 @@ namespace Northbound
TowerData selectedData = BuildingManager.Instance.availableBuildings[selectedBuildingIndex];
// Check affordability
var coreResourceManager = CoreResourceManager.Instance;
if (coreResourceManager == null || !coreResourceManager.CanAfford(selectedData.mana * dragBuildingPositions.Count))
{
Debug.Log("<color=yellow>[BuildingPlacement] 자원이 부족합니다.</color>");
return;
}
int successCount = 0;
foreach (var position in dragBuildingPositions)
{
@@ -608,7 +624,15 @@ namespace Northbound
if (Physics.Raycast(ray, out RaycastHit hit, maxPlacementDistance, groundLayer))
{
TowerData selectedData = BuildingManager.Instance.availableBuildings[selectedBuildingIndex];
// Check affordability
var coreResourceManager = CoreResourceManager.Instance;
if (coreResourceManager != null && !coreResourceManager.CanAfford(selectedData.mana))
{
Debug.Log("<color=yellow>[BuildingPlacement] 자원이 부족합니다.</color>");
return;
}
if (BuildingManager.Instance.IsValidPlacement(selectedData, hit.point, currentRotation, out Vector3 groundPosition))
{
// 토대 배치 요청