using UnityEngine; using System.Collections; using System.Collections.Generic; public class GrassDetailScalerByProperties : MonoBehaviour { public Terrain terrain; // Referencja do terenu public List grassDetails; // Lista detali trawy do animacji private bool isAnimating = false; [System.Serializable] public class GrassDetail { public int detailIndex; // Indeks detalu trawy public float initialDensity; // Pocz�tkowa g�sto�� trawy public float finalDensity; // Ko�cowa g�sto�� trawy public float growthDelay; // Op�nienie przed rozpocz�ciem animacji public float fadeSpeed; // Pr�dko�� animacji [HideInInspector] public float originalDensity; // Oryginalna g�sto�� trawy (z edytora) [HideInInspector] public int[,] originalDetailLayer; // Oryginalna warstwa detali } void Start() { // Zapisz pocz�tkowe warto�ci dla ka�dego rodzaju trawy TerrainData terrainData = terrain.terrainData; foreach (var detail in grassDetails) { detail.originalDetailLayer = (int[,])terrainData.GetDetailLayer(0, 0, terrainData.detailWidth, terrainData.detailHeight, detail.detailIndex).Clone(); detail.originalDensity = GetOriginalDensity(detail); // Przywr�� pocz�tkow� g�sto�� SetGrassDensity(detail, detail.originalDensity); } } // Funkcja wywo�ywana przez zdarzenie lub inny skrypt public void GrowGrass() { if (!isAnimating) { isAnimating = true; StartCoroutine(GrowGrassCoroutine()); } } private IEnumerator GrowGrassCoroutine() { // Rozpocznij animacj� z op�nieniem dla ka�dego rodzaju trawy foreach (var detail in grassDetails) { // Poczekaj na op�nienie yield return new WaitForSeconds(detail.growthDelay); // Animuj g�sto�� dla aktualnego rodzaju trawy while (Mathf.Abs(detail.initialDensity - detail.finalDensity) > 0.01f) { detail.initialDensity = Mathf.Lerp(detail.initialDensity, detail.finalDensity, Time.deltaTime * detail.fadeSpeed); SetGrassDensity(detail, detail.initialDensity); yield return null; // Czekaj na nast�pn� klatk� } // Ustaw dok�adn� warto�� docelow� g�sto�ci detail.initialDensity = detail.finalDensity; SetGrassDensity(detail, detail.initialDensity); } // Zatrzymaj animacj� po osi�gni�ciu docelowej g�sto�ci dla wszystkich rodzaj�w trawy isAnimating = false; } // Funkcja do ustawiania g�sto�ci trawy void SetGrassDensity(GrassDetail detail, float density) { TerrainData terrainData = terrain.terrainData; int[,] detailLayer = new int[terrainData.detailWidth, terrainData.detailHeight]; for (int x = 0; x < terrainData.detailWidth; x++) { for (int y = 0; y < terrainData.detailHeight; y++) { detailLayer[x, y] = Mathf.RoundToInt(detail.originalDetailLayer[x, y] * density); } } terrainData.SetDetailLayer(0, 0, detail.detailIndex, detailLayer); } // Funkcja do przywracania oryginalnej g�sto�ci trawy void RestoreOriginalDensity() { if (!terrain) return; TerrainData terrainData = terrain.terrainData; foreach (var detail in grassDetails) { terrainData.SetDetailLayer(0, 0, detail.detailIndex, detail.originalDetailLayer); } } // Funkcja do uzyskiwania oryginalnej g�sto�ci z edytora float GetOriginalDensity(GrassDetail detail) { TerrainData terrainData = terrain.terrainData; int[,] detailLayer = terrainData.GetDetailLayer(0, 0, terrainData.detailWidth, terrainData.detailHeight, detail.detailIndex); float totalDensity = 0; int count = 0; for (int x = 0; x < terrainData.detailWidth; x++) { for (int y = 0; y < terrainData.detailHeight; y++) { totalDensity += detailLayer[x, y]; count++; } } return totalDensity / count; } void OnDisable() { // Przywr�� oryginaln� g�sto�� trawy po wy��czeniu skryptu RestoreOriginalDensity(); } void OnApplicationQuit() { // Przywr�� oryginaln� g�sto�� trawy przed zamkni�ciem aplikacji RestoreOriginalDensity(); } }