본문 바로가기
카테고리 없음

Unity로 비디오 게임 개발하기: 쉬운 단계별 가이드

by 아수랑 2025. 2. 16.
728x90

Unity 게임 엔진으로 간단한 어드벤처 게임을 제작하는 실용적인 가이드입니다.

관련 분야: 게임 프로그래밍
작성자: Mars Buttfield-Addison, Contributor, Computer Science Researcher

 

밝은 녹색 필드에 플레이어와 오브젝트가 있는 Unity의 간단한 장면


Unity는 모든 최신 플랫폼용 게임을 제작할 수 있는 강력한 게임 엔진입니다. 수십만 개의 게임이 출시되었으며, 모든 최신 게임 플랫폼에서 2D와 3D 타이틀 모두에 널리 사용되고 있습니다. 유니티의 최근 행보에도 불구하고 여전히 게임 제작을 위한 훌륭한 기술 플랫폼입니다.

최신 게임은 기본적으로 물리, 애니메이션, 렌더링 엔진이 포함된 시뮬레이션 환경이며, 이 모든 것이 외부 툴 통합을 지원하는 깔끔한 애플리케이션에 담겨 있습니다. 게임 엔진 없이도 게임을 만들 수 있지만 작업량이 훨씬 많을 뿐이며, 게임 엔진으로 게임이 아닌 것을 만들 수도 있지만 적합하지 않을 수 있습니다.

이 글에서는 Unity로 간단한 게임을 만들어 보겠습니다. 기본적인 내용도 이 글 한 편에 담을 수 있다는 사실은 Unity가 얼마나 많은 저수준 유틸리티를 바로 사용할 수 있는지, Unity에서 무언가를 만드는 것이 얼마나 빠른지 알 수 있을 것입니다!

여기서는 작은 남자아이가 되어 사람들과 대화하고 물건을 찾고 여러 가지 일을 하는 어드벤처 게임인 “작은 남자 게임”의 최소한의 예를 만들어 보겠습니다. 이를 위해 다음과 같이 하겠습니다:

 

Unity에서 사용할 수 있는 기본 셰이프 모델(또는 “프리미티브”), Unity 에셋 스토어나 온라인에서 찾을 수 있는 사전 제작된 모델, Unity로 임포트한 완전히 커스텀 모델을 포함하는 작은 씬을 만듭니다.

팔이 달린 원통형 플레이어 캐릭터를 만들어 보세요.

기본적인 입력 기반 움직임을 위해 C# 스크립팅을 사용하여 캐릭터가 움직일 수 있게 만듭니다.

오브젝트를 집어 전달할 수 있는 캐릭터 만들기 - 대상 오브젝트를 추적하고 다양한 상태를 표현하기 위해 다양한 방식으로 보이도록 하는 스크립팅 로직을 포함합니다.

캐릭터가 미리 작성된 스크립트에서 기본적인 프롬프트 기반 대화를 통해 말을 할 수 있도록 합니다.


게임의 전제는 무엇인가요? 물어봐 주셔서 감사합니다. 옛날 옛적에 큐브(단순히 이름만 큐브가 아니라 깊이 있는 생각을 가진 매우 사려 깊은 NPC 캐릭터였습니다)와 친구인 플레이어(바로 여러분입니다!)가 있었습니다. 큐브의 생일이지만 큐브는 파티 모자를 잃어버려서 모자가 없으면 축하할 수 없습니다. 플레이어는 파티 모자를 찾아 하루를 구해야 합니다.

시련과 승리에 대한 흥미진진한 이야기... 확실히...

시작합시다!

(이 가이드는 Unity 인터페이스와 주요 개념에 대한 지식이 어느 정도 있다고 가정합니다. 이에 대한 자세한 내용은 이전 가이드에서 확인할 수 있습니다.)

반응형


Unity 설치 및 새 프로젝트 생성

첫 번째 단계는 당연히 Unity를 설치하는 것입니다. macOS, Windows, Linux용 다운로드는 Unity 웹사이트에서 찾을 수 있으며, 설치하면 Unity Hub라는 애플리케이션이 설치됩니다.

Unity Hub는 설치한 에디터의 모든 버전(이전 버전과 새 버전을 한 번에 설치할 수 있음)과 생성한 모든 Unity 프로젝트를 포함하여 컴퓨터의 Unity 관련 컴포넌트를 관리하는 애플리케이션입니다.

Unity 에디터 버전을 설치하기 전에 허브에서 Unity 라이선스 등록을 요청할 수 있습니다. 무료 버전만 원하는 경우에도 계속 진행하기 전에 계정을 만들고 이 머신에 대한 라이선스를 프로비저닝하는 단계를 따라야 합니다. 이 절차가 완료되면 에디터를 설치할 수 있습니다. 버전을 선택할 때는 버그 수정 및 업데이트와 같은 장기 지원을 받을 수 있는 최신 버전을 선택하는 것이 좋습니다.

다운로드가 완료되면 “새 프로젝트”를 선택하여 프로젝트를 생성합니다. 저희는 3D 프로젝트를 만들려고 합니다. 저는 “CubeWantsAPartyHat”이라고 이름을 지었지만 원하는 대로 이름을 지을 수 있습니다.

그림 1. Unity Hub에서 새 프로젝트 만들기.

 

작은 장면 만들기

 

이제 빈 씬이 있는 빈 프로젝트를 살펴보겠습니다. 이 작은 게임의 씬을 설정하기 위해 내장된 Unity 프리미티브, 임포트한 프리메이드 모델, 임포트한 커스텀 모델을 혼합하여 사용하겠습니다.

먼저 이 모든 것을 얹을 배경이 필요합니다. 물리학은 3차원에 모두 존재하는 오브젝트를 사용하면 더 쉬우므로, 평면이 존재하지만 바닥에는 솔리드 오브젝트를 사용하겠습니다. Unity에는 큐브, 구, 원통, 캡슐과 같은 기본 모양을 위한 '프리미티브' 모델이 내장되어 있습니다. 그래서 저는 보통 양쪽 가로축을 따라 늘어진 단순한 정육면체로 시작하여 빌드할 기초를 만듭니다.

오늘은 간단한 게임만 만들 예정이므로 평평한 바닥을 기본 표면으로 사용하겠습니다. 녹색으로 색칠하면 잔디처럼 보일 것입니다. 모델에 색을 입히려면 먼저 머티리얼을 만들어야 합니다. 머티리얼은 재사용 가능한 텍스처나 색상을 정의하여 여러 모델에 적용할 수 있으며, 여기에는 조명을 받았을 때 광택이나 금속성 같은 고유한 정보가 포함됩니다. 프로젝트 패널에서 만들기 > 머티리얼을 선택하면 인스펙터에 수많은 옵션이 표시됩니다.

간단한 컬러 머티리얼을 만들려면 알베도 필드를 선택하고 원하는 RGB 값을 선택하기만 하면 됩니다.

그림 2. X축과 Z축의 크기를 조정하고 이름을 “Ground”로 변경하고 녹색 머티리얼로 채색한 큐브입니다.

이러한 기본 도형으로 구성할 수 있는 씬에 무엇이든 추가하는 것은 매우 쉽습니다. 프리미티브 모델을 추가하고, 축을 따라 크기를 조정하거나 회전하고, 위치를 지정하고, 머티리얼로 색을 입히면 됩니다.

하지만 좀 더 복잡한 오브젝트의 커스텀 모델을 사용하려면 어떻게 해야 할까요? 이 부분을 표현하려면 에셋이 필요합니다. 온라인에는 누구나 무료로 사용할 수 있거나 임시 에셋을 찾는 사람들을 위해 세련되고 관대하게 라이선스가 부여된 옵션이 많이 있습니다. 오늘은 Kenney의 서바이벌 키트를 사용하겠습니다.

팩을 압축 파일로 다운로드하고 압축을 푼 다음 프로젝트의 에셋에 추가하면 이제 전체 모델 세트에 액세스할 수 있습니다. 씬 뷰로 드래그하여 씬에 추가한 다음 이전과 마찬가지로 크기 조정, 이동 또는 회전할 수 있습니다. 이 시점에서는 원하는 구도가 나올 때까지 다양한 모델과 구성을 가지고 놀 수 있습니다.

그림 3. 설명한 방법을 사용하여 구성한 간단한 씬입니다. 왼쪽에는 캐릭터가 그 아래/근처에 서 있을 수 있는 쉼터가 있고, 오른쪽에는 파티 모자가 앉을 수 있는 플랫폼이 있습니다.

이 간단한 조각을 사용하여 기본적인 씬부터 복잡한 씬까지 조립할 수 있습니다. 하지만 장면이 보기 좋다고 해서 제대로 동작하는 것은 아니라는 점을 명심하세요. 시뮬레이션이 실행되고 시간이 지나기 시작하면 소품과 풍경의 일부가 원하는 대로 작동하려면 다양한 오브젝트의 물리적 측면을 고려해야 합니다. 어떤 물체는 항상 정적으로 유지되기를 원할 것이고, 어떤 물체는 중력에 의해 구르거나 떨어지기를 원할 것이며, 어떤 물체는 빛줄기처럼 무형으로 유지되기를 원할 것이고, 어떤 물체는 단단하고 불투명하게 유지되기를 원할 것입니다.

물체에 물리학의 영향을 받도록 하려면 RigidBody 컴포넌트를 부여합니다. 이 컴포넌트는 눈에 보이는 시각적인 것 이상의 물체의 물리성을 나타냅니다. 무게에 따라 던졌을 때 어떻게 작동할지, 마찰에 따라 끌었을 때 어떻게 작동할지, 질량 중심에 따라 밀었을 때 어떻게 기울어질지 등 특정 힘을 받을 때 어떻게 작동할지 파악하는 데 매우 중요합니다. 이 부분은 까다로울 수 있지만 기본값은 대부분의 경우 꽤 잘 작동합니다(단, 중력 효과를 위해 씬의 스케일을 1“단위” = 1미터로 가정합니다).

오브젝트가 무언가에 닿으면 반응하도록 하려면 오브젝트에 콜리더 컴포넌트를 부여합니다. 반응이 “단단한 물체처럼 작동”하도록 하려면(즉, 침입한 물체가 더 이상 움직이지 못하게 하거나 튕겨나가도록 하려면) 콜리더만 있으면 됩니다. 응답이 “감지 볼륨처럼 작동”하기를 원한다면, 즉 게임 시스템에 충돌이 발생했음을 알려주기를 원한다면 트리거 콜리더가 필요합니다. 전자는 플레이어가 벽을 통과하지 못하도록 하는 역할을 하고, 후자는 플레이어가 발사체에 맞거나 컷씬을 트리거해야 하는 방에 들어갔을 때 이를 알려주는 역할을 합니다.

씬 계층 구조도 여기서 작동합니다. 부모가 이동, 크기 조정 또는 회전하는 오브젝트도 그렇게 됩니다. 자식 오브젝트는 부모 오브젝트를 따르기 때문에 여기서 '부모'라는 용어가 유래했습니다. 일반적인 게임에서 플레이어 모델은 메인 카메라(플레이어를 기준으로 이동)와 플레이어 모델이 착용하고 있는 액세서리(플레이어가 움직일 때 뒤처지지 않도록)를 담고 있는 컨테이너 오브젝트의 자식입니다. 따라서 함께 붙이고 싶은 오브젝트가 있는지 생각해 보세요!

제 씬에서 제가 한 유일한 구조적 변경은 잔디를 제외한 모든 오브젝트에 콜리더를 부여하여 마치 단단한 것처럼 동작하지만 움직이지 않도록 하는 것이었습니다. 하지만 이 튜토리얼의 뒷부분에서 움직이거나 움직일 수 없는 오브젝트로 넘어가면서 이러한 개념을 조금 더 미묘하게 사용해야 할 것입니다.

이 시점에서 우리 씬에는 중요한 오브젝트인 파티 모자가 하나 빠져 있습니다! 원뿔은 Unity에서 프리미티브로 사용할 수 있는 단순한 모양일 것이라고 생각하겠지만, 실제로는 그렇지 않습니다. 그래서 이전에 미리 만든 모델을 사용했던 것과 같은 방식으로 Unity에서 익스포트하고 사용할 수 있도록 블렌더에서 원뿔을 만들었습니다. 모델을 .fbx 파일로 익스포트하고 다른 에셋처럼 프로젝트에 임포트하기만 하면 됩니다. 저는 텍스처가 없는 모델을 익스포트하고 씬에 가져온 후 간단한 컬러 머티리얼을 적용하기로 선택했습니다.

같은 컴퓨터에 Blender가 설치되어 있다면 .blend 파일을 직접 드래그할 수도 있습니다!

그림 4. Blender에서 만든 커스텀 원뿔 모델을 Unity 씬으로 임포트한 모습.

이 씬은 매우 간단한 씬이지만, 이와 동일한 원칙은 훨씬 더 크거나 복잡한 씬을 만들 때도 적용됩니다. 가장 복잡한 Unity 씬도 이와 같이 물리 및 머티리얼 속성이 다른 게임 오브젝트와 프리팹의 계층 구조에 불과합니다.


추가 크레딧

커스텀 모델을 만들기 위해 블렌더로 이동하고 싶지 않다면 프로빌더를 설치하여 Unity 내에서 바로 커스텀 메시를 만들고 수정할 수 있다는 점을 기억하세요.

여기에 포함되지 않은 엄청난 양의 커스터마이징과 다듬기는 여기에 표시된 평면 컬러 대신 매핑 가능한 텍스처(텍스처로 적용된 평면 이미지) 또는 셰이더(프로그래밍 방식으로 생성된 동적 텍스처)를 적용할 수 있는 머티리얼 세팅을 통해 이루어질 수 있습니다.

커스텀 조명과 그에 맞는 스카이박스 텍스처를 통해 미적 제어를 더욱 강화할 수 있습니다. 설정에 상관없이 Unity 기본 스카이박스 텍스처로 게임을 출시하는 것은 큰 실수로 간주됩니다.

728x90


플레이어 캐릭터(및 기타 캐릭터) 만들기

이 작은 남자 게임에는 플레이어와 큐브 두 캐릭터만 있습니다. 큐브는 말 그대로 단순한 컬러 머티리얼의 큐브 프리미티브입니다. 파란색으로 만들었습니다.

플레이어는 조금 더 복잡합니다. 나중에 물건을 들어야 하므로 최소한 팔은 있어야 하거든요. 그래서 앞쪽으로 약간 길쭉한 큐브가 튀어나온 원통형으로 만들었습니다. 동일한 게임 오브젝트 계층 구조 트릭을 사용하여 팔이 몸과 함께 움직이고 회전할 수 있도록 했습니다. 또 다른 간단한 컬러 머티리얼을 사용하여 그를 빨간색으로 만들었습니다.

그림 5. NPC 캐릭터 “큐브”와 플레이어 캐릭터 “플레이어”.

이제 물리적인 형태를 갖췄으니 이 캐릭터가 나중에 작동하도록 하려면 몇 가지 추가 작업이 필요합니다. 첫 번째는 물체와 충돌하거나 접근하는 시점을 감지하는 기능입니다. (후자는 접근하는 물체 주변의 보이지 않는 커다란 상자와 충돌하면 접근에 반응할 수 있습니다. 예, 모든 게임 개발은 이와 같은 트릭을 사용합니다.)

플레이어가 땅 위에서 움직이면서 충돌 이벤트도 감지할 수 있어야 하므로 Trigger Collider(IsTrigger가 켜진 Collider 컴포넌트)와 RigidBody가 모두 필요합니다(하지만 점프하지 않을 것이므로 UseGravity가 꺼져 있어도 됩니다).

복잡한 캐릭터가 있는 게임의 콜라이더는 종종 커스텀 모양이 보이는 모델을 어느 정도 반영하는 메시 콜라이더가 됩니다. 하지만 여기서는 박스 콜라이더를 사용하여 단순하게 만들겠습니다. 플레이어는 약간 이상한 모양이므로 '콜라이더 편집' 기능을 사용하여 박스 콜라이더의 모양을 편집하고 싶을 수 있습니다. 일반적으로 실제 모델보다 약간 큰 것이 플레이어에게 가장 잘 어울립니다.

6. 편집 모드의 플레이어 모델의 박스 콜라이더.

다음으로 각 캐릭터가 파티 모자를 사용할 수 있도록 준비해야 합니다. 큐브와 플레이어 모두 모자를 착용해야 할 수 있으며, 플레이어는 모자를 눈에 띄게 잡을 수 있어야 합니다.

가장 쉬운 방법은 각 동작마다 모자가 스냅할 수 있는 지점을 플레이어에 표시하는 것입니다. 모자가 있어야 할 곳에 적절한 이름을 가진 빈 트랜스폼을 배치하면 나중에 코드에서 모자를 해당 위치로 이동할 수 있습니다.

그림 7. “Player"라는 빈 부모 게임 오브젝트에 포함된 오브젝트의 최종 계층 구조.

이제 두 캐릭터에 로직을 추가할 준비가 되었으니 스크립팅 부분으로 넘어가 보겠습니다!


추가 크레딧

이 시점에서 대부분의 게임은 캐릭터 모델뿐만 아니라 캐릭터 애니메이션도 고려합니다. 여기서는 플레이어에 애니메이션을 적용하지 않겠지만, Unity에서 애니메이션을 구현할 수 있는 다양한 경로가 있습니다. 3D 모델로 작업할 때는 대부분 애니메이터 컴포넌트를 사용합니다. 애니메이터 컴포넌트를 사용하면 애니메이션 클립을 참조하고 필요에 따라 여러 애니메이션을 블렌딩하는 방법과 애니메이션이 적용되는 모델의 어느 부분이 애니메이션에 의해 변형되고 영향을 받는지 정의할 수 있습니다.


플레이어 캐릭터가 움직일 수 있게 만들기

플레이어가 움직일 수 없다면 파티 모자를 잘 찾지 못할 것이므로 어떤 형태로든 입력에 연결해 봅시다. 프로젝트 영역에서 생성 > C# 스크립트를 선택하고 플레이어에 적합한 이름을 가진 스크립트를 생성하여 이를 수행합니다. 스크립트가 생성되면 인스펙터의 컴포넌트 추가 메뉴에서 선택할 수 있습니다. 스크립트를 플레이어 오브젝트에 컴포넌트로 추가하면 둘이 연결되고 스크립트에서 플레이어 오브젝트 계층 구조의 다른 컴포넌트나 프로퍼티에 액세스할 수 있습니다.

그림 8. 플레이어 동작을 위해 적절하게 명명된 스크립트.

선호하는 에디터에서 이 스크립트를 열면 파일과 같은 이름의 클래스가 정의되어 있고, Unity 오브젝트 수퍼클래스 MonoBehaviour에서 상속된 것을 볼 수 있습니다. 여기에는 오브젝트가 생성될 때 한 번 호출되는 Start 함수와 매 프레임마다(보통 초당 30~120회) 호출되는 Update 함수가 정의되어 있습니다. 이제 여기에 입력 기반 동작 코드를 채워 보겠습니다!

복잡하거나 구성 가능한 입력을 위해 Unity에는 Unity 입력 시스템이 있습니다. 하지만 이 경우에는 WASD/화살표와 몇 가지 일반 액션 키가 이미 내장되어 있는 레거시 입력 관리자를 사용할 수 있습니다.

 


이러한 함수는 사용자 입력을 XYZ 벡터로 가져와서 필요에 따라 힘이나 변형을 적용하거나 크기를 조정하는 데 사용할 수 있습니다. 저희의 경우, 다른 게임에서처럼 가속/감속이나 위를 보거나 아래를 내려다보는 키가 아니라 앞으로/뒤로 움직이면 플레이어가 앞으로 또는 뒤로 움직이기를 원합니다. 그리고 왼쪽/오른쪽 이동은 플레이어를 왼쪽으로 돌리거나 오른쪽으로 돌리거나 왼쪽으로 기울이거나 오른쪽으로 기울이는 것과는 반대로 플레이어를 왼쪽 또는 오른쪽으로 회전시키길 원합니다.

여기서 쉬운 함정이 발생하는데, 입력값의 곱셈에 업데이트 사이의 시간을 고려하고 그에 따라 스케일을 조정해야 한다는 것입니다. 그렇지 않으면 더 빈번한 업데이트 틱으로 실행할 수 있는 시스템을 사용하면 플레이어가 더 빨리 움직일 수 있습니다. 업데이트당 이동량은 동일하지만 업데이트 빈도가 더 높기 때문입니다. 이 경우 플레이어의 전진/후진 입력, 업데이트 시간, 임의의 스케일링 계수를 결합하여 각 업데이트에 적용할 적절한 전진(또는 후진) 힘을 구합니다.

계산이 완료되면 적절한 힘의 양과 방향을 플레이어의 움직임을 제어하는 RigidBody 컴포넌트에 적용할 수 있습니다. 구성 가능한 승수를 추가하면(움직임이 “적절하다”고 느껴질 때까지 조정할 수 있도록) 최종 움직임 코드는 다음과 같이 됩니다:

 

이동 속도 및 업데이트 코드


SerializeField]를 추가하면 Unity 인스펙터에 movementSpeed, movementDrag 및 rotationSpeed 변수가 표시되고 엔진에서 이 값을 실시간으로 조정할 수 있습니다.

이제 스크립트를 저장하고 Unity로 돌아가 씬을 저장한 다음 플레이 버튼을 사용하여 게임을 실행하면 씬에서 플레이어 오브젝트를 회전하고 이동할 수 있을 것입니다! 하지만 아직은 그냥 부딪히는 것 이상의 유용한 기능을 할 수 없으므로 조금 더 기능적으로 만들어 보겠습니다...


추가 크레딧

대부분의 게임은 개인 취향이나 접근성상의 이유로 어떤 형태로든 컨트롤 리매핑을 지원합니다. 이를 지원하려면 입력과 결과 동작 사이에 현재 입력이 무엇으로 설정되어 있는지 확인하는 추상화 계층이 필요합니다. 플레이어가 결정한 키 바인딩은 세션 간에 (키코드 값을 정수 또는 문자열 표현으로 변환하여) PlayerPref에 저장할 수 있으며, 여기처럼 하드코딩된 값 대신 현재 설정된 바인딩에 대해 입력 로직을 검사하여 게임 내에서 사용할 수 있습니다.


플레이어 캐릭터가 말할 수 있게 만들기

이것은 매우 간단한 게임 스냅샷이지만 플레이어에게 전달해야 하는 몇 가지 목표와 동기가 있습니다. 약간 편견이 있긴 하지만, 가장 쉬운 방법은 Yarn Spinner와 같은 프레임워크를 사용하여 간단한 대화를 추가하는 것이라고 생각합니다.

얀 스피너와 같은 서드파티 패키지를 설치하는 가장 쉬운 방법은 OpenUPM과 같은 Unity용 패키지 관리자를 사용하는 것입니다. 편집 > 프로젝트 설정 > 패키지 관리자 > 범위 지정 레지스트리를 통해 패키지 레지스트리를 추가하여 등록할 수 있습니다. 여기서 OpenUPM에 dev.yarnspinner의 패키지를 관리하도록 지정할 수 있습니다.

 

유니티 패키지 관리자 예제


등록이 완료되면 창 > 패키지 관리자(  Window > Package Manager )의 패키지 목록에서 “내 레지스트리( My Registries )” 아래에 Yarn Spinner가 표시됩니다. 여기에서 설치를 클릭하면 됩니다. 향후 프로젝트의 경우 이 두 번째 단계만 필요합니다.

프로젝트 탐색기에 실 스피너 패키지 파일이 나타나면 기본 대화 시스템을 씬으로 드래그하여 대화 관리에 필요한 모든 뷰와 로직을 만들 수 있습니다. 프리팹은 패키지/원사 스피너/프리팹( Packages/Yarn Spinner/Prefabs )에서 사용할 수 있습니다.

 


대화 작성을 시작하려면 Yarn 프로젝트와 Yarn 스크립트라는 두 가지가 필요합니다. 각각은 프로젝트 패널의 생성 > 얀 스피너 ( Create > Yarn Spinner )메뉴를 통해 만들 수 있습니다. 얀 프로젝트의 소스 스크립트 목록에 얀 스크립트를 추가한 다음 프로젝트를 대화 시스템의 해당 인스펙터 슬롯으로 드래그해야 합니다. 이제 대화를 작성할 차례입니다!

대화는 대부분 텍스트 한 줄로 구성되어 있어 매우 간단합니다. 최소 구문은 대화를 노드라는 섹션으로 나누고 그 사이를 이동할 수 있는 기능과 if 문과 같은 기본적인 명령 흐름을 제공합니다. 이를 사용하여 게임에서 일어나는 시나리오를 소개하고 이에 대응하는 간단한 대화를 만들어 보겠습니다.

기본적으로 대화는 게임이 시작될 때 시작이라는 첫 번째 노드에서 시작됩니다. 여기에는 앞에 “- >”로 표시된 플레이어가 선택할 수 있는 응답으로 큐브가 말하는 몇 가지 간단한 대사가 산재되어 있습니다. 매번 하나의 응답 옵션만 제공하므로 플레이어는 이를 따를 수밖에 없습니다.

 


다른 노드로 이동하지 않고 노드(“===”로 표시)를 종료하면 모든 줄이 실행되면 이 대화가 종료됩니다. 이 시점에서 플레이어는 모자를 찾으러 가야 합니다. 플레이어가 돌아오면 그 이후 플레이어가 한 행동에 따라 다음 대화가 더 역동적으로 진행되기를 원할 것입니다.

플레이어가 모자를 찾지 못하고 돌아왔다면 큐브는 플레이어가 무엇을 찾고 있는지 상기시켜야 합니다. 플레이어가 모자를 가지고 돌아왔다면 큐브는 플레이어에게 모자를 달라고 요청해야 합니다. 플레이어가 이미 모자를 반환했다면 큐브는 플레이어에게 다시 감사를 표해야 합니다.

먼저 “$” 구문으로 지정된 몇 가지 간단한 변수를 선언하겠습니다...


...그런 다음 if-else 블록에서 이를 사용하여 올바른 대화 노드로 이동합니다...


...상황에 따라 적절하게 대응하고 관련 변수를 업데이트합니다.


플레이어가 돌아왔을 때 두 번째 대화를 트리거하려면 큐브 주변의 트리거 콜라이더가 플레이어에게 후속 대화를 시작하라고 알려주면 됩니다. 이를 위해서는 NPC 큐브에 대한 새 스크립트가 필요합니다.


그런 다음 해당 BeginConversation 함수는 실 스피너에 어떤 노드에서 계속 실행할지 알려줘야 합니다. 이렇게 하려면 씬에서 DialogueRunner에 대한 핸들을 가져와야 합니다.


다 끝났습니다! 이제 게임을 플레이하면 처음에 약간의 대화가 표시되고 플레이어가 큐브에 다시 접근할 때마다 후속 대화가 트리거됩니다.

이 시점에서 $player_holding 변수는 대화가 아닌 게임에서 발생하는 상태 변화와 관련이 있기 때문에 Yarn 스크립트 내에서 업데이트되지 않는다는 것을 알 수 있습니다. 이에 대한 자세한 내용은 다음에 설명하겠습니다!


추가 크레딧

얀 스피너는 선과 옵션 외에도 다양한 기능을 지원합니다. 모든 종류의 복잡한 로직을 수행할 수 있으며, 심지어 Yarn 스크립트에서 C# 함수를 호출할 수도 있습니다. C#을 사용해 Yarn 변수를 변경하고 필요한 Yarn 노드를 호출하는 것은 Yarn Spinner를 사용하는 한 가지 방법일 뿐이며, 다른 무수히 많은 방법은 Yarn Spinner 문서를 참조하세요.

또한 이 시점에서는 플레이어가 자신이 무엇을 하고 있는지 스스로 상기시킬 수 있는 방법을 제공하는 것이 일반적입니다. 이는 보통 전용 퀘스트 목록 보기 및/또는 현재 퀘스트 오버레이의 형태를 취합니다. 이 경우 뷰의 상단 모서리에 “큐브의 파티 모자 찾기”라는 UI 요소를 추가하여 초기 대화가 완료되면 표시되고 문제가 해결되면 사라지도록 할 수 있습니다. 이 작업은 Unity의 UI 툴킷으로 수행할 수 있습니다.


플레이어 캐릭터가 오브젝트와 상호작용할 수 있게 만들기

친한 친구 큐브가 파티 모자를 찾아달라고 할 때, 그 의미는 큐브도 모자를 가져다 달라는 것입니다. 이를 위해서는 다양한 상태를 지원하는 게임 로직이 필요합니다:

모자는 아직 발견되지 않았으며, 따라서 어떤 캐릭터와도 연관되지 않은 채 세상에 나와 있습니다.

모자를 찾았고, 플레이어가 모자를 들고 있습니다.

모자가 전달되어 현재 큐브가 착용하고 있습니다.


플레이어의 선택권을 조금 더 강화하기 위해 모자를 플레이어가 직접 가져가도록 할 수 있습니다. 생일날 친구의 파티 모자를 가져가는 것은 그리 좋은 행동은 아니지만... 어떤 사람들은 항상 배신자가 되고 싶어 하는데, 우리가 막을 수 있을까요?

모자는 픽업이므로 플레이어가 집어들고 싶어하는 모든 물체에 부착할 수 있도록 디자인된 PickUp이라는 스크립트를 새로 만들어 봅시다. 이 스크립트가 담당할 작업은 다음과 같습니다:

 

  1. 픽업 가능한 오브젝트가 바닥에 있는 동안 애니메이션을 적용합니다(구식 FPS 픽업과 같은 간단한 회전 및 흔들림 동작).
  2. 터치에 반응(픽업 가능한 오브젝트의 콜리더와 충돌)하고, 플레이어로부터 온 터치인지 감지합니다.
  3. 2. 가 발생하면 플레이어가 오브젝트를 집어 올리도록 트리거합니다.

 

그러면 이 스크립트가 씬의 모자에 첨부됩니다. 씬의 상호작용에 따라 다른 스크립트와 상호 작용하여 동작을 트리거하거나 플레이어 또는 큐브에 속한 컴포넌트를 쿼리해야 합니다. 일련의 이벤트는 다음과 같이 진행됩니다:

 

  1. 모자는 바닥에 있으므로 위아래로 흔들려야 합니다.


모델을 위아래로 움직이는 업데이트 함수에 몇 가지 코드를 추가하겠습니다. 일부 움직임에 사인파를 곱하면 시간이 지남에 따라 부드럽게 앞뒤로 움직일 수 있습니다.

픽업 스크립트


2. 모자가 충돌했으므로 모자를 픽업해야 합니다.

큐브에 접근하는 플레이어를 감지한 것과 매우 유사하게 충돌하는 물체가 예상대로 플레이어인지 감지하는 코드를 픽업 스크립트에 추가하겠습니다. 플레이어가 맞으면 플레이어에게 이 오브젝트를 잡으라고 합니다.

 

모자에 대한 업데이트된 코드를 onTriggerEnter에 입력합니다.


플레이어 스크립트에서 픽업을 플레이어의 팔로 시각적으로 이동시키고, 플레이어가 움직일 때 움직이도록 오브젝트를 적절히 부모로 지정하고, 나중에 사용할 수 있도록 잡은 오브젝트에 핸들을 저장하는 해당 함수를 정의할 것입니다. 하지만 여기에는 아직 한 가지 중요한 부분이 빠져 있습니다...


플레이어가 시각적으로 모자를 들고 있을 때 대화가 적절하게 반응하도록 하려면 Yarn 변수 $player_holding의 상태를 “hat”으로 변경해야 합니다. Yarn 스크립트 외부에서 Yarn 변수를 변경하려면 DialogueRunner의 핸들을 가져와서 그 변수 저장소 컴포넌트를 통해 변수 값을 이름으로 설정하면 됩니다.


3a. 플레이어가 착용할 모자를 보관하거나, 또는

3b. 모자를 큐브에게 전달하여 착용하도록 합니다.

이를 위해서는 Player 클래스의 HoldObject 함수와 매우 유사한 두 개의 스니펫이 필요하지만 때로는 그 반대의 경우도 있습니다. 첫 번째 경우, 플레이어는 모자를 들고 있는 것을 멈추고 머리에 씌우기만 하면 됩니다.


두 번째 경우에는 플레이어가 오브젝트를 잡고 있는 것을 멈추고...


...NPC 스크립트에 매우 유사한 착용 오브젝트 함수를 제공하여 모자를 큐브에 씌워야 합니다.


인스펙터에 표시된 이 wearPosition 및 holdPosition 필드에는 앞서 캐릭터 모델링 중에 생성한 빈 트랜스폼 오브젝트가 할당되어야 합니다.

마지막으로, 플레이어가 대화에서 선택한 내용에 따라 올바른 플레이어가 모자를 착용하도록 만들어야 합니다. 이를 위해서는 Yarn에서 호출할 수 있는 몇 가지 커스텀 명령을 선언하여 C#에서 적절한 함수를 트리거해야 합니다. 이 작업은 Yarn 커맨드 핸들러를 사용하여 다이얼로그 러너에 어떤 명령에 대해 어떤 함수를 실행할지, 어떤 파라미터를 받아들일지 클래스에 알려주면 됩니다.

따라서 C#에 다음과 같이 등록하면 됩니다:

플레이어 시작 함수 추가 코드


Yarn에서도 이와 같은 명령을 사용할 수 있습니다:

Yarn에 명령어 추가


그러면 플레이어가 모자를 착용할 사람을 결정하면 즉시 모자를 착용하게 됩니다. 이렇게 모자의 가능한 모든 상태를 표현했습니다!

이제 게임을 플레이하면 플레이어의 대화와 움직임에 따라 모자가 움직일 것입니다. 모자를 큐브에게 친절하게 돌려주거나 악마처럼 직접 가져갈 수 있어야 합니다.


추가 크레딧

픽업 클래스를 일반 클래스로 만들었기 때문에 파티 모자 이외의 오브젝트에도 적용할 수 있습니다. 하지만 그렇게 하려면 오브젝트를 요청하는 커스텀 다이얼로그와 오브젝트를 찾은 후 전달하기 위한 커스텀 함수가 추가로 상호작용하고자 하는 각 오브젝트에 대해 필요했습니다.

게임 전체에서 한두 가지 이상의 오브젝트를 처리하는 경우에는 플레이어 인벤토리 관리를 위해 전체 시스템 클래스를 만드는 것이 일반적입니다. 이렇게 하면 다른 게임 시스템과 플레이어에게 특정 순간에 어떤 오브젝트를 소유하고 있는지 UI 요소를 통해 알려주는 역할을 담당하게 됩니다.


결론

이렇게 작은 게임을 만들었습니다! 오디오, 애니메이션, 네트워킹, 컷신(Unity에서는 '타임라인'이라고 함), 커스텀 UI 등 미처 다루지 못한 Unity 시스템이 많이 있습니다. 하지만 여기 있는 기능을 활용하면 자신만의 작은 게임을 만들 수 있습니다.

어서 만들어 보세요!


* 원문:

 

Developing a video game in Unity: an easy, step-by-step guide

A practical guide to making a simple adventure game in the Unity game engine.

www.gamedeveloper.com

 

댓글