nhn / gpm.unity

A brand of NHN providing free services required for game development.

Home Page:https://gameplatform.nhncloud.com/en/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

몇몇 InfiniteScroll 내부 오브젝트가 노출되지 않는 현상이 있어 문의드립니다.

lumiereent opened this issue · comments

Service

  • WebView
  • AssetManagement
  • Communicator
  • LogViewer
  • Manager
  • UI
  • Profiler
  • Adapter
  • DLST

Version

Common 2.3.1 / UI 2.7.3

Summary

몇몇 InfiniteScroll 내부 오브젝트가 노출되지 않는 현상이 있어 문의드립니다.

Screenshots

캡처1
캡처2

Additional context

안녕하세요 대사창의 이전대사 복원 목적으로 InfiniteScroll을 통해 로그창 기능을 만들고 있습니다.

동작 과정은 다음과 같이 구현하였습니다.

  1. 기본적으로 팝업 오브젝트는 열기 전까지는 infiniteScroll이 부착되어있는 오브젝트가 비활성화 상태입니다.

  2. 대사창을 넘길 때마다 logData를 백업해 둡니다. (이때는 아직 infiniteScroll.InsertData를 호출하지 않습니다.)

  3. 로그창 팝업을 여는 함수를 실행합니다.

  4. logData에 있는 요소들을 infiniteScroll.InsertData("스크롤 데이터") 를 통해 삽입합니다.

  5. _infiniteScroll 스크립트가 부착되어있는 오브젝트를 활성화 시킵니다.

  6. infiniteScroll.MoveToLastData()를 통해 스크롤을 가장 아래로 내립니다.

이때 문제가 되는 것이 InsertData를 1회만 호출하는 경우 정상적으로 동작하는데
루프문을 통해 2회이상 InsertData를 호출한 것은

'1번째 스크린샷' 과 같이 부분 노출이 되지 않는 현상이 생깁니다.
그리고 이때 스크롤바를 잠깐 움직이면 다시' 2번째 스크린샷'과 같이 정상적으로 노출됩니다.

이것이 유니티 자체 문제인지는 잘 모르겠는데

이런 현상을 개선할 수 있도록 마지막에 스크롤을 강제로 갱신하거나 하는 방법이 있을까요?

@lumiereent

안녕하세요. 버그 제보 감사드립니다.

우선 infiniteScroll의 UpdateAllData 함수를 호출하면 전체를 갱신할 수 있습니다.

확인 결과 보내주신 방법으로는 재현이 되지 않아 몇 가지 질문드립니다.

  1. 팝업이 열릴 때 사이즈가 조절되는 애니메이션이 있나요?
  2. InsertData가 2회 이상인 것이라는 건 InsertData(data) 같이 데이터를 여러 개 넣은 건가요? InsertData(dataList) 같이 리스트를 여러 번 넣은 것인가요?
  3. Scroll의 Dynamic Item Size 체크 여부 확인 부탁드립니다.
  4. ScrollItem의 Auto ApplySize 체크 여부 확인 부탁드립니다.
  5. 내부에 OnRectTransformDimensionsChange 함수 또는 Content Size Fitter와 같은 컴포넌트로 사이즈 변경이 있는지 확인 부탁드립니다.

재현이 안된 테스트는 아래와 같이 진행했습니다. 확인 부탁드립니다.
1, 초기 부모 오브젝트 비활성화, 스크롤 오브젝트 비활성화 상태
2. 데이터 list로 여러개 추가 보관
3. 부모 오브젝트 활성화
4. InsertData로 보관된 리스트 추가
5. 스크롤 오브젝트 활성화
6. MoveToLastData함수 호출로 진행하였습니다.

제가 계속 테스트 해 본 결과

스크롤 오브젝트(ScrollRect가 부착되어 있는 오브젝트)가 비활성화 된 상태에서
MoveToLastData()함수 내부의 scrollRect.normalizedPosition = Vector2.zero; 를 호출해도
간헐적으로 동작하지 않는 유니티 자체 이슈인 것 같습니다.

그래서 아에 MoveToLastData를 사용하지 않거나,
이 부분만 오브젝트가 활성화 된 이후 호출하도록 수정하니 정상 작동합니다.

@lumiereent 유니티 버전 확인 부탁드립니다. 해당 버전으로 확인해보겠습니다.

2021.03.01f LTS 버전입니다.

gameObject.SetActive(true) 이후 즉시 MoveToLastData()를 호출하던 로직을
gameObject.activeInHierarchy == true가 될때까지 조건체크 후 MoveToLastData()를 호출하니 잘 작동합니다.

개선하여 2.8.0 배포하였습니다.