using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; namespace DanieleMarotta.RiversongCodeShowcase { public class BuildingStorageVisualization : MonoBehaviour { [PropertySpace(SpaceAfter = 20)] [SerializeField] private List _slots; [VerticalGroup("Arrange Slots/Controls")] [LabelText("Min")] [SerializeField] private Vector2 _boundsMin; [VerticalGroup("Arrange Slots/Controls")] [LabelText("Max")] [SerializeField] private Vector2 _boundsMax; [VerticalGroup("Arrange Slots/Controls")] [SerializeField] private int _columns = 4; public int SlotCount => _slots.Count; public Transform GetSlot(int slot) { return _slots[slot]; } public void SetProductVisualization(int slotIndex, GameObject productVisualization) { productVisualization.transform.SetParent(GetSlot(slotIndex)); productVisualization.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); } public bool TryGetProductVisualization(int slotIndex, out GameObject productVisualization) { var slot = GetSlot(slotIndex); productVisualization = slot.childCount > 0 ? slot.GetChild(0).gameObject : null; return productVisualization; } [HorizontalGroup("Arrange Slots", 200)] [Button(ButtonSizes.Large)] [GUIColor("cyan")] private void ArrangeSlots() { var rows = Mathf.CeilToInt((float)_slots.Count / _columns); var w = _boundsMax.x - _boundsMin.x; var h = _boundsMax.y - _boundsMin.y; var spacing = new Vector2(w, h) / new Vector2(_columns, rows); for (var i = 0; i < _slots.Count; i++) { var slot = _slots[i]; var row = i / _columns; var column = i % _columns; var p = slot.position; p.x = _boundsMin.x + (0.5f + column) * spacing.x; p.z = _boundsMin.y + (0.5f + row) * spacing.y; slot.position = p; } } } }