오늘은 밀린 R&D 정리 및 UI 개선 위주로 했다.
전치리는 컴파일 전에 소스 파일을 정리하여, 정의 된 부분만 컴파일 하는 것이다. 모든 전치리기는 # 지시어로 시작한다.
전처리는 위와 같은 형식이 있으며, 아래 예시와 같이 특정 플랫폼상으로 처리를 하기 위한 방법으로 사용할 수 있다.
아래와 같은 방식이 가장 많이 쓰일 예시이다.
이와 같이 스크립트를 구분한 후 프로젝트 Build 세팅에서 세팅을 변경할 때 적용되는 내용이 달라진다.
만약 커스텀으로 필요한 구분 기능이 있을 경우, Project Setting에서 Scripting Define Symbols를 정의한 후 해당 내용을 사용해주면 된다.
이와 같이 등록되어 있을 때 해당 심볼로 입력하면 스크립트가 활성화된다.
안드로이드 환경에서 게임을 만들 때 특히 힘들게 하는 요소는, 휴대폰 상에 빌드를 했을 때 디버깅이 어렵다는 것이다. 휴대폰상으로는 로그가 뜨지 않기 때문에 에러 코드를 추적하는 것이 쉽지 않다. 따라서 로그를 확인하기 위해 실제 회사에서도 많이 사용하는 무료 에셋이 있다.
Log Viewer라는 에셋이며, 테스트 상황에서 로그 추적도 가능하고, 실행 시간 측정도 가능하고 메모리 사용량 체크도 가능하다
빌드를 할 때 Development Build와 Autoconnect Profiler를 체크해보자.
핸드폰 기종도 선택한 뒤로 빌드해보자.
그러면 빌드가 완료되었을 때 핸드폰이 USB로 연결되어 있을 경우 이렇게 프레임 드랍이 발생하는지, 구간별로 확인할 수 있다.
또한 콘솔창에서도 빌드 Install 여부 및 내용을 확인할 수 있다.
다만 이와 같은 디버깅의 경우 에러가 표시되기는 하나 구체적인 에러 위치가 표시되지는 않는 것을 확인할 수 있다.
여기에서 Deep Profiling Support와 Script Debugging까지 활성화하면 어디에서 몇 번째 코드에서 에러가 났는지까지 체크가 가능하다. 다만 이 경우 실행 속도는 느려질 수 있으니 참고해야 한다.
따라서 완전 점검이 필요할 때만 해당 기능을 활성화하고, 그게 아니라 가볍게 테스트하는 환경이면 꺼 주는 것이 좋다.
빌드 파일로 테스트를 진행할 때 코드 몇 줄만 바꾸고 다시 빌드를 해야 하는 상황이 생길 수 있다. 다만 이와 같은 과정에서 게임의 용량이 클 때 빌드하는 데 시간이 많이 걸리게 될 것이다. 따라서 코드만 수정되는 경우에 이런 빌드 과정을 줄일 수 있는 패치 빌드 기능이 있다.
Development Build와 Autoconnect Profiler가 활성화된 상태에서, Build to Device 라는 옵션이 활성화되는 것을 확인할 수 있다.
해당 기능은 빌드를 하여 apk로 전환하여 파일로 뽑는 과정을 생략하고 테스트 디바이스로 바로 패치를 적용시키는 기능이다.
다만 코드 상의 변경점에 한해서 패치 빌드가 가능하며, 에셋의 변경 같은 경우는 Adressable을 활용해야 한다.
안드로이드 빌드 개발을 위해선 특히나 UI에 관해 유의해야 할 점이 있다. 바로 핸드폰 기종별로 해상도가 달라 UI가 어그러질 가능성이 크다는 점이다. 따라서, 추천하는 방식은 다음과 같다.
화면의 사이즈는 16:9 / 18:9 / 19.5:9 사이즈 기준으로 맞추는 것이 좋다. (갤럭시20 이후 시리즈 기준 19.5:9) 이러한 사이즈에서 세로의 길이가 더욱 길어지는 경우가 있기는 해도 가로 길이가 길어지는 경우는 잘 없기 때문에 해당 기준으로 UI의 가로가 변하지 않는 구조로 설계한다.
Minimum API는 Android 8.0 / 9.0 정도까지는 호환되도록 한다. (약 80% 유저 비율 충족)
Simulator를 통해 각종 기기에서의 화면 출력을 확인할 수 있고, Safe Area 라는 것을 확인할 수 있다. 이 Safe Area 내에서 UI가 구성될 수 있도록 처리하여 핸드폰 기종마다의 UI 차이를 줄일 수 있도록 한다.
방법은 이와 같이 SafeArea라는 Panel을 만들어두고, 아래와 같은 스크립트를 부착해보자.
Panel의 크기를 SafeArea의 크기에 맞춰주는 스크립트이다.
using UnityEngine;
public class SafeArea : MonoBehaviour
{
private Vector2 _minAnchor;
private Vector2 _maxAnchor;
private void Start()
{
var myRect = this.GetComponent<RectTransform>();
_minAnchor = Screen.safeArea.min;
_maxAnchor = Screen.safeArea.max;
_minAnchor.x /= Screen.width;
_minAnchor.y /= Screen.height;
_maxAnchor.x /= Screen.width;
_maxAnchor.y /= Screen.height;
myRect.anchorMin = _minAnchor;
myRect.anchorMax = _maxAnchor;
}
}
이와 같이 화면 크기가 맞춰진 것을 확인할 수 있다.
위와 같이 Safe Area를 지정한 이후, 고정되어야 할 UI에 관해 이와 같이 상단 패널과 하단 패널로 구별해보자.
TopPanel은 Anchor를 이와 같이 고정하고 BottomPanel은 이와 같이 고정한다.
이와 같이 설정하면 화면 크기가 변해도 상단 패널과 하단 패널 내부의 UI의 크기가 변하지 않고 고정되게 할 수 있다.