using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnvironmentGenerator : MonoBehaviour { [Tooltip("Width of the whole ground plane")] public float width = 1; [Tooltip("Height of the whole ground plane")] public float height = 1; [Tooltip("Amount of planes drawn horizontally in the whole plane area.")] [Range(1, 20)] public uint amountOfHorizontalElements = 5; [Tooltip("Amount of planes drawn vertically in the whole plane area.")] [Range(1, 20)] public uint amountOfVerticalElements = 5; [Tooltip("The material the ground uses")] public Material groundMaterial; [Tooltip("Only for testing.")] public bool testDestroy = false; public GameObject[,] CurrentEnvironment { get; private set; } private void Start() { CreateNewEnvironment(); } private void Update() { TestEnvironmentCreation(); } /// /// Only for testing, can be deleted if not needed anymore /// private void TestEnvironmentCreation() { if (testDestroy) { UpdateEnvironment(); testDestroy = !testDestroy; } } /// /// Creates a grid of planes /// public void CreateNewEnvironment() { CurrentEnvironment = new GameObject[amountOfHorizontalElements, amountOfVerticalElements]; float widthSingleEleme = width / amountOfHorizontalElements; //width of a single quad float heightSingleElem = height / amountOfVerticalElements; //height of a single quad // calculate the left-upper-point of the whole environment plane to use it as a startpoint for creating the grid Vector3 leftUpperPoint = transform.position + (Vector3.left * (width / 2) + (Vector3.forward * (height / 2))); Vector3 currentStartPoint = leftUpperPoint + new Vector3(widthSingleEleme / 2, 0, -heightSingleElem / 2); //First draw all horizontal planes than do the next line in the grid for (int idxX = 0; idxX < amountOfVerticalElements; idxX++) { CreateHorizontalPlaneLine(currentStartPoint, widthSingleEleme, heightSingleElem, idxX); currentStartPoint += Vector3.back * heightSingleElem; } } // Create a horizontal line of Planes private void CreateHorizontalPlaneLine(Vector3 startPoint, float widthPlane = 1, float heightPlane = 1, int idxX = 1) { Vector3 currentStartPoint = startPoint; for (int idxY = 0; idxY < amountOfHorizontalElements; idxY++) { CreatePlane(widthPlane, heightPlane, idxX, currentStartPoint, idxY); currentStartPoint += Vector3.right * widthPlane; } } // Create a single Plane private void CreatePlane(float widthPlane, float heightPlane, int idxX, Vector3 currentStartPoint, int idxY) { GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Quad); plane.transform.localEulerAngles = new Vector3(90, 0, 0); plane.transform.position = currentStartPoint; plane.transform.localScale = new Vector3(widthPlane, heightPlane, 1); plane.transform.SetParent(this.transform); plane.GetComponent().material = groundMaterial; CurrentEnvironment[idxX, idxY] = plane; } /// /// Destroy all Planes and set the environment array back to null /// public void DeleteCurrentEnvironment() { foreach (Transform child in transform) { if (child != this) { Destroy(child.gameObject); } } CurrentEnvironment = null; } /// /// Deletes the current environment if there is any and creates a new one /// public void UpdateEnvironment() { DeleteCurrentEnvironment(); CreateNewEnvironment(); } }