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

인피니티 스크롤 - 스크롤뷰상의 마지막 텍스트 갱신 관련 문의 입니다.

Lucyhigh opened this issue · comments

Service

  • WebView
  • AssetManagement
  • Communicator
  • LogViewer
  • Manager
  • [o ] UI
  • Profiler
  • Adapter
  • DLST

Version

2.7.0

Summary

인피니티 스크롤 사용 시 스크롤뷰의 마지막에 텍스트가 나오면 크기 갱신이 이루어지지않습니다.
현재 Content Size Setter 와 Layout Updater 스크립트를 통해 크기 갱신을 하고 있는데
스크롤 뷰가 닿는 마지막에 가면 카운터도 갯수에 포함이 되지 않고 크기 또한 Content Size Setter가 작동하지않습니다.
MoveToLateAData() 함수 또한 작동하지 않습니다.

Screenshots

If applicable, add screenshots to help explain your question.

Additional context

Add any other context about the problem here.

@Lucyhigh

안녕하세요.

확인중에 있으며 좀더 상세한 정보 부탁드립니다.

  1. 마지막에 텍스트가 나오는 부분이 ScrollItem 내부에 Text가 마지막에 있는건가요?
  2. 중간에 있는 ScrollItem은 정상작동하는건가요?
  3. 크기 갱신이 이루어 지지 않는 부분이 ScrollItem인가요?
  4. Content Size Setter 와 Layout Updater 스크립트는 어떤 구조로 붙어있나요?
    확인 부탁드립니다.
  1. 네 InfinityScroll 의 스크롤뷰 안에 텍스트를 띄웠을 때입니다. ScrollItem 내부 자식에 text가 있습니다.
  2. 처음부터 중간까지는 정상작동합니다.
  3. 크기 갱신이 이루어 지지않는 부분은 ScrollItem의 부모 크기 변화 문제입니다.

구조는

  • 부모 오브젝트 (InfiniteScrollItem 상속클래스)

  • ㄴ 자식 오브젝트(Content Size Setter ) - target : 부모 오브젝트

  •  ㄴ  자식 오브젝트(Layout Updater)
    
  •         ㄴ 자식 오브젝트 ( TextMeshpro)
    

이런식으로 되어있습니다.

@Lucyhigh

안녕하세요. 현재 설명주신 구조로는 제대로 동작할 것 같지 않습니다.
Unity에서 실시간으로 크기는 즉시 호출하면 0일 경우가 많고 다음 프레임에 갱신 될 경우가 많습니다.
순서 때문에 크기가 0으로 설정되어서 안보이는것으로 예상됩니다.
이를 Layout Updater와 Content Size Setter를 적절하게 배치하여 보완할 수 있습니다.

  1. Content Size Setter가 붙어있는target 크기도 width나 height가 0일것으로 예상되는데 맞을까요?
    • Content Size Setter는 붙어있는 오브젝트의 크기가 변했을때 그 target에 크기를 적용시키는 컴포넌트 입니다. 때문에 해당 오브젝트의 크기 확인이 필요합니다.
  2. 현재 Layout Updater가 붙어있는 두번째 자식 오브젝트가 변화가 없다면 Layout Updater 가 없어도 무방할 것으로 보입니다.
    • Layout Updater는 현재 크기가 바뀌었을떄 부모에 해당사항을 알려주기 위한 컴포넌트입니다. Content Size Fitter 같은 경우 다음 프레임에 크기가 업데이트 되기 때문에 갱신되기 전 Preferred Size를 호출해도 0이 나옵니다. 이 순서를 보완하기 위한 컴포넌트입니다.
  3. 마지막 TextMeshpro가 UpdateData때 설정될 것으로 보입니다. text크기에 맞춘 UI를 띄우는것이 목적으로 보이는데 Content Size Fitter나 Content Size Setter는 없는지 문의드립니다.
    • Text사이즈가 설정되었을때 Content Size Setter나 Layout Updater를 통해 부모에 전달 후 해당 크기를 적용하면 될것 같습니다. 강제적으로는 ScrollItem의 SetSize();를 통해 수정하실 수도 있습니다.

안녕하세요.
현재는 모든 오브젝트에 '크기'갱신이 된 상태입니다.
이전것에 답변으로는 1. 크기가 프리팹 크기였습니다.
2. 내일 좀 더 테스트 해보겠습니다. 감사합니다.
3. 업데이트에서 text를 설정하는게 맞습니다.
부모 오브젝트 (InfiniteScrollItem 상속클래스)

ㄴ 자식 오브젝트(Content Size Setter ) - target : 부모 오브젝트 // +ContentSizeFitter

ㄴ 자식 오브젝트(Layout Updater) // + ContentSizeFitter
ㄴ 자식 오브젝트 ( TextMeshpro)
이렇게 되어있습니다.
크기갱신은 아마 Vertical LayoutGroup 추가로 고쳐진것같습니다. + horizon LayoutGroup 도 자식에 붙어있습니다.

지금은 마지막 텍스트가 100사이즈라면 전체가 나오지 않고 부분만 스크롤뷰에 나오는 상태입니다. 그래서 다음 텍스트가 나오는 경우나 드래그를 해야 끝까지 갑니다.

이 것만 고치면 잘 될거같습니다.

@Lucyhigh
ScrollItem의 Size가 제대로 설정되어야 스크롤 뷰 에서도 스크롤이 제대로 됩니다.

여러 복합적인 요인에 인해 Text크기가 ItemSize에 반영이 되지 않은것 같습니다.
추천드리는것은 ContentSizeFitter 다른곳 제거하고 Content Size Fitter를 TextMeshpro에만 적용하고
설정은 바뀌는 축만 Preferred Size(아마 높이 Vertical Fit)으로 맞추시고
LayoutGroup과 ContentSizeFitter를 많이 쓰게 되면 크기 조정 순서로 복잡하고 알기가 힘들기 때문에
TextMeshpro내에서 프리팹에 Content Size Setter로 직접 Target에 크기를 직접 적용시켜주면 좋을 것 같습니다.

안녕하세요. 오전부터 계속 시도중인데 결과적으론 제약이 많아서 변경을 하려했지만 잘 안되네요...

다른것보다 스크롤뷰상의 마지막 텍스트 출력시 아이템 사이즈 만큼 이동하지않고 한 줄 정도의 크기만 이동하는게 문제인데

이것도 다음 텍스트 입력 시 텍스트 크기에 맞게 다음줄로 잘 이동해서
아마 느낌상으론 크기 갱신 이전에 MoveToLast()를 실행시키고
그 후에 크기 갱신을 부모에게 보내주는것 같습니다.

그래서 그 다음 텍스트를 입력해도 크기에 맞게 잘 나오는게 같네요.

TextMeshpro내에서 크기를 적용시켜줘봤는데 제가 원하는 방향이 있어서 LayoutGroup들과 ContentSizeFitter 을 뺄 경우에
뒤틀리는 경우가 있어 좀 더 시도를 해봐야 할것 같습니다...!
여러 요소들을 일단 정리를 좀 더 해보면서 테스트 해보겠습니다. 감사합니다.

_infiniteScroll.InsertData(infiniteScrollData, true); Debug.Log($"Scroll Item Size : {_infiniteScroll.GetItemSize(_infiniteScroll.GetItemCount() - 1)}"); _infiniteScroll.MoveToLastData();

입력 후 바로 맨 밑으로 가게 해둔 상태인데
혹시 몰라 디버그를 찍어보니
무조건 프리팹 원높이로 출력되었습니다.
변화된 높이값을 인식못하는것 같아
부모 오브젝트의 크기가 변하고 나서 MoveToLastData() 함수를 호출해 주면 어떨까 하고 있는데
관련된 함수가 있을까요?
Content Size Setter 호출 후 부모 오브젝트 크기 변화 시 MoveToLastData() 를 콜백으로 불러와볼까 합니다.

@Lucyhigh
네 ScrollItem의 SetSize(); 함수로 스크롤 Item 높이를 설정하면 적용됩니다.
Content Size Setter로 ScrollItem의 사이즈를 바꾸어도 내부에서 autoApplySize가 켜있을 경우OnRectTransformDimensionsChange를 통해 SetSize가 호출되지만 즉시 함수 호출의 경우 타이밍이 안맞을 수도 있기 때문에
SetSize를 직접 호출한 이후 MoveToLastData를 호출하는것을 권장합니다.

스크롤뷰 자체의 크기가 갱신되어야 하는데 그 문제가 SetSize 호출후 MoveToLastData를 호출해도 안됩니다.

그래서 InfiniteScrollItem의 SetItemSize에 Size 변수를 바꿔주어 해결했습니다!
빠른 피드백과 친절한 설명 감사했습니다!!!!