최종 프로젝트 개발에 들어가기 전 사용해야 할 UI에 대해 복습하는 시간을 가져보았다
Layout Group
: 자식 게임오브젝트로 들어온 UI들이 자동으로 정렬해 주는 컴포넌트
종류
Vertical(수직), Horizontal(수평) , Grid(그리드)
Verticla, Horizontal 프로퍼티
Padding : 게임 오브젝트의 넓이나 높이가 늘어나고 자식 게임오브젝트들을 감싸는 공간이 생긴다
Spacing (간격) : 자식 게임오브젝트 사이의 간격
Child Alignment (자식정렬) : 레이아웃 그룹 컴포넌트가 부착된 게임 오브젝트 내부에서 어느 위치를 중심으로 정렬할 것인가를 의미
Control Childe Size (자식 크기 조절) : 단독으로는 큰 의미를 가지지 않지만 Child Force Expand 프로퍼티와 함께 사용하면 레이아웃 그룹 컴포넌트가 부착된 게임오브젝트의 사이즈만큼 하위 UI들의 크기가 커진다
혹은 레이아웃 그룹의 하위에 속하는 요소들이 Layout Element(레이아웃 요소) 컴포넌트를 가지는 경우에도 의미를 가지고 동작한다 Control Child Size를 넓이 옵션만 활성화 한 뒤, Layout Element의 Preferred Width와 Preferred Height를 둘 다 활성화하고 변경했지만, 넓이만 변경된다
Use Child Scale (자식 크기 사용) : 하위의 UI들을 정렬할 때, 자식 게임오브젝트의 스케일 값을 사용할 것인가를 정한다
(즉, 자식 오브젝트의 크기에 따라서 정렬 위치가 바뀐다)
Child Force Expand (자식 강제 확장) : 자식 오브젝트의 크기를 Layout Group 컴포넌트가 부착된 게임오브젝트의 크기에 맞춰서 강제로 늘어나게 만드는 옵션이다
Grid 프로퍼티 (Padding, Child Alignment는 위와 같음)
Cell Size(셀 크기) : Grid Layout Group에 속하는 UI들의 크기를 지정
StartCorner(시작 코너) : 자식 UI를 정렬할 때 시작 위치를 정하는 기능으로 Upper Left (왼쪽 위) , Upper Right(오른쪽 위) , Lower Left(왼쪽 아래), Lower Right(오른쪽 아래)로 설정할 수 있고 위치를 제대로 잡기 위해서는 Child Alignment와 같이 사용하는 것이 좋다
Start Axis(시작 축) : 수직으로 먼저 정렬할 것인지, 수평으로 먼저 정렬할 것인지를 정하는 옵션
(게임오브젝트의 가장 아래쪽 행까지 채우고 나면 그다음 옆에 열을 추가하는 방식으로 정렬)
Constraint(제약) : 기본적으로는 Flexible로 설정된다
Flexible (유연성 있는 상태) -> 2x2, 3x3, 4x4 형태로 정사각형으로 정렬된다
(NxN 레이아웃이 수용할 수 있는 UI의 개수를 넘어가면 N+1xN+1 행렬로 자동으로 확장된다)
Fixed Column Count -> 열의 개수를 고정시킨 채로 행을 추가
Fixed Row Count -> 행의 개수를 고정시킨 채로 열을 추가
Layout Group은 동적으로 추가/제거되는 UI를 정렬하기에 좋은 컴포넌트이다 하지만 동적이지 않은 UI더라도 일정한 간격을 두고 배치되는 UI라면 번거롭게 위치를 일일이 계산해서 배치하는 것보다 빠르게 작업할 수 있게 도와준다
또한 콘텐츠 사이즈 피터와 스크롤 뷰와 함께 사용하면 좋다
주의사항
레이아웃 그룹의 사용을 자제해야 된다는 유니티 최적화 팁이 있다 레이아웃 그룹 내에서 하나 이상의 자식 요소가 변경되면 레이아웃 시스템이 변경된 것으로 인식해서 레이아웃 그룹 내의 각 UI 요소 1개마다 최소 1회의 GetComponents 호출을 수행한다고 한다 단순 GetComponents 호출이 아닌 연속적인 GetComponents 호출은 성능에 악영향을 끼치기 때문에 좋지 않다
그래서 직접 구현하거나 잘 써야 한다
스크롤뷰
게임에서 UI 창보다 크거나 많은 내용이 들어가는 콘텐츠를 UI 안에 담기 위해서는 사용하는 방법이 여러 가지가 있다
대표적으로 버튼 같은 것을 이용해서 페이지를 넘기거나 스크롤을 이용해서 UI 내에서 이동하면서 볼 수 있는 스크롤뷰를 사용한다 어떤 것을 사용할 것인지를 결정하는 차이점은 연속성이라는 것이다 콘텐츠가 연속적이지 않고 흐름이 끊어져도 상관없다면 버튼을 이용하여 페이지를 넘기고 콘텐츠가 커다란 하나의 것이거나 연속적인 면이 중요해서 연결되어야 한다면 스크롤뷰가 적당하다
유니티에서는 스크롤뷰를 지원한다 UI - Scroll View를 선택하고 Hierarchy를 보면
Scroll View (생성한 스크롤 뷰)
-> Viewport(표시하고자 하는 콘텐츠가 보일 곳)
-> Content(표시하고자 하는 내용물)
-> Scrollbar Horizontal (수평 스크롤바)
-> Scrollbar Vertical (수직 스크롤바)
이렇게 생성된다
Scroll View의 옵션들은 Scroll Rect라는 컴포넌트에 대부분 포함되어 있다
Scroll Rect 프로퍼티
Horizontal : 스크롤 뷰의 수평 이동을 허용할 것인가
Vertical: 스크롤 뷰의 수직 이동을 허용할 것인가
Movement Type : 스크롤 이동 타입
-> Unrestricted : 콘텐츠가 스크롤 밖으로 나가도 제한하지 않는다
-> Elastic : 콘텐츠가 스크롤 밖으로 나가면 정해놓은 값 (Elasticity) 만큼의 속도로 스크롤 뷰 안으로 돌아온다
-> Clamped : 콘텐츠가 스크롤 밖으로 나가지 못하게 완전히 제한한다
Inerria (관성) : 이 값을 켜두면 스크롤을 끌다가 놓으면 바로 정지하지 않고 끌던 속도가 점점 감소하며 멈춘다
Scroll Sensitiveity : 스크롤 민감도
Horizontal Scrollbar : 수평 스크롤바
-> visivility : 스크롤바가 보이는 방식 ( 항상 보이는 방식인지 콘텐츠의 크기에 따라 보이는 방식인지 설정)
Vertical Scrollbar : 수직 스크롤바 ( 수평 스크로바와 같은 내용)
Content는 UI에서 보여주고자 하는 내용들은 모두 이 오브젝트의 자식 오브젝트로 배치해야 한다
그리고 이 Content의 크기에 따라 스크롤 뷰의 크기가 결정된다
초기 상태에서는 RectTransform의 앵커가 top, stretch 상태로 설정되어 있어서 크기 값이 Right, Height로 되어있는데 좀 더 직관적으로 보려면 top, left 상태로 변경하면 Width, Height로 볼 수 있다
고정된 크기의 스크롤 뷰라면 Inspector 창에서 크기를 직접 조절해도 상관은 없지만 아이템의 개수와 같은 요소를 통해서 스크롤 뷰의 크기가 달라진다면 Content의 크기를 스크립트로 조절하거나 Content Size Fitter 컴포넌트를 사용하면 된다
Content Size Fitter
: 컴포넌트가 붙어있는 오브젝트의 크기를 내용물, 콘텐츠의 크기에 맞게 만들어주는 역할
프로퍼티
Horizontal Fit, Vertical Fit : 가로크기와 세로 크기를 설정하는 옵션
-> Unconstrained : UI의 크기를 콘텐츠에 맞추지 않는 옵션으로 UI의 크기를 직접 맞추거나 고정된 크기를 사용해야 하는 경우 사용하면 되는 옵션
-> MinSize : 레이아웃 요소의 최소 크기를 기준으로 UI 크기를 맞추는 옵션으로 단독으로 사용되는 경우는 거의 없고 Layout Group 계열의 컴포넌트와 함께 사용된다
-> Preferre Size : 기본적인 콘텐츠의 크기에 따라 UI의 크기를 맞추는 옵션으로 위의 예시 이미지처럼 텍스트나 이미지에 단독으로 콘텐츠 사이즈 피터를 사용하는 경우에 주로 사용된다
* 콘텐츠 사이즈 피터로 인해 RectTransform의 크기가 변경될 때는 UI의 피벗을 중심으로 조정되기 때문에, 피벗을 사용해서 Ui의 크기가 조정되는 방향을 조절할 수 있다
기술면접 대비 5일 차
Q: 가비지 컬렉터에 대해 설명해주세요
A: .NET 프레임워크의 일부로, 동적으로 할당된 메모리에서 더이상 사용되지 않는 객체들을 식별하고 자동으로 메모리를 해제하는 역할을 합니다
장점으로는 개발자가 힙에 할당한 메모리들을 완벽하게 관리할 필요가 없어 메모리 누수를 방지해줍니다
하지만 어떤 메모리를 해제할지 결정하는 데 비용이 들고,가비지 컬렉터가 메모리 해제 시점을 추적해야하므로 일정한 오버헤드가 발생합니다
* 가비지컬렉터가 언제 실행되는지 ?
:사용 가능한 메모리가 부족한 경우, 새로운 객체가 생성될 때 마다 일정 간격으로 실행되거나, 개발자가 GC.Collect메서드를 호출하여 가비지 컬렉션을 요청할 경우 등 상황에 따라 유연하게 동작합니다 그래서 개발자는 메모리 해제 시점을 알 수 없다는 단점도 있습니다
'TIL' 카테고리의 다른 글
[TIL] 내일배움캠프_Unity 최종 프로젝트 2주차: 주요 메카닉 구현 1, 기술 면접 대비 7일차 (1) | 2023.10.30 |
---|---|
[TIL] 내일배움캠프_Unity 최종 프로젝트 1주차: ScriptableObject 복습, 기술 면접 대비 6일차 (0) | 2023.10.30 |
[TIL] 내일배움캠프_Unity 최종 프로젝트 1주차: 기획 5, 기술 면접 대비 4일차 (0) | 2023.10.27 |
[TIL] 내일배움캠프_Unity 최종 프로젝트 1주차: 기획 4, 기술 면접 대비 3일차 (1) | 2023.10.27 |
[TIL] 내일배움캠프_Unity 최종 프로젝트 1주차: 기획 3, 기술 면접 대비 2일차 (1) | 2023.10.25 |