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