/
Lexan97
/
Cowbeat
Обзор
Документация
Войти
/
Lexan97
/
Cowbeat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/Terrain/TerrainScriptEPT.cs
145 строк
5 KB
Lexa97
Final Commit gor present
26 май 2026, 23:40
26 май 2026, 23:40
70e9bdb
Код
Авторство
О чём код?
using UnityEngine; using System.Collections.Generic; public class TerrainPaintsAll : MonoBehaviour { [System.Serializable] public class LayerRule { public string layerName = "Sand"; public float minHeight = 0f; public float maxHeight = 10f; } public List<LayerRule> rules = new List<LayerRule>(); public bool applyOnStart = false; public bool showDebug = true; private Terrain terrain; private TerrainData data; void Start() { if (applyOnStart) ForcePaint(); } [ContextMenu("💥 ЖЕСТКО ПОКРАСИТЬ ВСЁ 💥")] public void ForcePaint() { Debug.Log("=================================="); Debug.Log("🔥 АКТИВАЦИЯ ЖЕСТКОЙ ПОКРАСКИ 🔥"); Debug.Log("=================================="); terrain = GetComponent<Terrain>(); if (terrain == null) { Debug.LogError("❌ Terrain отсутствует"); return; } data = terrain.terrainData; if (data == null) { Debug.LogError("❌ TerrainData отсутствует"); return; } // 1. ПРОВЕРКА СЛОЁВ var layers = data.terrainLayers; if (layers == null || layers.Length == 0) { Debug.LogError("❌ НЕТ СЛОЁВ В TERRAIN LAYERS! Создай их через Paint Texture → Edit Terrain Layers..."); return; } Debug.Log($"✅ Слоёв найдено: {layers.Length}"); for (int i = 0; i < layers.Length; i++) Debug.Log($" {i}: {layers[i].name}"); // 2. ПРОВЕРКА ПРАВИЛ if (rules.Count == 0) { Debug.LogError("❌ Правила не заданы!"); return; } Debug.Log($"✅ Правил: {rules.Count}"); // 3. ПОЛУЧАЕМ ДАННЫЕ int w = data.alphamapWidth; int h = data.alphamapHeight; float[,] heights = data.GetHeights(0, 0, data.heightmapResolution, data.heightmapResolution); float[,,] maps = new float[w, h, layers.Length]; Debug.Log($"📍 Карта текстур: {w} x {h}"); Debug.Log($"📍 Высота террейна: {data.size.y}м"); Debug.Log($"📍 Позиция Y террейна: {terrain.transform.position.y}"); int[] stats = new int[layers.Length]; int total = 0; int unmatched = 0; // 4. ПОКРАСКА for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { float nx = (float)x / w; float ny = (float)y / h; int hx = (int)(nx * (data.heightmapResolution - 1)); int hy = (int)(ny * (data.heightmapResolution - 1)); float worldY = terrain.transform.position.y + heights[hy, hx] * data.size.y; int target = -1; string targetName = "unknown"; foreach (var rule in rules) { if (worldY >= rule.minHeight && worldY < rule.maxHeight) { for (int i = 0; i < layers.Length; i++) { if (layers[i].name == rule.layerName) { target = i; targetName = rule.layerName; break; } } if (target != -1) break; } } if (target == -1) { target = 0; targetName = layers[0].name; unmatched++; } for (int l = 0; l < layers.Length; l++) maps[x, y, l] = (l == target) ? 1f : 0f; stats[target]++; total++; } } // 5. ПРИМЕНЯЕМ data.SetAlphamaps(0, 0, maps); // 6. ПРИНУДИТЕЛЬНОЕ ОБНОВЛЕНИЕ terrain.Flush(); #if UNITY_EDITOR UnityEditor.EditorUtility.SetDirty(terrain); UnityEditor.EditorUtility.SetDirty(data); #endif // 7. СТАТИСТИКА Debug.Log("=================================="); Debug.Log($"🔥 ВСЕГО ТОЧЕК: {total}"); for (int i = 0; i < layers.Length; i++) { float percent = (stats[i] / (float)total) * 100f; Debug.Log($" {layers[i].name}: {stats[i]} точек — {percent:F1}%"); } if (unmatched > 0) Debug.LogWarning($"⚠ Точки без правила (назначен слой 0): {unmatched}"); Debug.Log("=================================="); Debug.Log("🔥 ПОКРАСКА ЗАВЕРШЕНА. Если всё ещё не видно — проблема в материалах."); Debug.Log("=================================="); } }