Game/Unity 17

[Unity] VR 시뮬레이터 만들기

VR 시뮬레이터 개요 VR 개발을 하다 보면, 현재 내 상황에 대한 디버깅이 필요한 순간이 있을 것이다. 예를 들어, 운전을 하는 VR을 개발 중이면 현재 개발 단계에서 어느 부분이 모자란지에 대한 정보가 필요한데, 이를 확인하기 위해 매번 빌드하는 과정이 상당히 번거롭다. 따라서 간단한 시뮬레이터를 구현하여 이를 해결해 보는 시간을 가지도록 해보겠다. 본문 전처리 지시문 유니티에서 코드를 실제 빌드 환경과 시뮬레이션 환경을 나누어 처리하고자 할 때 주로 전처리 지시문(Preprocessor Directives)을 사용한다. 전처리 지시문을 활용하면 특정 조건에 따라 코드의 일부를 컴파일러에서 제외하거나 포함시킬 수 있다. 이를 통해 실제 빌드와 에디터 내에서의 시뮬레이션을 구분할 수 있다. 유니티에서 ..

Game/Unity 2024.02.04

[Unity] Google Cardboard Head Tracking

VR 세팅 개요 이전 게시글에서는 주어진 예제를 기반으로 VR 환경을 구축했었다. 이번에는 VR 개발에 필요한 최소한의 패키지만을 받아와서, 직접 VR을 개발할 수 있는 최소한의 기본 환경을 만들어보도록 하겠다. 본문 환경 세팅 일단 Cardboard XR 플러그 인을 설치해야 하므로, Package Manaer에서 깃 URL을 추가해 준다. https://github.com/googlevr/cardboard-xr-plugin.git 그리고 해당 게시글의 VR 빌드 세팅 부분을 그대로 따라 하면 된다. 카메라 설정 여기가 헤드셋의 움직임을 감지하기 위해 메인 카메라에 Tracked Pose Driver 컴포넌트를 추가해줘야 한다. Google Cardbard는 머리 회전을 감지하는 기능에 초점을 맞추었기..

Game/Unity 2024.02.03

[유니티] VR setting with Google Cardboard (2)

VR 빌드 세팅 Edit -> Project Setting을 들어가 Player로 이동하자. 그리고 Resolution and Presentation을 클릭해 해상도를 설정하자. 먼저 Optimized Frame Pacing 기능을 끄자. 해당 기능은 프레임 속도의 편차를 줄이기 위해 프레임을 균등하게 분배해 부드러운 게임 플레이를 구현하는 기능이다. 하지만 VR에서는 이 기능이 오히려 성능 저하를 일으킬 수 있으므로 비활성화하는 것이 좋다. 이는 VR이 낮은 지연 시간과 빠른 반응 속도가 중요하다는 점에서 기인한다. 또한 기본 방향을 가로 왼쪽 또는 가로 오른쪽으로 설정하면 되는데, 일반적으로 VR 헤드셋은 두 눈으로 볼 때 자연스러운 가로 화면을 제공하기 때문이다. 이제 Others Settings로..

Game/Unity 2023.11.04

[유니티] VR setting with Google Cardboard (1)

VR 세팅 개요 Google Cardboard와 Unity를 연동해 VR을 세팅하는 법에 대해 배워보자. 안드로이드 기준으로 SDK 세팅 -> 환경 세팅 -> 빌드 세팅으로 나뉜다. 이때 본인이 맥북을 따로 갖고 있는 것이 아니라면 안드로이드를 선택하는 것을 권장한다. 유니티를 IOS로 빌드할 때, 그 과정이 까다롭기 때문이다. 본문 SDK 설치 시작하기에 앞서, 원활한 디버깅을 위해 Android Studio의 SDK를 설치할 것이다. SDK는 Software Develpment Kit의 약자로서, 소프트웨어 기술자가 사용하여 특정한 응용 프로그램을 만들 수 있게 해주는 개발 도구의 집합이다. 해당 링크를 타고 들어가 안드로이드 스튜디오를 다운로드하여 주자. 안드로이드 스튜디오를 다운로드하였으면, To..

Game/Unity 2023.11.02

[유니티] 한글 폰트 깨짐 with Text Mesh Pro

개요 유니티로 게임 개발을 진행하던 중, 한글 문자가 깨져서 사각형으로 나타나는 문제를 발견하였다. 이 현상은 주로 폰트가 한글을 지원하지 않거나, 파일의 인코딩이 잘못된 경우에 발생하는데, 이제부터 이 문제를 해결하는 방법에 대해 살펴보겠다. 폰트 다운 유니티에서 기본적으로 사용하는 LiberationSans 폰트는 기본적으로 한글을 지원하지 않는다. 특정 폰트가 한글을 지원하지 않을 때, 이를 직접 바꾸는 것은 불가능하다. 따라서 다른 한글을 지원하는 폰트를 찾아서 다운로드하여야 한다. 새로운 폰트는 에셋 스토어 혹은 구글링 등을 통해 다운로드하면 된다. 필자의 경우 넥슨의 메이플스토리 서체와 TextMesh Pro를 기준으로 진행하겠다. 해당 사이트의 TTF 파일을 다운로드하여 폰트 작업이 필요한 ..

Game/Unity 2023.06.18

[유니티] 글자 하나씩 출력하기

개요 게임을 진행하다 보면 NPC와 대화하는 일이 잦다. 이때 NPC가 출력하는 메시지를 보면, 마치 말을 하듯이 글자가 하나씩 출력되는 것을 볼 수 있는데, 이러한 효과를 어떻게 구현했는지 궁금증이 생겼다. 관련 자료들을 알아본 결과, 유니티에서 제공하는 코루틴 메서드를 이용하면 된다는 것을 알았다. 코루틴(Coroutine) 코루틴(coroutine)은 작업을 다수의 프레임에 분산할 수 있게 하는 기능이라고 한다. 즉, 원하는 시간만큼 함수를 멈춘 뒤 시작하게 할 수 있는 기능을 구현한 함수로서, 글자를 깜빡이게(twinkle) 출력하는 등의 기능을 구현할 때 유용하게 사용된다. 이때 시간 지연을 도입하려면 WaitForSeconds를 사용하면 된다. 예를 들어, 3초 뒤 텍스트의 색을 red로 바꾸..

Game/Unity 2023.04.30

[유니티] 오브젝트 풀링(Object Pooling)

개요 게임에서 오브젝트를 생성하고 삭제하는 작업은 메모리 사용량이 늘어나는 문제와 성능 저하의 원인이 된다. 예를 들어 FPS 게임에서 플레이어가 총을 쏠 때 매번 탄환을 생성하는 것은 성능적으로 봤을 때 비효율적이다. 이러한 문제점을 해결하기 위해 생긴 개념이 오브젝트 풀링이다. 개념 오브젝트 풀링은 게임 오브젝트를 필요한 만큼 미리 생성해 두고 풀에 쌓아두는 기법으로, 오브젝트를 매번 생성하고 삭제하는 것보다 메모리 사용량과 성능 저하를 줄일 수 있다. 다만, 초기에 더 많은 메모리를 사용한다는 단점이 있다. 이 방식은 풀에 오브젝트를 생성한 후, 새로운 오브젝트가 필요할 때 풀에 있는 오브젝트를 가져다 사용하며, 필요가 없어지면 오브젝트를 비활성화하고 풀에 반환하는 방식으로 동작한다. 이해를 돕기 ..

Game/Unity 2023.04.13

[유니티] 방향, 크기, 회전 (2)

유니티 C# 벡터 Vector type 앞선 [유니티] 방향, 크기, 회전 (1) 포스트에서는 수학적 의미에서 벡터를 다루었다. 이번 게시글에서는 게임 개발에 필요한 기본적인 벡터 수학을 유니티 C#에 적용하는 방법을 알아보자. 유니티는 벡터를 표현하기 위해 Vetor2, Vector3, Vector4를 제공하고 있다. 가장 많이 사용할 Vector3의 정의를 보기 위해 유니티 공식 홈페이지에 접속해 보면 다음과 같이 설명하고 있다. 이때 주목해야할 점은 Vector 타입이 구조체(struct)로 선언되어 있다는 점이다. 클래스로 선언하지 않고 구조체를 이용한 이유는 값 타입으로 동작하게 하여 복사를 했을 때 수정되는 것을 막기 위해서다. 직관적으로 이해하기 위해 다음 예제를 보도록 하자. Vector3..

Game/Unity 2023.03.17

[유니티] 방향, 크기, 회전 (1)

벡터 수학 벡터의 정의와 좌표의 의미 유니티에서 벡터를 이해하는 것은 매우 중요하다. 벡터(Vector)란 일반적으로 크기와 방향을 가진 물리량으로 정의하지만, 세 가지 관점으로 넓혀서 정의할 수 있다. 공간상의 화살표로서의 벡터 나열된 숫자 데이터를 묶는 단위로서의 벡터 벡터 연산을 만족하고 정해진 개수의 원소를 가지는 벡터 일반적으로 게임 개발에서 벡터는 주로 위치, 방향, 속도를 나타낼 때 사용된다. 이를테면 위치를 표현하기 위한 Vector3(0, 1, 1)은 어떤 물체가 x = 0, y = 1, z =1의 위치에 존재한다고 해석할 수 있다. 이를 유니티의 메서드인 DrawLine을 이용해 그려보자. Debug.DrawLine()은 start와 end 사이를 선으로 그려주는 메서드다. 이를 이용하..

Game/Unity 2023.02.15

[유니티] 유니티 엔진 원리

상속 게임 엔진은 이미 완성된 기반 코드를 제공한다. 지금까지 포스팅해온 게시글을 움직이는 것(translate)과 충돌하는 것(OnTrigger)과 같이 이미 작성된 코드를 재사용하여 게임을 만들었다. 이러한 '재사용'과 관련이 깊은 키워드는 바로 상속이다. 하지만 유니티 엔진에서는 이러한 상속을 유니티를 동작시키는 데 있어 핵심이라고 부르진 않는다. 왜 그럴까? 바로 상속의 한계 때문이다. 게임을 만들 때 상속의 한계는 명확하다. 상속에 의존하다보면 오히려 코드의 재사용이 힘들어지고, 추후에 자식 클래스와 부모 클래스의 기능이 충돌하는 등 더욱 번거로워지기 때문이다. 예를 들어보자. RPG 게임에서 플레이어와 NPC, Monster를 상속을 이용해 만든다고 가정해보면, 이들의 기반인 Human 클래스..

Game/Unity 2023.02.09