/
GeekNerd
/
ServerModelingProject
Обзор
Документация
Войти
/
GeekNerd
/
ServerModelingProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/RoomBuilding/UIColumnPreviewView.cs
114 строк
4 KB
Gorney-Alex
Init
30 май 2026, 19:05
30 май 2026, 19:05
3cdcc49
Код
Авторство
О чём код?
using System.Collections.Generic; using Interfaces; using UnityEngine; using Zenject; namespace RoomBuilding { public class UIColumnPreviewView : MonoBehaviour, IInitializable { [Header("Container")] [SerializeField] private RectTransform circlesContainer; [Header("Column preview")] [SerializeField] private float pixelsPerGridStep = 20f; [SerializeField] private Color placedColor = new Color(0.5f, 0.5f, 0.5f, 1f); [SerializeField] private Color previewColor = new Color(0.5f, 0.5f, 0.5f, 0.5f); private ICustomFactory _factory; private PolygonDrawingService _drawingService; private DataClasses.RoomBuildingSettings _settings; private readonly List<ICircleView> _columnCircles = new(); private ICircleView _previewCircle; private float _pixelsPerMeter; [Inject] public void Construct(ICustomFactory factory, PolygonDrawingService drawingService, DataClasses.RoomBuildingSettings settings) { _factory = factory; _drawingService = drawingService; _settings = settings; } public void Initialize() { if (_settings == null || _settings.DotSpacing <= 0f) { Debug.LogError("[UIColumnPreviewView] Invalid settings."); return; } _pixelsPerMeter = pixelsPerGridStep / _settings.DotSpacing; _drawingService.OnColumnsChanged += Refresh; _drawingService.OnVerticesChanged += Refresh; } private void OnDestroy() { if (_drawingService == null) return; _drawingService.OnColumnsChanged -= Refresh; _drawingService.OnVerticesChanged -= Refresh; } private void Refresh() { var root = circlesContainer != null ? circlesContainer : transform as RectTransform; if (root == null) return; var columns = _drawingService.Columns; for (int i = 0; i < columns.Count; i++) { var column = columns[i]; var circle = GetOrCreateCircle(root, _columnCircles, i); circle.SetPosition(WorldToUI(column.Center)); circle.SetRadius(column.Radius * _pixelsPerMeter); circle.SetColor(placedColor); circle.SetActive(true); } SetActive(_columnCircles, columns.Count); bool showPreview = _drawingService.IsColumnMode && _drawingService.PreviewCursorWorld.HasValue; if (showPreview) { if (_previewCircle == null) { _previewCircle = _factory.CreateCircle(root); } _previewCircle.SetPosition(WorldToUI(_drawingService.PreviewCursorWorld.Value)); _previewCircle.SetRadius(_drawingService.PreviewColumnRadius * _pixelsPerMeter); _previewCircle.SetColor(previewColor); _previewCircle.SetActive(true); } else if (_previewCircle != null) { _previewCircle.SetActive(false); } } private ICircleView GetOrCreateCircle(RectTransform root, List<ICircleView> pool, int index) { while (pool.Count <= index) { pool.Add(_factory.CreateCircle(root)); } return pool[index]; } private static void SetActive(List<ICircleView> pool, int activeCount) { for (int i = 0; i < pool.Count; i++) { pool[i].SetActive(i < activeCount); } } private Vector2 WorldToUI(Vector2 world) => world * _pixelsPerMeter; } }