/
GeekNerd
/
ServerModelingProject
Обзор
Документация
Войти
/
GeekNerd
/
ServerModelingProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/OptimizationLogic/View/RackSpawner.cs
108 строк
3 KB
Gorney-Alex
Init
30 май 2026, 19:05
30 май 2026, 19:05
3cdcc49
Код
Авторство
О чём код?
using System.Collections.Generic; using DataClasses; using DataClasses.Algorithm; using UnityEngine; namespace OptimizationLogic.View { public sealed class RackSpawner : MonoBehaviour { [Header("Prefab")] [SerializeField] private GameObject rackPrefab; [Header("Root")] [SerializeField] private Transform spawnRoot; [Header("Materials")] [SerializeField] private Material normalMaterial; [SerializeField] private Material warnMaterial; [SerializeField] private Material criticalMaterial; private readonly List<GameObject> _spawned = new(); public void Clear() { for (int i = 0; i < _spawned.Count; i++) { if (_spawned[i] != null) Destroy(_spawned[i]); } _spawned.Clear(); } public void SpawnRacks( IReadOnlyList<RackGene> genes, IReadOnlyList<RackData> catalog, IReadOnlyDictionary<int, float> zoneTemperatures, float tempLimit) { Clear(); if (rackPrefab == null) { Debug.LogWarning("[RackSpawner] rackPrefab is not assigned."); return; } if (genes == null || catalog == null) return; Transform root = spawnRoot != null ? spawnRoot : transform; for (int i = 0; i < genes.Count; i++) { RackGene g = genes[i]; if (!g.IsPlaced) continue; if (g.ModelIndex < 0 || g.ModelIndex >= catalog.Count) continue; RackData m = catalog[g.ModelIndex]; if (m == null) continue; Vector3 pos = new Vector3(g.PositionX, 0f, g.PositionZ); Quaternion rot = Quaternion.Euler(0f, g.Rotation, 0f); GameObject go = Instantiate(rackPrefab, pos, rot, root); go.name = $"Rack_{i}_Z{g.ZoneId}"; go.transform.localScale = new Vector3( Mathf.Max(0.01f, m.Width), Mathf.Max(0.01f, m.Height), Mathf.Max(0.01f, m.Length)); if (zoneTemperatures != null && zoneTemperatures.TryGetValue(g.ZoneId, out float t)) { ApplyHeatMaterial(go, t, tempLimit); } else { ApplyMaterial(go, normalMaterial); } _spawned.Add(go); } } private void ApplyHeatMaterial(GameObject rack, float zoneTemp, float tempLimit) { if (zoneTemp > tempLimit + 5f) { ApplyMaterial(rack, criticalMaterial != null ? criticalMaterial : warnMaterial); } else if (zoneTemp > tempLimit) { ApplyMaterial(rack, warnMaterial); } else { ApplyMaterial(rack, normalMaterial); } } private static void ApplyMaterial(GameObject go, Material mat) { if (go == null || mat == null) return; Renderer r = go.GetComponentInChildren<Renderer>(); if (r == null) return; r.sharedMaterial = mat; } } }