[UE5] 리스트 위젯(ListView, TileView) 사용 방법
사용 방법 선요약
UListViewBase
를 상속받은ListView
,TileView
등의 리스트 위젯을 사용할 땐- 엔트리 위젯: 화면에 표시될 위젯
- 아이템: 정보를 저장할 오브젝트
- 리스트 위젯에는
항목 추가(Add Item)
로 아이템만 넣으면 되고, 엔트리 위젯은 리스트 위젯에서 관리해주니 리스트 위젯에 클래스만 지정해두면 된다. - 엔트리 위젯은 화면에 표시될 정도만 생성되며 재활용되고, 위젯이 화면에 나타날 때마다 다른 아이템을 담당하게 되므로 엔트리 위젯에
사용자 오브젝트 리스트 항목(IUserObjectListEntry)
인터페이스를 추가하고OnListItemObjectSet
이벤트를 구현해서 지정받은 아이템의 정보에 맞게 위젯을 설정해주면 된다.
착각했던 것...
노노그램 퍼즐게임에는 여러개의 퍼즐을 제공해서 사용자가 선택할 수 있게 해야하고, 퍼즐이 많아진 경우에는 폴더단위로 분류해서 폴더도 선택할 수 있게 해야한다.
이런 경우에는 여러개의 아이템을 띄워서 화면에 보여주고, 아이템의 개수가 많아서 화면을 넘어가면 스크롤도 가능해야하는데 이러한 경우에 사용하기 적당한 리스트 위젯이라는게 있었고, 그 중에서 TileView
를 사용하기로 정했다.
리스트 위젯에 대해 잘 모르는 상태에서 리스트 위젯의 노드들을 찾아보니 다른 위젯처럼 AddChild
와 비슷한 AddItem
노드가 있었다.
이게 리스트 위젯에 지정했던 엔트리 위젯을 추가하는건가보다 싶어서 위젯을 만들고, 화면에 표시될 정보를 설정해서 추가했더니 아이템 위젯에 표시되어야 할 정보가 설정되지 않고 기본 상태로만 나타나는 문제가 생겼다.
아이템 위젯을 만들어서 해당 아이템의 정보에 맞게 위젯을 설정했고, 로그를 출력해서 제대로 설정됐다는것도 확인했지만, 리스트 위젯에서 새로운 위젯을 또 만들어서 그 위젯을 화면에 띄우는 것이었다.
그리고 리스트 위젯이 생성한 위젯은 리스트 위젯 내부에서 관리되므로 아무때나 레퍼런스를 가져와서 설정할 수도 없었다.
그래서 리스트 위젯에 대해 좀 알아보니 아이템은 오브젝트 타입으로 관리된다는걸 알게됐다.
엔트리 위젯과 아이템을 혼동해서 둘이 같은것으로 착각했고 둘이 섞여있는 아이템 위젯을 만들게 된 것이다.
아이템의 개수가 많아지는 경우 최적화를 위해서 엔트리 위젯을 화면에 표시될 위젯만 담당하고, 아이템 오브젝트는 그 아이템에 대한 정보만 가지고 있는 식으로 역할을 나눈 것이다.
위 이미지의 주석에 나온 예시처럼 아이템이 200개 들어있는데, 화면에 한번에 표시될 수 있는 아이템이 최대 5개라면, 엔트리 위젯은 5개만 생성되고 더이상 생성되지 않고 재활용 된다.
아이템이 하나 가려지고 새로운 아이템이 화면에 나타나면 사라졌던 아이템을 담당하던 엔트리 위젯이 새로 나타난 아이템을 담당하게 되는 식이다.
리스트 위젯에는 아이템이 새로 화면에 나타나면 호출되는 항목 생성 시(On Entry Generated)
라는 이벤트가 있는데 이 이벤트가 호출될 때 전달하는 사용자 위젯을 보면 확실히 알 수 있다.
확인해보기 위해서 간단하게 구현했다.
엔트리 위젯이 WBP_Folder
이고, 이 사용자 위젯에는 텍스트가 있는데, SetFolderName
함수로 텍스트를 설정할 수 있다.
여기에 엔트리 위젯의 DisplayName을 전달해서 화면에 띄우게 했다.
가려졌던 아이템이 다시 화면에 나타타면 이전과는 다른 엔트리 위젯을 가지고 있고, 표시되는 순서도 섞이는 것을 확인할 수 있다.
그러므로 실제로 정보를 가지고있어야하는건 아이템 오브젝트로 해야하고, 화면에 표시되는 엔트리 위젯은 담당하는 아이템으로부터 정보를 받아서 새로 설정해야한다.
엔트리 위젯은 리스트 위젯에서 관리되기 때문에 지정된 인터페이스를 상속받아서 리스트 위젯의 상황에 맞게 동작하도록 함수를 구현해야한다.
그러한 인터페이스는 두가지가 있는데 하나는 위의 주석에 설명되어있었는 사용자 오브젝트 리스트 항목(IUserObjectListEntry)
이고, 다른 하나는 사용자 리스트 항목(IUserListEntry)
이다.
사용자 오브젝트 리스트 항목
이 사용자 리스트 항목
을 상속받은 것이다.
위 이미지는 리스트 위젯의 디테일에서 엔트리 위젯을 지정하는 곳인데 저곳에서 +버튼으로 사용자 위젯을 추가하면 기본적으로 사용자 리스트 항목
을 상속받은 상태로 사용자 위젯이 생성된다.
이런 방식으로 엔트리 위젯을 생성하는것은 추천하지 않는다.
인터페이스에서 구현해야할 함수는 OnListItemObjectSet
인데 이 함수는 사용자 오브젝트 리스트 항목
에만 있기 때문이다.
OnListItemObjectSet
함수는 리스트 위젯에 추가된 아이템 오브젝트를 입력 받는다.
이 함수를 구현해서 입력 받은 아이템 오브젝트의 정보에 맞게 엔트리 위젯을 설정하면 된다.
사용자 리스트 항목 인터페이스
를 상속받아도 동일하게 작동하도록 하는데에는 문제 없지만, 엔트리 위젯에서 구현하지는 못하고 리스트 위젯에서 항목 초기화 시(OnEntryInitialized)
이벤트를 통해서 구현할 수 있다.
항목 초기화 시
이벤트는 새로운 아이템이 화면에 나타나서 초기화 될 때 아이템과 엔트리 위젯을 전달해 주므로 동일하게 구현하는데에는 큰 문제가 없지만 엔트리 위젯을 외부에서 설정하는 것이라서 추천하지 않는다.