diff --git a/Assets/Prefabs/AAA/Panel_AssetLibrary.prefab b/Assets/Prefabs/AAA/Panel_AssetLibrary.prefab index 1c26bbd6..c9ce45ce 100644 --- a/Assets/Prefabs/AAA/Panel_AssetLibrary.prefab +++ b/Assets/Prefabs/AAA/Panel_AssetLibrary.prefab @@ -112,7 +112,7 @@ RectTransform: m_Father: {fileID: 1685799791316290074} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.99998707} + m_AnchorMax: {x: 1, y: 0.99999106} m_AnchoredPosition: {x: 2, y: 0} m_SizeDelta: {x: 8, y: 20} m_Pivot: {x: 0.5, y: 0.5} @@ -1018,7 +1018,7 @@ MonoBehaviour: m_HandleRect: {fileID: 5808496954263173159} m_Direction: 2 m_Value: 0 - m_Size: 0.99998707 + m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: m_PersistentCalls: @@ -1062,8 +1062,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 210, y: -408.97} - m_SizeDelta: {x: 420, y: 817.93} + m_AnchoredPosition: {x: 210, y: -431.02136} + m_SizeDelta: {x: 420, y: 862.0427} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7966294254755768478 CanvasRenderer: @@ -1741,7 +1741,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: -0.00034048597, y: 0.005433774} + m_AnchoredPosition: {x: -0.00034048597, y: 0.0035585074} m_SizeDelta: {x: 282.99957, y: 2} m_Pivot: {x: 0, y: 1} --- !u!114 &2780744526690132257 @@ -2202,8 +2202,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 210, y: -501.18732} - m_SizeDelta: {x: 420, y: 817.9348} + m_AnchoredPosition: {x: 210, y: -531.1099} + m_SizeDelta: {x: 420, y: 877.78} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &5930958411786542109 MonoBehaviour: diff --git a/Assets/Resources/Prefabs/UI/PRF_AssetLibraryFolder.prefab b/Assets/Resources/Prefabs/UI/PRF_AssetLibraryFolder.prefab index a7c38b9d..2daa7a0d 100644 --- a/Assets/Resources/Prefabs/UI/PRF_AssetLibraryFolder.prefab +++ b/Assets/Resources/Prefabs/UI/PRF_AssetLibraryFolder.prefab @@ -39,7 +39,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: -10} m_SizeDelta: {x: 0, y: 35} m_Pivot: {x: 0, y: 0.5} --- !u!114 &8577872390119345382 @@ -621,7 +621,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 420, y: 50} + m_SizeDelta: {x: 420, y: 110} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &9006872392457284266 CanvasRenderer: @@ -1128,7 +1128,7 @@ MonoBehaviour: m_Color: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 0 + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] diff --git a/Assets/Resources/Prefabs/UI/PRF_AssetLibraryItem.prefab b/Assets/Resources/Prefabs/UI/PRF_AssetLibraryItem.prefab index 24702a53..520bd54f 100644 --- a/Assets/Resources/Prefabs/UI/PRF_AssetLibraryItem.prefab +++ b/Assets/Resources/Prefabs/UI/PRF_AssetLibraryItem.prefab @@ -367,8 +367,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: -30} - m_SizeDelta: {x: 110, y: 30} + m_AnchoredPosition: {x: 0, y: -15} + m_SizeDelta: {x: 110, y: 20} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &499100886614822048 CanvasRenderer: @@ -620,7 +620,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 110, y: 140} + m_SizeDelta: {x: 110, y: 110} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &9006872392457284266 CanvasRenderer: @@ -1105,7 +1105,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 5} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5193183312611458682 diff --git a/Assets/Scripts/Studio/UI/TreeView/AssetLibraryPooledScrollView.cs b/Assets/Scripts/Studio/UI/TreeView/AssetLibraryPooledScrollView.cs index 43c0c027..52bf5de3 100644 --- a/Assets/Scripts/Studio/UI/TreeView/AssetLibraryPooledScrollView.cs +++ b/Assets/Scripts/Studio/UI/TreeView/AssetLibraryPooledScrollView.cs @@ -32,7 +32,6 @@ namespace Studio.AssetLibraryTree private AssetLibraryItem lastSelectedItem = null; private float itemHeight; // Height of a single item. - private float folderHeight; private int visibleItemCount; // Number of visible items that fit in the viewport. private int currentIndex = -1; // The index of the first visible item. @@ -42,7 +41,8 @@ namespace Studio.AssetLibraryTree public bool isSiblingEditable; - int rowItemCount = 3; + private int rowItemCount = 3; + private float scrollViewOffset = 2f; private void Awake() { @@ -85,9 +85,7 @@ namespace Studio.AssetLibraryTree scrollRect.setToNextSiblingItem.AddListener(SetToNextSiblingItem); //아이템 하나당 높이값 저장 itemHeight = itemPrefab.GetComponent().rect.height; - folderHeight = folderPrefab.GetComponent().rect.height; - float rowHeight = itemHeight + 10f; // row 간격 포함 (spacingY) - visibleItemCount = Mathf.CeilToInt(scrollRect.GetComponent().sizeDelta.y / rowHeight) + 1; + visibleItemCount = Mathf.CeilToInt(scrollRect.GetComponent().sizeDelta.y / itemHeight) + 1; searchInput.onValueChanged.AddListener(SearchData); //searchCancelButton.onClick.RemoveAllListeners(); @@ -124,6 +122,39 @@ namespace Studio.AssetLibraryTree { return root.Find(name, type); } + public void CalculateSlotArea() + { + int fileCountCurLine = 0; + displayData.Clear(); + + foreach (var item in data) + { + if (item.type == AssetLibraryItemType.folder) + { + if (fileCountCurLine > 0) + { + for (int i = 0; i < rowItemCount - fileCountCurLine; i++) + { + displayData.Add(null); + } + fileCountCurLine = 0; + } + + displayData.Add(item); + displayData.Add(null); + displayData.Add(null); + } + else + { + fileCountCurLine++; + displayData.Add(item); + if (fileCountCurLine == 3) + { + fileCountCurLine = 0; + } + } + } + } public void SetData() { data.Clear(); @@ -144,9 +175,8 @@ namespace Studio.AssetLibraryTree private void RebuildVisibleItems() { - float rowHeight = itemHeight + 10f; float scrollY = content.anchoredPosition.y; - int newRowIndex = Mathf.FloorToInt(scrollY / rowHeight); + int newRowIndex = Mathf.FloorToInt(scrollY / itemHeight); if (newRowIndex < 0) newRowIndex = 0; if (newRowIndex == currentIndex) @@ -161,31 +191,9 @@ namespace Studio.AssetLibraryTree foldersPool.Release(item); activeItems.Clear(); - activeFolders.Clear(); - displayData.Clear(); + activeFolders.Clear(); - foreach (var item in data) - { - if (item.type == AssetLibraryItemType.folder) - { - int offset = displayData.Count % rowItemCount; - - if (offset != 0) - { - int emptyCount = rowItemCount - offset; - for (int i = 0; i < emptyCount; i++) - displayData.Add(null); - } - - displayData.Add(item); - displayData.Add(null); - displayData.Add(null); - } - else - { - displayData.Add(item); - } - } + CalculateSlotArea(); int startIndex = Mathf.Clamp(currentIndex * rowItemCount, 0, displayData.Count); int endIndex = Mathf.Clamp((currentIndex + visibleItemCount) * rowItemCount, 0, displayData.Count); @@ -196,60 +204,66 @@ namespace Studio.AssetLibraryTree { float spacingX = 25f; float spacingY = 0f; - int folderCount = 0; - float height = 0f; RectTransform viewport = scrollRect.GetComponent(); float contentWidth = viewport.sizeDelta.x; float itemWidth = itemPrefab.GetComponent().sizeDelta.x; - int allRowItemCount = Mathf.CeilToInt(data.Count / rowItemCount); - float totalHeight = allRowItemCount * (itemHeight + spacingY); + int folderRowCount = 0; + int allRowItemCount = Mathf.CeilToInt(displayData.Count / (float)rowItemCount); + float totalHeight = allRowItemCount * (itemHeight + spacingY) + scrollViewOffset * 2; + content.sizeDelta = new Vector2(contentWidth, totalHeight); for (int i = startIndex; i < endIndex; i++) { AssetLibraryItem item = displayData[i]; - - if (item == null) - continue; + if (item == null) continue; RectTransform itemRt; + float width; - var width = 0f; + // 폴더 처리 if (item.type == AssetLibraryItemType.folder) { - AssetLibraryScrollFolderUI itemUI = foldersPool.Get(); - width = scrollRect.content.sizeDelta.x; + var itemUI = foldersPool.Get(); itemUI.SetItemData(item); itemUI.transform.SetParent(content, false); itemRt = itemUI.GetComponent(); - height = folderHeight; activeFolders.Add(itemUI); + + width = contentWidth; } + // 파일 처리 else { - AssetLibraryScrollItemUI itemUI = GetItemUI(); - width = itemWidth; + var itemUI = GetItemUI(); itemUI.SetItemData(item); itemUI.SetSelected(selectedItems); itemUI.transform.SetParent(content, false); itemRt = itemUI.GetComponent(); - height = itemHeight; activeItems.Add(itemUI); - } + width = itemWidth; + } + + // 위치 계산 int row = i / rowItemCount; int col = i % rowItemCount; - float x = item.type == AssetLibraryItemType.folder? 0f:col * (width + spacingX) - ((rowItemCount - 1) * (width + spacingX)) / 2f; - float y = -(row-folderCount) * ( itemHeight + spacingY) + (-folderCount * (folderHeight + spacingY)) - height / 2f; + float x = (item.type == AssetLibraryItemType.folder) + ? 0f + : col * (width + spacingX) - ((rowItemCount - 1) * (width + spacingX)) / 2f; - itemRt.sizeDelta = new Vector2(width, height); + float y = -(row - folderRowCount) * (itemHeight + spacingY) + - (folderRowCount * (itemHeight + spacingY)) + - itemHeight / 2f - scrollViewOffset; + + itemRt.sizeDelta = new Vector2(width, itemHeight); itemRt.anchoredPosition = new Vector2(x, y); if (item.type == AssetLibraryItemType.folder) - folderCount++; + folderRowCount++; } } private AssetLibraryScrollItemUI GetItemUI()