|
@@ -2,13 +2,19 @@ using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using UnityEngine;
|
|
|
using KairoEngine.Core;
|
|
|
+using Sirenix.OdinInspector;
|
|
|
|
|
|
namespace KairoEngine.VoxelBuildingSystem
|
|
|
{
|
|
|
+ [HideMonoScript]
|
|
|
public class BuildingBlueprintController : MonoBehaviour
|
|
|
{
|
|
|
public VoxelBuildingSystem buildingSystem;
|
|
|
public Transform currentBlueprint;
|
|
|
+ [BoxGroup("Materials")] public Material blueprintMain;
|
|
|
+ [BoxGroup("Materials")] public Material blueprintDetail;
|
|
|
+ [BoxGroup("Materials")] public Material invalidMain;
|
|
|
+ [BoxGroup("Materials")] public Material invalidDetail;
|
|
|
|
|
|
private void Start() {
|
|
|
RefreshVisual();
|
|
@@ -32,6 +38,7 @@ namespace KairoEngine.VoxelBuildingSystem
|
|
|
currentBlueprint.transform.rotation = Quaternion.Lerp(transform.rotation, buildingSystem.transform.rotation, Time.deltaTime * 15f);
|
|
|
if(buildingSystem.tool == VoxelBuildingTool.Build) currentBlueprint.gameObject.SetActive(true);
|
|
|
else currentBlueprint.gameObject.SetActive(false);
|
|
|
+ CanBuild();
|
|
|
}
|
|
|
|
|
|
private void RefreshVisual() {
|
|
@@ -47,6 +54,48 @@ namespace KairoEngine.VoxelBuildingSystem
|
|
|
currentBlueprint.localEulerAngles = Vector3.zero;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private bool canBuild;
|
|
|
+ private Vector3Int lastPosition;
|
|
|
+ private int lastTemplateIndex;
|
|
|
+ private void CanBuild()
|
|
|
+ {
|
|
|
+ Vector3Int pos = buildingSystem.GetMouseVoxelPosition();
|
|
|
+ int templateIndex = buildingSystem.currentBuildingTemplate;
|
|
|
+ if(lastPosition != pos || lastTemplateIndex != templateIndex)
|
|
|
+ {
|
|
|
+ //Debug.Log("Position changed, updating blueprint materials");
|
|
|
+ canBuild = buildingSystem.CanPlaceBuilding(pos, templateIndex);
|
|
|
+ lastPosition = pos;
|
|
|
+ lastTemplateIndex = templateIndex;
|
|
|
+ ChangeMaterials();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void ChangeMaterials()
|
|
|
+ {
|
|
|
+ MeshRenderer[] renderers = currentBlueprint.GetComponentsInChildren<MeshRenderer>(false);
|
|
|
+ //Debug.Log($"Changing materials in {renderers.Length} renderers");
|
|
|
+ for (int i = 0; i < renderers.Length; i++)
|
|
|
+ {
|
|
|
+ Material[] materials = renderers[i].materials;
|
|
|
+ //Debug.Log($"Found {renderers[i].materials.Length} materials in render {i}");
|
|
|
+ for (int a = 0; a < materials.Length; a++)
|
|
|
+ {
|
|
|
+ if(materials[a].name.Contains("Main"))
|
|
|
+ {
|
|
|
+ if(canBuild) materials[a] = blueprintMain;
|
|
|
+ else materials[a] = invalidMain;
|
|
|
+ }
|
|
|
+ else if(materials[a].name.Contains("Detail"))
|
|
|
+ {
|
|
|
+ if(canBuild) materials[a] = blueprintDetail;
|
|
|
+ else materials[a] = invalidDetail;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ renderers[i].materials = materials;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
}
|