BuildingBlueprintController.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using KairoEngine.Core;
  5. using Sirenix.OdinInspector;
  6. namespace KairoEngine.VoxelBuildingSystem
  7. {
  8. [HideMonoScript]
  9. public class BuildingBlueprintController : MonoBehaviour
  10. {
  11. public VoxelBuildingSystem buildingSystem;
  12. public Transform currentBlueprint;
  13. [BoxGroup("Materials")] public Material blueprintMain;
  14. [BoxGroup("Materials")] public Material blueprintDetail;
  15. [BoxGroup("Materials")] public Material invalidMain;
  16. [BoxGroup("Materials")] public Material invalidDetail;
  17. private void Start() {
  18. RefreshVisual();
  19. GenericEvents.StartListening("OnBuildingTemplateChanged", OnBuildingTemplateChanged);
  20. }
  21. private void OnDisable()
  22. {
  23. GenericEvents.StopListening("OnBuildingTemplateChanged", OnBuildingTemplateChanged);
  24. }
  25. private void OnBuildingTemplateChanged() {
  26. RefreshVisual();
  27. }
  28. private void LateUpdate() {
  29. if(currentBlueprint == null) return;
  30. var template = buildingSystem.buildingTemplates[buildingSystem.currentBuildingTemplate];
  31. Vector3Int targetPosition = buildingSystem.GetMouseVoxelPosition();
  32. Vector3Int dir = buildingSystem.rotationList[buildingSystem.currentRotationIndex];
  33. Quaternion rotation = Quaternion.Euler(dir.x, dir.y, dir.z);
  34. currentBlueprint.transform.position = Vector3.Lerp(currentBlueprint.transform.position, targetPosition, Time.deltaTime * 15f);
  35. currentBlueprint.transform.rotation = Quaternion.Lerp(currentBlueprint.transform.rotation, rotation, Time.deltaTime * 15f);
  36. //currentBlueprint.transform.localEulerAngles = Vector3.Lerp(transform.localEulerAngles, dir, Time.deltaTime * 15f);
  37. //currentBlueprint.transform.localEulerAngles = dir;
  38. if(buildingSystem.tool == VoxelBuildingTool.Build) currentBlueprint.gameObject.SetActive(true);
  39. else currentBlueprint.gameObject.SetActive(false);
  40. CanBuild();
  41. }
  42. private void RefreshVisual() {
  43. if (currentBlueprint != null) {
  44. Destroy(currentBlueprint.gameObject);
  45. currentBlueprint = null;
  46. }
  47. BuildingTemplate buildingTemplate = buildingSystem.buildingTemplates[buildingSystem.currentBuildingTemplate];
  48. if (buildingTemplate != null) {
  49. Vector3 targetPosition = buildingSystem.GetMouseWorldSnappedPosition();
  50. currentBlueprint = Instantiate(buildingTemplate.visual, targetPosition, Quaternion.identity);
  51. currentBlueprint.parent = transform;
  52. // currentBlueprint.localPosition = Vector3.zero;
  53. // currentBlueprint.localEulerAngles = Vector3.zero;
  54. }
  55. }
  56. private bool canBuild;
  57. private Vector3Int lastPosition;
  58. private int lastTemplateIndex;
  59. private void CanBuild()
  60. {
  61. Vector3Int pos = buildingSystem.GetMouseVoxelPosition();
  62. int templateIndex = buildingSystem.currentBuildingTemplate;
  63. int rotationIndex = buildingSystem.currentRotationIndex;
  64. if(lastPosition != pos || lastTemplateIndex != templateIndex)
  65. {
  66. //Debug.Log("Position changed, updating blueprint materials");
  67. canBuild = buildingSystem.CanPlaceBuilding(pos, templateIndex, rotationIndex);
  68. lastPosition = pos;
  69. lastTemplateIndex = templateIndex;
  70. ChangeMaterials();
  71. }
  72. }
  73. private void ChangeMaterials()
  74. {
  75. MeshRenderer[] renderers = currentBlueprint.GetComponentsInChildren<MeshRenderer>(false);
  76. //Debug.Log($"Changing materials in {renderers.Length} renderers");
  77. for (int i = 0; i < renderers.Length; i++)
  78. {
  79. Material[] materials = renderers[i].materials;
  80. //Debug.Log($"Found {renderers[i].materials.Length} materials in render {i}");
  81. for (int a = 0; a < materials.Length; a++)
  82. {
  83. if(materials[a].name.Contains("Main"))
  84. {
  85. if(canBuild) materials[a] = blueprintMain;
  86. else materials[a] = invalidMain;
  87. }
  88. else if(materials[a].name.Contains("Detail"))
  89. {
  90. if(canBuild) materials[a] = blueprintDetail;
  91. else materials[a] = invalidDetail;
  92. }
  93. }
  94. renderers[i].materials = materials;
  95. }
  96. }
  97. }
  98. }