Prechádzať zdrojové kódy

Added Invalid blueprint color

James Peret 2 rokov pred
rodič
commit
f58a3d7d00

+ 49 - 0
Runtime/BuildingBlueprintController.cs

@@ -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;
+            }
+        }
         
     }
 }

+ 7 - 6
Runtime/VoxelBuildingSystem.cs

@@ -70,7 +70,7 @@ namespace KairoEngine.VoxelBuildingSystem
         {
             Vector3 worldPos = GetMouseWorldSnappedPosition();
             Vector3Int voxelPos = FindVoxelPosition(pointerPosition);
-            if(!CanPlaceBuilding(voxelPos, currentBuildingTemplate)) return;
+            if(!CanPlaceBuilding(voxelPos, currentBuildingTemplate, true)) return;
             Transform newBuilding = Instantiate(buildingTemplates[currentBuildingTemplate].prefab, worldPos, this.transform.rotation, this.transform);
             BuildingBehaviour buildingBehaviour = newBuilding.GetComponent<BuildingBehaviour>();
             if(buildingBehaviour == null)
@@ -92,7 +92,7 @@ namespace KairoEngine.VoxelBuildingSystem
             }
         } 
 
-        public bool CanPlaceBuilding(Vector3Int voxelPos, int buildingTemplateIndex)
+        public bool CanPlaceBuilding(Vector3Int voxelPos, int buildingTemplateIndex, bool debug = false)
         {
             List<Vector3Int> voxelPositions = GetBuildingVoxelList(voxelPos, buildingTemplateIndex);
             for (int i = 0; i < voxelPositions.Count; i++)
@@ -100,7 +100,7 @@ namespace KairoEngine.VoxelBuildingSystem
                 VoxelBuildData block = chunkSystem.GetBlock(voxelPositions[i]);
                 if(block.buildingIndex != -1) 
                 {
-                    Debug.Log("Cannot place building, place is occupied.");
+                    if(debug) Debug.Log("Cannot place building, place is occupied.");
                     return false;
                 }
             }
@@ -115,13 +115,14 @@ namespace KairoEngine.VoxelBuildingSystem
         }
 
         public Vector3 GetMouseWorldSnappedPosition() => (Vector3)FindVoxelPosition(pointerPosition);
+        public Vector3Int GetMouseVoxelPosition() => FindVoxelPosition(pointerPosition);
 
         public void CycleBuildingTemplate()
         {
             if(currentBuildingTemplate < buildingTemplates.Count - 1) currentBuildingTemplate += 1;
             else currentBuildingTemplate = 0;
             GenericEvents.Trigger("OnBuildingTemplateChanged");
-            Debug.Log($"Changing current building template to {currentBuildingTemplate}");
+            //Debug.Log($"Changing current building template to {currentBuildingTemplate}");
         }
 
         public List<Vector3Int> GetBuildingVoxelList(Vector3Int offset, int buildingTemplateId) 
@@ -136,11 +137,11 @@ namespace KairoEngine.VoxelBuildingSystem
                     {
                         Vector3Int pos = new Vector3Int(offset.x + x, offset.y + y, offset.z + z);
                         positionList.Add(pos);
-                        Debug.Log(pos);
+                        //Debug.Log(pos);
                     }
                 }
             }
-            Debug.Log($"{positionList.Count} voxel positions found for building \"{buildingTemplates[buildingTemplateId].title}\"");
+            //Debug.Log($"{positionList.Count} voxel positions found for building \"{buildingTemplates[buildingTemplateId].title}\"");
             return positionList;
         }