자작 게임도 잘 부탁드려요~

adsense



유니티 2D 슈팅게임 개발일지 - 12일차 (문서 스크롤링 - ContentSizeFitter)

스크롤링되는 문서를 가진 팝업


기본적으로 단순 팝업입니다만,

이용약관이나 개인정보 처리방침, 공지사항 등
팝업창에 모두 담을 수 없어 세로로 스크롤링하면서 보는 문서를 만들어봤습니다.
(약관이나 개인정보처리방침에는 동의함을 의미하는 체크박스 또는 버튼이 따로 필요하고, 보통은 웹뷰어를 사용하지만 일단 대충 그런 용도)

팝업창의 하이어라키 구조


UGUI의 텍스트는 지정된 사이즈를 벗어나지 않기 때문에 아무리 긴 텍스트를 넣어도
잘리던가, Best Fit 옵션을 체크하면 폰트 크기를 줄이던가 하지 UI에 지정된 사이즈가 바뀌지는 않습니다.

그래서 사용하는 것이



ContentSizeFitter

①Best Fit 옵션은 쓰지 않습니다.
②컨텐트 사이즈 피터 컴포넌트를 추가하고,
③Vertical Fit를 Preferred Size로 지정합니다.

이렇게 하면 텍스트가 지정 영역을 벗어나는 경우, 세로 방향으로 확장된 크기를 얻을 수 있습니다.

그리고 아래 스크립트를 만들어 붙여줬습니다.

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class HelpScript : MonoBehaviour
  7. {
  8. public delegate void CallFunc();
  9. public Text head;
  10. public Text body;
  11. public CallFunc func;
  12. public RectTransform scContent;
  13.  
  14. public void SetUp(string head, string body, CallFunc func)
  15. {
  16. this.head.text = head;
  17. this.body.text = body;
  18. this.func = func;
  19.  
  20. var _y = this.body.GetComponent<RectTransform>().sizeDelta.y;
  21. if (_y > 780)
  22. {
  23. scContent.sizeDelta = new Vector2(0, _y + 40);
  24. this.body.transform.position = new Vector3(0, 386, 0);
  25. }
  26. }
  27.  
  28. public void Button()
  29. {
  30. if (this.func != null)
  31. func();
  32. Destroy(this.gameObject);
  33. }
  34. }
  35.  

head가 창 제목
body가 본문 내용

팝업창이 필요한 시점에서 Instantiate로 생성하고, SetUp을 호출하도록 하는 구조입니다.

그리고
20 : ContentSizeFitter에 의해 변경된 크기를 받아서
23 : 스크롤뷰의 컨텐츠 영역 사이즈를 재지정해 주고
24 : 텍스트의 위치도 재지정해줍니다. 텍스트 위치가 문자열 최상단을 가리키도록 ④pivot의 y값을 1로 주면 좌표 지정하기 편합니다.

그런데 이렇게 하면 안되더라구요.


텍스트 오브젝트에 문자열을 전달했다고 바로 바뀐 크기가 얻어지지 않고, 한 프레임 정도 뒤에 받아야 제대로 크기가 돌아옵니다.

유니티(특히 UGUI)는 이런 경우가 많던데.. 편법?으로 1프레임 뒤에 받도록 코루틴을 씁니다.
뭔가 올바른(?) 사용법이 있을거 같은데.

하여튼 제대로 동작하는 스크립트는 아래와 같습니다.

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class HelpScript : MonoBehaviour
  7. {
  8. public delegate void CallFunc();
  9. public Text head;
  10. public Text body;
  11. public CallFunc func;
  12. public RectTransform scContent;
  13.  
  14. public void SetUp(string head, string body, CallFunc func)
  15. {
  16. this.head.text = head;
  17. this.body.text = body;
  18. this.func = func;
  19. this.gameObject.SetActive(true);
  20. StartCoroutine(SetCT());
  21. }
  22. IEnumerator SetCT()
  23. {
  24. yield return new WaitForEndOfFrame();
  25.  
  26. var _y = this.body.GetComponent<RectTransform>().sizeDelta.y;
  27. if (_y > 780)
  28. {
  29. scContent.sizeDelta = new Vector2(0, _y + 40);
  30. this.body.transform.position = new Vector3(0, 386, 0);
  31. }
  32.   }
  33.  
  34. public void Button()
  35. {
  36. if (this.func != null)
  37. func();
  38. Destroy(this.gameObject);
  39. }
  40. }
  41.  

구현된 창입니다. 실제로 사용하는 개인정보처리방침을 몽창 넣어봤습니다.


그런데 cocos2d-x같은 경우, 이만큼 긴 문자열을 Label 객체로 만들면 렌더링이 엄청 느려집니다. (그래서 보통 웹뷰로 뺍니다)

현재는 잘 돌아가지만 실제 단말에서는 과연 어떨지.


그나저나 어째 게임 본체하고는 상관없는 주변 요소만 깔짝거리고 있는 느낌이네요..




덧글

댓글 입력 영역


Books

Geek라이프

기초부터 시작하는 모형 전자공작
박성윤 저

사이토 나오키의 일러스트 첨삭 레슨 Before & After
사이토 나오키 저/박수현 역

MSX&재믹스 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

핵심강좌! Cocos2d-x
이재환 저
예스24 | 애드온2
일본서적 전문사이트 NEPIC