112 lines
5.7 KiB
C#
112 lines
5.7 KiB
C#
namespace Gpm.Ui.Sample
|
|
{
|
|
using Gpm.Ui;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
/// <summary>
|
|
/// InfiniteScroll의 각 아이템에 표시될 데이터를 정의하는 클래스입니다.
|
|
/// InfiniteScroll에 데이터를 사용하려면 반드시 `InfiniteScrollData` 클래스를 상속받아야 합니다.
|
|
/// 이 클래스는 데이터 모델(Model)의 역할을 합니다.
|
|
/// </summary>
|
|
public class TestItemData : InfiniteScrollData
|
|
{
|
|
/// <summary>
|
|
/// 각 데이터를 고유하게 식별하기 위한 인덱스입니다.
|
|
/// 예제에서는 이 값을 사용하여 아이템에 번호를 표시합니다.
|
|
/// </summary>
|
|
public int index = 0;
|
|
|
|
/// <summary>
|
|
/// 아이템에 표시될 추가적인 설명 텍스트입니다.
|
|
/// 예제에서는 데이터가 업데이트될 때 이 값을 변경하여 보여줍니다.
|
|
/// </summary>
|
|
public string description = string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// InfiniteScroll에 실제로 표시되는 UI 아이템(Prefab)을 제어하는 클래스입니다.
|
|
/// 이 클래스는 `InfiniteScrollItem`을 상속받아야 하며, 아이템의 UI 업데이트와 사용자 상호작용을 처리합니다.
|
|
/// 이 스크립트는 아이템으로 사용될 프리팹에 컴포넌트로 추가되어야 합니다.
|
|
/// 뷰(View)와 컨트롤러(Controller)의 역할을 합니다.
|
|
/// </summary>
|
|
public class TestItem : InfiniteScrollItem
|
|
{
|
|
[Tooltip("아이템의 텍스트를 표시할 UI Text 컴포넌트입니다. Unity 에디터의 인스펙터 창에서 연결해야 합니다.")]
|
|
public Text text = null;
|
|
|
|
[Tooltip("이 아이템이 세로 스크롤용인지 여부를 나타냅니다. 현재 예제에서는 사용되지 않지만, 필요에 따라 레이아웃을 구분하는 데 사용할 수 있습니다.")]
|
|
public bool isVertical = true;
|
|
|
|
/// <summary>
|
|
/// InfiniteScroll에 의해 데이터가 이 아이템에 할당될 때 호출되는 메서드입니다.
|
|
/// 이 메서드를 재정의(override)하여 `scrollData`를 실제 데이터 타입(`TestItemData`)으로 변환하고,
|
|
/// 그 데이터를 사용하여 UI 요소(텍스트, 이미지 등)를 업데이트해야 합니다.
|
|
/// 이 메서드는 아이템이 재활용될 때마다 새로운 데이터로 호출됩니다.
|
|
/// </summary>
|
|
/// <param name="scrollData">이 아이템에 표시할 데이터입니다. `InfiniteScrollData`를 상속받은 객체입니다.</param>
|
|
public override void UpdateData(InfiniteScrollData scrollData)
|
|
{
|
|
// 1. 부모 클래스의 UpdateData를 호출하여 기본 초기화 작업을 수행합니다.
|
|
base.UpdateData(scrollData);
|
|
|
|
// 2. 매개변수로 받은 scrollData를 실제 사용할 데이터 타입인 TestItemData로 형변환(casting)합니다.
|
|
TestItemData itemData = (TestItemData)scrollData;
|
|
|
|
// 3. StringBuilder를 사용하여 표시할 문자열을 효율적으로 구성합니다.
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append(string.Format("Item : {0} ", itemData.index));
|
|
|
|
// 4. 데이터의 인덱스가 짝수인지 홀수인지에 따라 추가 텍스트를 붙입니다.
|
|
if (itemData.index % 2 == 0)
|
|
{
|
|
sb.Append("(Even) ");
|
|
}
|
|
else
|
|
{
|
|
sb.Append("(Odd) ");
|
|
}
|
|
|
|
// 5. 데이터에 포함된 설명 텍스트를 추가합니다.
|
|
sb.Append(itemData.description);
|
|
|
|
// 6. 최종적으로 만들어진 문자열을 UI Text 컴포넌트에 할당하여 화면에 표시합니다.
|
|
text.text = sb.ToString();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 이 아이템이 클릭되었을 때 호출되는 메서드입니다.
|
|
/// 이 메서드는 Unity 에디터에서 아이템 프리팹에 있는 Button 컴포넌트의 OnClick() 이벤트에 연결해야 합니다.
|
|
/// </summary>
|
|
/// <example>
|
|
/// 1. 아이템 프리팹에 Button 컴포넌트를 추가합니다.
|
|
/// 2. Button 컴포넌트의 OnClick() 이벤트 리스너에 이 아이템 자기 자신을 등록합니다.
|
|
/// 3. 드롭다운 메뉴에서 `TestItem` -> `OnClick()`을 선택합니다.
|
|
/// </example>
|
|
public void OnClick()
|
|
{
|
|
// 부모 클래스(InfiniteScrollItem)의 OnSelect() 메서드를 호출합니다.
|
|
// 이 메서드는 InfiniteScroll에 '이 아이템이 선택되었다'는 사실을 알리고,
|
|
// InfiniteScrollSample에서 등록한 `AddSelectCallback` 콜백 함수를 실행시킵니다.
|
|
OnSelect();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 아이템의 크기를 동적으로 변경할 때 호출되는 예제 메서드입니다.
|
|
/// 이 메서드 또한 Button의 OnClick() 이벤트에 연결하여 사용할 수 있습니다.
|
|
/// 이 기능은 InfiniteScroll 컴포넌트의 `dynamicItemSize` 옵션이 활성화되어 있을 때만 정상적으로 동작합니다.
|
|
/// </summary>
|
|
public void OnChangeSizeClick()
|
|
{
|
|
// 30에서 400 사이의 랜덤한 크기 값을 생성합니다.
|
|
float size = Random.Range(30, 400);
|
|
|
|
// 부모 클래스의 SetSize() 메서드를 호출하여 아이템의 크기를 변경합니다.
|
|
// 스크롤 방향이 Vertical이면 높이(height)가, Horizontal이면 너비(width)가 변경됩니다.
|
|
// InfiniteScroll은 이 변경사항을 감지하고 레이아웃을 다시 계산합니다.
|
|
SetSize(size);
|
|
}
|
|
}
|
|
|
|
} |