에셋 라이브러리 스크롤 버그
This commit is contained in:
@@ -112,7 +112,7 @@ RectTransform:
|
|||||||
m_Father: {fileID: 1685799791316290074}
|
m_Father: {fileID: 1685799791316290074}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 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_AnchoredPosition: {x: 2, y: 0}
|
||||||
m_SizeDelta: {x: 8, y: 20}
|
m_SizeDelta: {x: 8, y: 20}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
@@ -1018,7 +1018,7 @@ MonoBehaviour:
|
|||||||
m_HandleRect: {fileID: 5808496954263173159}
|
m_HandleRect: {fileID: 5808496954263173159}
|
||||||
m_Direction: 2
|
m_Direction: 2
|
||||||
m_Value: 0
|
m_Value: 0
|
||||||
m_Size: 0.99998707
|
m_Size: 1
|
||||||
m_NumberOfSteps: 0
|
m_NumberOfSteps: 0
|
||||||
m_OnValueChanged:
|
m_OnValueChanged:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
@@ -1062,8 +1062,8 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 1}
|
m_AnchorMin: {x: 0, y: 1}
|
||||||
m_AnchorMax: {x: 0, y: 1}
|
m_AnchorMax: {x: 0, y: 1}
|
||||||
m_AnchoredPosition: {x: 210, y: -408.97}
|
m_AnchoredPosition: {x: 210, y: -431.02136}
|
||||||
m_SizeDelta: {x: 420, y: 817.93}
|
m_SizeDelta: {x: 420, y: 862.0427}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &7966294254755768478
|
--- !u!222 &7966294254755768478
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@@ -1741,7 +1741,7 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 1}
|
m_AnchorMin: {x: 0, y: 1}
|
||||||
m_AnchorMax: {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_SizeDelta: {x: 282.99957, y: 2}
|
||||||
m_Pivot: {x: 0, y: 1}
|
m_Pivot: {x: 0, y: 1}
|
||||||
--- !u!114 &2780744526690132257
|
--- !u!114 &2780744526690132257
|
||||||
@@ -2202,8 +2202,8 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 1}
|
m_AnchorMin: {x: 0, y: 1}
|
||||||
m_AnchorMax: {x: 0, y: 1}
|
m_AnchorMax: {x: 0, y: 1}
|
||||||
m_AnchoredPosition: {x: 210, y: -501.18732}
|
m_AnchoredPosition: {x: 210, y: -531.1099}
|
||||||
m_SizeDelta: {x: 420, y: 817.9348}
|
m_SizeDelta: {x: 420, y: 877.78}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!114 &5930958411786542109
|
--- !u!114 &5930958411786542109
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 0.5}
|
m_AnchorMin: {x: 0, y: 0.5}
|
||||||
m_AnchorMax: {x: 1, 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_SizeDelta: {x: 0, y: 35}
|
||||||
m_Pivot: {x: 0, y: 0.5}
|
m_Pivot: {x: 0, y: 0.5}
|
||||||
--- !u!114 &8577872390119345382
|
--- !u!114 &8577872390119345382
|
||||||
@@ -621,7 +621,7 @@ RectTransform:
|
|||||||
m_AnchorMin: {x: 0.5, y: 1}
|
m_AnchorMin: {x: 0.5, y: 1}
|
||||||
m_AnchorMax: {x: 0.5, y: 1}
|
m_AnchorMax: {x: 0.5, y: 1}
|
||||||
m_AnchoredPosition: {x: 0, y: 0}
|
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}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &9006872392457284266
|
--- !u!222 &9006872392457284266
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@@ -1128,7 +1128,7 @@ MonoBehaviour:
|
|||||||
m_Color: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
|
m_Color: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
|
||||||
m_RaycastTarget: 1
|
m_RaycastTarget: 1
|
||||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
m_Maskable: 0
|
m_Maskable: 1
|
||||||
m_OnCullStateChanged:
|
m_OnCullStateChanged:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
|
|||||||
@@ -367,8 +367,8 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0.5, y: 0}
|
m_AnchorMin: {x: 0.5, y: 0}
|
||||||
m_AnchorMax: {x: 0.5, y: 0}
|
m_AnchorMax: {x: 0.5, y: 0}
|
||||||
m_AnchoredPosition: {x: 0, y: -30}
|
m_AnchoredPosition: {x: 0, y: -15}
|
||||||
m_SizeDelta: {x: 110, y: 30}
|
m_SizeDelta: {x: 110, y: 20}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &499100886614822048
|
--- !u!222 &499100886614822048
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@@ -620,7 +620,7 @@ RectTransform:
|
|||||||
m_AnchorMin: {x: 0.5, y: 1}
|
m_AnchorMin: {x: 0.5, y: 1}
|
||||||
m_AnchorMax: {x: 0.5, y: 1}
|
m_AnchorMax: {x: 0.5, y: 1}
|
||||||
m_AnchoredPosition: {x: 0, y: 0}
|
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}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &9006872392457284266
|
--- !u!222 &9006872392457284266
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@@ -1105,7 +1105,7 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
m_AnchorMax: {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_SizeDelta: {x: 80, y: 80}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &5193183312611458682
|
--- !u!222 &5193183312611458682
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ namespace Studio.AssetLibraryTree
|
|||||||
private AssetLibraryItem lastSelectedItem = null;
|
private AssetLibraryItem lastSelectedItem = null;
|
||||||
|
|
||||||
private float itemHeight; // Height of a single item.
|
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 visibleItemCount; // Number of visible items that fit in the viewport.
|
||||||
private int currentIndex = -1; // The index of the first visible item.
|
private int currentIndex = -1; // The index of the first visible item.
|
||||||
|
|
||||||
@@ -42,7 +41,8 @@ namespace Studio.AssetLibraryTree
|
|||||||
|
|
||||||
public bool isSiblingEditable;
|
public bool isSiblingEditable;
|
||||||
|
|
||||||
int rowItemCount = 3;
|
private int rowItemCount = 3;
|
||||||
|
private float scrollViewOffset = 2f;
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
@@ -85,9 +85,7 @@ namespace Studio.AssetLibraryTree
|
|||||||
scrollRect.setToNextSiblingItem.AddListener(SetToNextSiblingItem);
|
scrollRect.setToNextSiblingItem.AddListener(SetToNextSiblingItem);
|
||||||
//아이템 하나당 높이값 저장
|
//아이템 하나당 높이값 저장
|
||||||
itemHeight = itemPrefab.GetComponent<RectTransform>().rect.height;
|
itemHeight = itemPrefab.GetComponent<RectTransform>().rect.height;
|
||||||
folderHeight = folderPrefab.GetComponent<RectTransform>().rect.height;
|
visibleItemCount = Mathf.CeilToInt(scrollRect.GetComponent<RectTransform>().sizeDelta.y / itemHeight) + 1;
|
||||||
float rowHeight = itemHeight + 10f; // row 간격 포함 (spacingY)
|
|
||||||
visibleItemCount = Mathf.CeilToInt(scrollRect.GetComponent<RectTransform>().sizeDelta.y / rowHeight) + 1;
|
|
||||||
|
|
||||||
searchInput.onValueChanged.AddListener(SearchData);
|
searchInput.onValueChanged.AddListener(SearchData);
|
||||||
//searchCancelButton.onClick.RemoveAllListeners();
|
//searchCancelButton.onClick.RemoveAllListeners();
|
||||||
@@ -124,6 +122,39 @@ namespace Studio.AssetLibraryTree
|
|||||||
{
|
{
|
||||||
return root.Find(name, type);
|
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()
|
public void SetData()
|
||||||
{
|
{
|
||||||
data.Clear();
|
data.Clear();
|
||||||
@@ -144,9 +175,8 @@ namespace Studio.AssetLibraryTree
|
|||||||
|
|
||||||
private void RebuildVisibleItems()
|
private void RebuildVisibleItems()
|
||||||
{
|
{
|
||||||
float rowHeight = itemHeight + 10f;
|
|
||||||
float scrollY = content.anchoredPosition.y;
|
float scrollY = content.anchoredPosition.y;
|
||||||
int newRowIndex = Mathf.FloorToInt(scrollY / rowHeight);
|
int newRowIndex = Mathf.FloorToInt(scrollY / itemHeight);
|
||||||
if (newRowIndex < 0) newRowIndex = 0;
|
if (newRowIndex < 0) newRowIndex = 0;
|
||||||
|
|
||||||
if (newRowIndex == currentIndex)
|
if (newRowIndex == currentIndex)
|
||||||
@@ -162,30 +192,8 @@ namespace Studio.AssetLibraryTree
|
|||||||
|
|
||||||
activeItems.Clear();
|
activeItems.Clear();
|
||||||
activeFolders.Clear();
|
activeFolders.Clear();
|
||||||
displayData.Clear();
|
|
||||||
|
|
||||||
foreach (var item in data)
|
CalculateSlotArea();
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int startIndex = Mathf.Clamp(currentIndex * rowItemCount, 0, displayData.Count);
|
int startIndex = Mathf.Clamp(currentIndex * rowItemCount, 0, displayData.Count);
|
||||||
int endIndex = Mathf.Clamp((currentIndex + visibleItemCount) * 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 spacingX = 25f;
|
||||||
float spacingY = 0f;
|
float spacingY = 0f;
|
||||||
int folderCount = 0;
|
|
||||||
float height = 0f;
|
|
||||||
|
|
||||||
RectTransform viewport = scrollRect.GetComponent<RectTransform>();
|
RectTransform viewport = scrollRect.GetComponent<RectTransform>();
|
||||||
float contentWidth = viewport.sizeDelta.x;
|
float contentWidth = viewport.sizeDelta.x;
|
||||||
float itemWidth = itemPrefab.GetComponent<RectTransform>().sizeDelta.x;
|
float itemWidth = itemPrefab.GetComponent<RectTransform>().sizeDelta.x;
|
||||||
|
|
||||||
int allRowItemCount = Mathf.CeilToInt(data.Count / rowItemCount);
|
int folderRowCount = 0;
|
||||||
float totalHeight = allRowItemCount * (itemHeight + spacingY);
|
int allRowItemCount = Mathf.CeilToInt(displayData.Count / (float)rowItemCount);
|
||||||
|
float totalHeight = allRowItemCount * (itemHeight + spacingY) + scrollViewOffset * 2;
|
||||||
|
|
||||||
content.sizeDelta = new Vector2(contentWidth, totalHeight);
|
content.sizeDelta = new Vector2(contentWidth, totalHeight);
|
||||||
|
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
{
|
{
|
||||||
AssetLibraryItem item = displayData[i];
|
AssetLibraryItem item = displayData[i];
|
||||||
|
if (item == null) continue;
|
||||||
if (item == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
RectTransform itemRt;
|
RectTransform itemRt;
|
||||||
|
float width;
|
||||||
|
|
||||||
var width = 0f;
|
// 폴더 처리
|
||||||
if (item.type == AssetLibraryItemType.folder)
|
if (item.type == AssetLibraryItemType.folder)
|
||||||
{
|
{
|
||||||
AssetLibraryScrollFolderUI itemUI = foldersPool.Get();
|
var itemUI = foldersPool.Get();
|
||||||
width = scrollRect.content.sizeDelta.x;
|
|
||||||
itemUI.SetItemData(item);
|
itemUI.SetItemData(item);
|
||||||
itemUI.transform.SetParent(content, false);
|
itemUI.transform.SetParent(content, false);
|
||||||
itemRt = itemUI.GetComponent<RectTransform>();
|
itemRt = itemUI.GetComponent<RectTransform>();
|
||||||
height = folderHeight;
|
|
||||||
activeFolders.Add(itemUI);
|
activeFolders.Add(itemUI);
|
||||||
|
|
||||||
|
width = contentWidth;
|
||||||
}
|
}
|
||||||
|
// 파일 처리
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AssetLibraryScrollItemUI itemUI = GetItemUI();
|
var itemUI = GetItemUI();
|
||||||
width = itemWidth;
|
|
||||||
itemUI.SetItemData(item);
|
itemUI.SetItemData(item);
|
||||||
itemUI.SetSelected(selectedItems);
|
itemUI.SetSelected(selectedItems);
|
||||||
itemUI.transform.SetParent(content, false);
|
itemUI.transform.SetParent(content, false);
|
||||||
itemRt = itemUI.GetComponent<RectTransform>();
|
itemRt = itemUI.GetComponent<RectTransform>();
|
||||||
height = itemHeight;
|
|
||||||
activeItems.Add(itemUI);
|
activeItems.Add(itemUI);
|
||||||
|
|
||||||
|
width = itemWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 위치 계산
|
||||||
int row = i / rowItemCount;
|
int row = i / rowItemCount;
|
||||||
int col = i % rowItemCount;
|
int col = i % rowItemCount;
|
||||||
|
|
||||||
float x = item.type == AssetLibraryItemType.folder? 0f:col * (width + spacingX) - ((rowItemCount - 1) * (width + spacingX)) / 2f;
|
float x = (item.type == AssetLibraryItemType.folder)
|
||||||
float y = -(row-folderCount) * ( itemHeight + spacingY) + (-folderCount * (folderHeight + spacingY)) - height / 2f;
|
? 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);
|
itemRt.anchoredPosition = new Vector2(x, y);
|
||||||
|
|
||||||
if (item.type == AssetLibraryItemType.folder)
|
if (item.type == AssetLibraryItemType.folder)
|
||||||
folderCount++;
|
folderRowCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private AssetLibraryScrollItemUI GetItemUI()
|
private AssetLibraryScrollItemUI GetItemUI()
|
||||||
|
|||||||
Reference in New Issue
Block a user