using System.Collections; using System.Collections.Generic; using UnityEngine; public class gridGen : MonoBehaviour { public perlinNoise noise; public GameObject hexPrefab; public Transform mapStart; public int generationStep = 128; //Количество генерируемых за кадр гексов public int progressNow = 0; //Сколько уже сгенерированно public int progressTotal = -1; //Всего гексов нужно сгенерировать //private float translationVert; public int x = 32;//Размер сетки по x public int y = 32;//Размер сетки по y private float scaleY = Mathf.Sqrt(3) / 2; //Расчитываем корректный размер гекса по Oy для точных сдвигов private float scaleX = 1; //Расчитываем корректный размер гекса по Ox для точных сдвигов private int nowX; //Координата текущего гекса по Ox private int nowY; //Координата текущего гекса по Oy private int nowStep = 0;//Сгенерированно за этот кадр // Start is called before the first frame update void Start() { progressTotal = x * y;//Считаем сколько всего гексов в сетке } // Update is called once per frame void Update() { while (nowStep < generationStep && nowX < x) //Делаем generationStep за кадр и проверяем что генерация еще нужна { if (nowY < y)//Проверяем что столбец еще не закончен { float modX = 0.25f; //Множитель для сдвига по Ox float modY = 0; //Базовый множитель сдвига по Oy if (nowX % 2 == 1) { modY = 0.5f; //Сдвиг каждого нечетного столбца } initHex(mapStart.position.x + (scaleX * nowX) - (modX * scaleX * nowX), mapStart.position.y + (scaleY * nowY) + (modY * scaleY));//Создание гекса со сдвигами nowY++; //Увеличиваем номер сгенерированного гекса в столбце progressNow++;//Увеличиваем счетчик прогресса nowStep++;//Увеличиваем счетчик количества сгенерированных за кадр гексов } else //Если столбец заончился переходим к следующему { nowX++; nowY = 0; } } if (nowStep == generationStep) nowStep = 0;//Сбрасываем счетчик сгенерированных за кадр гексов if (nowX == x) this.enabled = false;//Завершаем генерацию после ее конца } private void initHex(float x, float y) { GameObject hex = Instantiate(hexPrefab);//Создаем клон базового гекса hex.transform.Translate(new Vector3(x, y, 0));//Сдвигаем клон на нужную позицию в сетке hex.GetComponent().InitializeHex(new Vector2Int(this.nowX, this.nowY), noise.getNoise((float)nowX / this.x, (float)nowY / this.x, Mathf.Max(this.x, this.y)), noise.seed);//Инициализируем логику гекса } }