적 캐릭터 생성, 2부: 동적 관찰자
Tutorial
Beginner
+10XP
40 mins
107
Unity Technologies

지난 튜토리얼에서는 JohnLemon을 잡으려는 적 캐릭터, 가고일을 하나 만들었습니다. 하지만 뭔가 부족한 느낌이 듭니다. 이번에는 게임 난이도를 높이기 위해 추가로 적을 생성합니다.
이 튜토리얼에서 배울 내용은 다음과 같습니다.
- 움직이는 유령 적을 생성합니다.
- 집 안에 유령이 돌아다닐 수 있도록 하는 커스텀 스크립트를 작성합니다.
- 게임에 적을 배치합니다.
이 튜토리얼을 마칠 때쯤에는 집 안이 적 캐릭터로 가득 채워지며 게임이 완성 단계에 들어갈 것입니다.
Languages available:
1. 유령 프리팹 설정
이전 튜토리얼에서는 유령의 집에 가고일 적을 생성했습니다. 이제 동적인(움직이는) 적을 생성하여 게임의 난이도를 높여 보겠습니다. 이번에는 존 레몬을 찾아 집을 배회하는 유령을 만들 차례입니다.
첫 단계에서는 유령 모델을 사용하여 프리팹을 생성합니다. 이제는 꽤 익숙한 과정이죠.
1. 프로젝트 창에서 Assets > Models > Characters 폴더를 열고 Ghost 에셋을 찾습니다.
2. 유령 모델을 프로젝트 창에서 계층 창으로 드래그하여 모델의 인스턴스를 생성합니다.
3. 유령 게임 오브젝트를 계층 창에서 프로젝트 창의 Assets > Prefabs 폴더로 드래그합니다. Create Prefab 대화 상자가 나타나면 Original Prefab을 선택합니다.
4. 프리팹을 열어 변경할 준비를 합니다.
2. 유령 애니메이션화
이번 단계에서는 새로운 적을 애니메이션화합니다. 유령 캐릭터는 단일 애니메이션을 반복해서 플레이하기 때문에 간단한 애니메이션 컨트롤러를 가지고 있습니다.
유령을 애니메이션화하는 방법은 다음과 같습니다.
1. 프로젝트 창에서 Assets > Animation > Animators 폴더로 이동하여 오른쪽 클릭합니다.
2. 컨텍스트 메뉴에서 Create > Animator Controller를 선택합니다. 새로운 애니메이션 컨트롤러의 이름을 “Ghost”로 설정합니다.
3. Ghost를 더블 클릭하여 Animator 창을 엽니다.
4. 프로젝트 창에서 Assets > Animation > Animations로 이동합니다.
5. Ghost@Walk 모델 에셋을 펼칩니다.
6. Walk 애니메이션을 프로젝트 창에서 Animator 창으로 드래그합니다.
유령 캐릭터의 간단한 애니메이션 컨트롤러가 완료되었으니 Animator 컴포넌트에 할당해야 합니다.
7. 프로젝트 창에서 Assets > Animation > Animators 폴더로 이동합니다.
8. 계층 창에서 Ghost 게임 오브젝트를 선택합니다.
9. 프로젝트 창에 있는 Ghost Animator 컨트롤러를 인스펙터 내 Ghost Animator 컴포넌트의 Controller 프로퍼티로 드래그합니다.
10. 씬을 저장합니다.
3. 유령에 콜라이더 추가
JohnLemon, 가고일과 마찬가지로 유령 캐릭터도 씬에서 물리적으로 존재(약간 비현실적이겠으나)해야 합니다. 따라서 콜라이더가 필요합니다.
콜라이더를 추가하는 방법은 다음과 같습니다.
1. Unity 에디터가 프리팹 모드인지 확인합니다. 프리팹 모드가 아닌 경우에는 가고일 프리팹을 생성할 때 배웠던 숏컷을 사용하면 됩니다.
2. 인스펙터에서 Ghost 게임 오브젝트에 Capsule Collider 컴포넌트를 추가합니다.
3. 콜라이더가 유령 모델에 더 적합하도록 다음과 같이 조정합니다.
- Capsule Collider의 Center 프로퍼티를 (0, 0.6, 0)으로 변경합니다.
- Radius 프로퍼티를 0.25로 변경합니다.
- Height 프로퍼티를 1.2로 변경합니다.
이제 콜라이더가 잘 들어맞습니다.
4. 유령 게임 오브젝트에 Rigidbody 컴포넌트 추가
유령 캐릭터가 움직이려면 리지드바디가 필요합니다. 이때 설정에 유의해야 하는데, 유령은 JohnLemon과 충돌해도 그로 인해 움직이지 않아야 합니다.
위치와 회전에 대해 모든 제한 조건을 활성화하여 이동을 방지할 수도 있지만, 더 간편한 방법은 리지드바디를 키네마틱으로 설정하는 것입니다.
인스펙터에서 Rigidbody 컴포넌트를 찾아 Is Kinematic 체크박스를 활성화합니다.
키네마틱 리지드바디는 충돌과 같은 외부 힘의 영향을 받지 않지만, 다른 게임 오브젝트와 충돌할 수 있습니다. 키네마틱 리지드바디의 완벽한 예로 게임 Breakout의 패들이 있습니다. 공은 패들에 부딪혀 튕겨 나가지만 패들은 공의 영향을 받지 않습니다.
5. 유령을 관찰자로 만들기
유령 프리팹은 기본만 갖춰진 상태로, 아직 움직이거나 JohnLemon을 찾을 수 없습니다. 이를 제어하는 가고일 프리팹의 PointOfView 게임 오브젝트를 이미 생성했으니, 모든 작업을 반복하는 대신 프리팹을 생성해 보겠습니다.
유령을 관찰자로 만드는 방법은 다음과 같습니다.
1. 우선 유령 프리팹의 변경 사항을 저장합니다.
2. 프로젝트 창에서 Assets > Prefabs 폴더를 열고 Gargoyle 프리팹을 선택합니다.
3. 인스펙터 창에서 Open Prefab 버튼을 클릭합니다.
4. 계층 창에서, 가고일의 자식 오브젝트로 생성했던 PointOfView 게임 오브젝트를 찾습니다.
이 게임 오브젝트를 프리팹으로 변경하여 가고일과 유령 프리팹이 이 프리팹을 참조할 수 있도록 해 보겠습니다.
5. PointOfView 게임 오브젝트를 계층 창에서 프로젝트 창의 Assets > Prefabs 폴더로 드래그합니다.
6. 계층 구조의 PointOfView 게임 오브젝트가 회색이 아닌 파란색 큐브로 나타나고, 이름도 회색이 아니라 파란색인 것을 확인할 수 있습니다. 프리팹 인스턴스는 이렇게 파란색으로 표시됩니다.
7. 가고일 프리팹을 저장합니다.
8. 프로젝트 창에서 Assets > Prefabs로 이동하고 Ghost 프리팹을 선택합니다. Open Prefab 버튼을 클릭합니다.
9. PointOfView 프리팹을 Assets > Prefabs 폴더에서 계층 창의 Ghost 게임 오브젝트로 드래그합니다.
이제 유령에도 PointOfView가 생겨 모든 기능을 사용할 수 있습니다. 하지만 유령에 PointOfView가 제대로 작동하려면 몇 가지를 조정해야 합니다. 가고일은 유령보다 키가 커서 아래로 내려다보지만, 유령은 정면을 바라보아야 합니다.
10. 계층 창에서 PointOfView 게임 오브젝트를 선택합니다.
11. 인스펙터에서 Transform 컴포넌트를 찾습니다.
- Position 프로퍼티를 (0, 0.75, 0.4)로 변경합니다.
- Rotation 프로퍼티를 (0, 0, 0)으로 변경합니다.
이제 유령이 관찰자로 설정되었습니다. 필요하다면 PointOfView 프리팹을 변경하여 게임의 두 적 모두를 업데이트할 수도 있습니다.
6. Nav Mesh Agent 컴포넌트 설정
이제 유령이 게임 환경을 돌아다닐 수 있도록 설정해 보겠습니다.
이를 위해 사용할 2가지 컴포넌트는 다음과 같습니다.
- Nav Mesh Agent(환경 튜토리얼에서 베이크했던 내비 메시에서 유령이 경로를 찾도록 함)
- Nav Mesh Agent에 유령이 어디로 가야 하는지 알려 주는 스크립트
Nav Mesh Agent 생성부터 시작하겠습니다.
1. 인스펙터에서 Ghost 게임 오브젝트에 Nav Mesh Agent 컴포넌트를 추가합니다.
대부분 Nav Mesh Agent 컴포넌트의 기본 설정을 사용하지만 이번에는 몇 가지를 변경해 보겠습니다.
2. 씬 뷰에서 유령 주위에 내비 메시 에이전트가 원기둥 형태로 나타납니다.
약간 큰 편이니, 인스펙터에서 Nav Mesh Agent 컴포넌트의 Radius 프로퍼티를 0.25로 변경합니다.
에이전트의 높이도 유령보다 조금 많이 크지만, 환경에 천정이 없기 때문에 문제가 되지는 않습니다.
3. Nav Mesh Agent 컴포넌트의 Speed 프로퍼티를 1.5로 변경합니다. 기본 속도인 초속 3.5미터는 너무 빠르기 때문에 게임이 꽤 어려워질 수 있습니다.
4. Nav Mesh Agent 컴포넌트의 Stopping Distance 프로퍼티를 0.2로 변경합니다. 유령이 웨이포인트에 얼마나 가까이 다가갔는지 정밀하게 계산할 필요는 없으며, 따라서 내비 메시 에이전트가 목적지 부근에 접근했을 때 완전히 도착했다고 인식하는 거리를 늘릴 수 있습니다.
5. 변경 사항을 저장합니다.
이제 내비 메시 에이전트가 설정되었으며 아직은 특별한 기능이 없습니다. 스크립트를 작성하여 목적지를 설정해 보겠습니다.
7. 새로운 WaypointPatrol 스크립트 생성
게임에서 유령은 여러 웨이포인트를 따라 반복적으로 순회할 예정이므로 이 스크립트를 WaypointPatrol이라고 이름 붙입니다. 반드시 중간중간 변경 사항을 저장하세요.
새로운 스크립트를 생성하는 방법은 다음과 같습니다.
프로젝트 창에서 Assets > Scripts로 이동합니다.
1. Scripts 폴더를 오른쪽 클릭하고 Create > C# Script를 선택합니다. 새로운 스크립트의 이름을 “WaypointPatrol“로 설정합니다.
2. 계층 구조에서 Ghost 게임 오브젝트를 선택합니다.
3. 새로 생성된 WaypointPatrol 스크립트를 프로젝트 창에서 인스펙터 창으로 드래그하여 Ghost에 컴포넌트로 추가합니다.
4. WaypointPatrol 스크립트를 더블 클릭하여 변경할 수 있도록 엽니다.
8. 내비 메시 에이전트의 목적지 설정
스크립트를 변경하기 전에 스크립트가 수행해야 할 역할을 잠깐 생각해 보겠습니다. 스크립트는 씬이 처음에 로드될 때와 유령이 목적지에 도착할 때마다 내비 메시 에이전트의 목적지를 설정해야 합니다. 내비 메시 에이전트가 언제 목적지에 도달했는지 파악하기 위해서는 프레임마다 확인해야 합니다.
새로운 스크립트를 변경해 보겠습니다.
1. 이 스크립트에는 Start와 Update 메서드가 둘 다 필요하기 때문에 이전에 한 것처럼 두 메서드를 삭제해서는 안 됩니다. 대신 Start와 Update 메서드 위의 주석만 삭제합니다.
이제 스크립트는 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaypointPatrol : MonoBehaviour
{
void Start ()
{
}
void Update ()
{
}
}2. 내비 메시 에이전트에게 목적지를 알리기 위한 레퍼런스가 필요합니다. 내비 메시 에이전트와 관련한 스크립팅을 처리하려면 해당 네임스페이스를 추가해야 합니다.
다른 using 지시문이 있는 스크립트 상단에 다음 코드를 추가합니다.
using UnityEngine.AI;AI 네임스페이스를 추가하면 NavMeshAgent 클래스에 액세스할 수 있습니다.
3. Start 메서드 위에 다음 라인을 추가합니다.
public NavMeshAgent navMeshAgent;컴포넌트에 대한 public 레퍼런스를 통해 인스펙터 창에서 내비 메시 에이전트 레퍼런스를 할당할 수 있습니다.
4. 다음으로 유령이 순회하는 웨이포인트를 설정해야 합니다. 내비 메시 에이전트의 목적지는 월드 공간 내 위치인 Vector3로 나타냅니다. 하지만 웨이포인트를 Vector3로 만들면 모든 위치를 수동으로 설정해야 하며, 사용하는 값이 정확하지 않을 수도 있습니다.
대신에 빈 게임 오브젝트를 여러 개 만들어 이들의 위치를 웨이포인트로 사용하는 것이 합리적입니다. 이러한 게임 오브젝트는 씬에서 훨씬 더 쉽게 움직일 수 있으므로 변경하기도 더욱 간편합니다. 게임 오브젝트에 대한 직접적인 레퍼런스보다는 Transform 컴포넌트에 대한 레퍼런스를 이용하도록 합니다. public Transform 변수를 여러 개 선언한 후 인스펙터 창에서 개별적으로 설정할 수도 있지만, 이렇게 하면 각 유령이 가지게 될 웨이포인트의 개수를 유연하게 조절할 수 없게 됩니다.
배열을 사용하면 이 문제를 해결할 수 있습니다. 배열은 여러 변수를 모아둔 집합과 같습니다. 배열은 대괄호를 사용하여 정의됩니다.
navMeshAgent 변수 선언 바로 아래에 다음 라인을 추가합니다.
public Transform[] waypoints;이 코드 라인은 Transform의 배열인 waypoints라는 public 변수를 선언합니다.
5. 다음으로 Start 메서드에 내비 메시 에이전트의 최초 목적지를 설정하는 라인을 추가합니다.
navMeshAgent.SetDestination(waypoints[0].position);9. 배열의 작동 원리
배열이 작동하는 원리를 좀 더 살펴보겠습니다.
위에서 작성한 코드는 Nav Mesh Agent 컴포넌트의 SetDestination 메서드를 호출합니다. 이는 Vector3를 파라미터로 취하므로 배열에서 첫 번째 웨이포인트 Transform의 position 프로퍼티를 사용합니다.
배열을 구성하는 개별 단위를 요소라고 합니다. 대괄호 안의 인덱스를 사용하여 배열의 개별 요소에 액세스할 수 있습니다. 인덱스는 배열의 시작부터 원하는 요소에 이를 때까지 건너뛰어야 하는 요소의 수라고 생각하면 됩니다. 첫 번째 요소에 액세스하기 위해 건너뛰어야 하는 요소는 없으므로 인덱스는 0이 됩니다.
10. 목적지 추가
스크립트를 이어서 작성하겠습니다.
1. 유령이 목적지로 설정한 마지막 웨이포인트에 도착하면 다음 웨이포인트로 이동해야 합니다. 다음 웨이포인트를 쉽게 추적하려면 웨이포인트 배열의 현재 인덱스를 저장하면 됩니다.
웨이포인트 배열 선언 아래에 다음 코드를 추가합니다.
int m_CurrentWaypointIndex;2. 다음으로 이 인덱스를 사용할 수 있도록 Update 메서드를 수정해 보겠습니다.
Update 메서드에서는 내비 메시 에이전트가 목적지에 도착했는지 확인해야 합니다. 목적지까지 남은 거리가 앞서 인스펙터 창에서 설정한 정지 거리보다 짧은지 확인하면 됩니다.
Update 메서드에 다음 if 문을 추가합니다.
if(navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance)
{
}
3. 이제 현재 인덱스를 업데이트한 다음 내비 메시 에이전트의 목적지를 설정하는 데 사용합니다. 이 과정에서는 나머지 연산자라는 새로운 연산자를 사용하며, 백분율 기호(%)로 표시합니다.
if 문 안에 다음 코드를 추가합니다.
m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;나머지 연산자는 왼쪽에 있는 값을 오른쪽에 있는 값으로 나눈 다음 나머지를 반환합니다. 예를 들어 3 % 4는 3을 반환합니다(3을 4로 나누면 몫이 0이고 나머지가 3이기 때문). 5 % 4는 1을 반환합니다(5를 4로 나누면 몫이 1이고 나머지가 1이기 때문).
코드는 '현재 인덱스에 1을 더하고 만약 인덱스가 증가하여 웨이포인트 배열의 요소 개수와 일치하게 되면 0으로 설정'할 것을 지시하고 있습니다. 어떤 수라도 같은 수로 나누면 나머지가 0이 되기 때문에 이 경우에는 0으로 설정됩니다.
4. 인덱스 값이 증가(및 필요한 경우 0으로 되돌림)하도록 코드를 작성했으니 이 값을 사용하도록 합니다. 인덱스 증분 아래에 다음을 추가합니다.
navMeshAgent.SetDestination (waypoints[m_CurrentWaypointIndex].position);이는 0을 인덱스로 사용하는 대신 유령이 현재 도달한 웨이포인트를 인덱스로 사용하고 있다는 점만 제외하면 Start 메서드에서 했던 작업과 동일합니다.
5. 완료되었습니다. 이제 스크립트는 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class WaypointPatrol : MonoBehaviour
{
public NavMeshAgent navMeshAgent;
public Transform[] waypoints;
int m_CurrentWaypointIndex;
void Start ()
{
navMeshAgent.SetDestination (waypoints[0].position);
}
void Update ()
{
if(navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance)
{
m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;
navMeshAgent.SetDestination (waypoints[m_CurrentWaypointIndex].position);
}
}
}
6. 스크립트를 저장하고 Unity 에디터로 돌아갑니다.
11. 내비 메시 에이전트 레퍼런스를 유령 프리팹에 할당
인스펙터 창을 보면 웨이포인트와 관련하여 내비 메시 에이전트 레퍼런스와 몇 가지 트랜스폼을 할당해야 함을 확인할 수 있습니다. 내비 메시 에이전트 레퍼런스는 프리팹의 모든 인스턴스가 동일하기 때문에 지금 할당할 수 있습니다. 하지만 웨이포인트는 유령마다 다르기 때문에 프리팹에 포함되어서는 안 됩니다. 뿐만 아니라 웨이포인트는 씬의 일부가 되기 때문에 유령 프리팹이 이를 참조할 수 없습니다.
1. 계층 창에서 Ghost 게임 오브젝트를 선택합니다.
2. 인스펙터 창에서 Nav Mesh Agent 컴포넌트의 이름을 Waypoint Patrol 스크립트의 Nav Mesh Agent 필드로 드래그합니다. 이제 내비 메시 에이전트 레퍼런스가 할당되었습니다.

3. 유령 프리팹을 저장하고 씬으로 돌아갑니다.
4. 유령의 Observer 스크립트에 필요한 레퍼런스가 포함되어 있는지 확인해 보겠습니다. 계층 구조에서 Ghost 게임 오브젝트를 펼치고 PointOfView 자식 게임 오브젝트를 선택합니다.
5. 계층 창에서 JohnLemon 게임 오브젝트를 Observer 스크립트의 Player 필드로 드래그하여 Transform을 할당합니다.
6. 다음으로 원형 선택 버튼을 클릭하고 GameEnding 필드를 할당합니다. 씬에 GameEnding 컴포넌트가 하나밖에 없기 때문에 선택할 수 있는 옵션도 하나뿐입니다.
유령 캐릭터 생성이 거의 완료되었습니다. 유령을 더 추가하고 웨이포인트를 할당한 다음 정적 가고일을 몇 개 더 추가하면 됩니다.
12. 씬에 유령 배치
이제 씬에 적을 추가할 차례입니다. 우선 유령을 복제하여 4개로 만들고 레벨에 배치해 보겠습니다.
1. 계층 창에서 Ghost 게임 오브젝트를 접은 후 선택합니다. 유령이 4개가 될 때까지 Ctrl+D(Windows) 또는 CMD+D(macOS)를 눌러 게임 오브젝트를 복제합니다.
2. 첫 번째 유령은 JohnLemon이 시작하는 방 주변에서 앞뒤로 움직여야 합니다. 인스펙터에서 이름이 Ghost인 유령의 Position을 (-5.3, 0, -3.1)로 설정합니다.
3. 두 번째 유령은 긴 복도를 따라 왔다 갔다 움직이기 때문에 JohnLemon은 양쪽의 방 안으로 숨으면서 지나가야 합니다. 이름이 Ghost (1)인 유령의 Position을 (1.5, 0, 4)로 설정합니다.
4. 세 번째 유령은 식당에 있는 테이블 하나의 주변을 맴돕니다. 이름이 Ghost (2)인 유령의 Position을 (3.2, 0, 6.5)로 설정합니다.
5. 마지막 유령은 출구 근처의 침실을 돌아다니기 때문에 존 레몬이 잘못된 길을 선택하면 잡히게 됩니다. 이름이 Ghost (3)인 유령의 Position을 (7.4, 0, -3)으로 설정합니다.
이제 유령의 위치를 설정했으니 이들의 웨이포인트를 만들고 위치를 지정해야 합니다.
13. 유령 웨이포인트 생성 및 위치 지정
웨이포인트는 빈 게임 오브젝트이기만 하면 됩니다. 모든 게임 오브젝트에는 트랜스폼이 있으므로 빈 오브젝트의 Transform 컴포넌트만 사용할 예정입니다. 최대한 효율적으로 작업하기 위해, 모든 웨이포인트를 생성한 다음 이들의 위치를 지정하고 할당해 보겠습니다.
웨이포인트를 설정하고 할당하는 방법은 다음과 같습니다.
1. 계층 창에서 Create 버튼을 클릭하고 Create Empty를 선택합니다.
2. 새로 생성된 빈 게임 오브젝트의 이름을 “Waypoint”로 변경합니다.
3. Waypoint 게임 오브젝트를 9번 복제하여 Waypoint부터 Waypoint (9)까지 총 10개의 웨이포인트를 생성합니다.
4. 계층 구조에서 Ghost 게임 오브젝트를 선택합니다.
5. 인스펙터에서 Waypoint Patrol Component가 보일 때까지 스크롤하여 내립니다.
6. 계층 창에서 Waypoint 게임 오브젝트를 Waypoints 필드의 이름으로 드래그하여 배열에 추가합니다.
7. Waypoint (1) 게임 오브젝트 또한 Waypoints 필드의 이름으로 드래그하여 배열에 추가합니다.
8. 첫 번째 유령이 배열에 2개의 웨이포인트를 갖게 되었으며 이제 위치를 지정해야 합니다. 유령은 시작하는 방 전체를 왔다 갔다 이동하게 됩니다.
- 인스펙터에서 Waypoint의 Position을 (-5.3, 0, 6.7)로 설정합니다.
- Waypoint (1)의 Position을 (-5.5, 0, -4.5)로 설정합니다.
9. 두 번째 유령은 양쪽에 방이 있는 복도를 따라 왔다 갔다 움직이게 됩니다. Ghost (1) 게임 오브젝트를 선택하고 Waypoint (2)와 Waypoint (3)을 Waypoints 배열에 할당합니다.
- Waypoint (2)의 Position을 (1.2, 0, 7.7)로 설정합니다.
- Waypoint (3)의 Position을 (0.9, 0, -3.5)로 설정합니다.
10. 세 번째 유령은 식당의 테이블 주위를 맴돌기 때문에 더 많은 웨이포인트가 필요합니다.
- Ghost (2) 게임 오브젝트를 선택하고 Waypoint (4), Waypoint (5), Waypoint (6), Waypoint (7)을 해당 웨이포인트 배열에 할당합니다.
- Waypoint (4)의 Position을 (3.2, 0, 5.6)으로 설정합니다.
- Waypoint (5)의 Position을 (3.2, 0, 12.3)으로 설정합니다.
- Waypoint (6)의 Position을 (6.5, 0, 12.3)으로 설정합니다.
- Waypoint (7)의 Position을 (6.5, 0, 5.6)으로 설정합니다.
11. 마지막 유령은 오른쪽 하단의 침실에 있습니다. Ghost (3) 게임 오브젝트를 선택하고 Waypoint (8)과 Waypoint (9)를 Waypoints 배열에 할당합니다.
- Waypoint (8)의 Position을 (3.2, 0, -5)로 설정합니다.
- Waypoint (9)의 Position을 (7.4, 0, -2)로 설정합니다.
이제 유령이 모두 배치되었습니다.
14. 씬에 가고일 배치
다음으로 레벨에 가고일 세 마리를 배치해 보겠습니다.
1. Gargoyle 게임 오브젝트를 2번 복제하여 총 3개의 가고일을 만듭니다.
2. 첫 번째 가고일은 이미 위치가 지정되었습니다. 두 번째 가고일은 JohnLemon이 너무 아래로 내려갈 수 없도록 긴 복도의 아래쪽에 있어야 합니다.
- Gargoyle (1)의 Position을 (-2.6, 0, -8.5)로 설정합니다.
- Gargoyle (1)의 Rotation을 (0, 30, 0)으로 설정합니다.
3. 세 번째 가고일은 JohnLemon이 잘못된 길로 가면 잡히도록 식당 옆 복도의 코너에 배치합니다. 첫 번째 가고일과 같은 코너에 위치하기 때문에 회전이 아닌 위치만 조정하면 됩니다.
- Gargoyle (2)의 Position을 (-4.8, 0, 10.6)으로 설정합니다.
이제 레벨에 여러 적이 배치되어 JohnLemon이 탈출하기 더 어려워졌습니다.
15. 계층 구조 정리
적과 웨이포인트 작업을 완전히 마치기 전에 마지막으로 정리가 필요합니다. 지금은 계층 창이 약간 산만해 보입니다.
적과 웨이포인트의 부모 역할을 하는 빈 게임 오브젝트를 생성하면 가장 깔끔하게 해결할 수 있습니다. 빈 오브젝트를 이용하면 필요에 따라 게임 오브젝트를 펼치거나 접어서 계층 창을 깔끔하게 유지할 수 있습니다.
계층 구조를 정리하는 방법은 다음과 같습니다.
1. 계층 창에서 빈 게임 오브젝트를 생성합니다. 게임 오브젝트의 이름을 “Enemies”로 변경합니다.
2. 인스펙터에서 Enemies의 Position을 (0, 0, 0)으로 설정합니다. 이 게임 오브젝트는 모든 유령과 가고일 게임 오브젝트의 부모 역할을 하게 됩니다.
3. 계층 창에서 Ctrl 키(Windows) 또는 CMD 키(macOS)를 누른 상태에서 각 유령과 가고일을 클릭합니다. 모두 선택한 후 Enemies 게임 오브젝트로 드래그하여 자식으로 만듭니다.
이제 필요할 때마다 이 오브젝트를 펼치고 접을 수 있습니다. 다음으로, 웨이포인트에도 동일한 작업을 해야 합니다.
4. 계층 창에서 빈 게임 오브젝트를 생성합니다. 게임 오브젝트의 이름을 “Waypoints”로 변경합니다.
5. 인스펙터에서 Waypoints의 Position을 (0, 0, 0)으로 설정합니다. 이 게임 오브젝트는 모든 웨이포인트 게임 오브젝트의 부모 역할을 하게 됩니다.
6. 계층 창에서 Ctrl 키(Windows) 또는 CMD 키(macOS)를 누른 상태에서 각 웨이포인트를 클릭합니다. 모두 선택한 후 Waypoints 게임 오브젝트로 드래그하여 자식으로 만듭니다.
이제 적을 모두 정리했습니다.
씬을 저장하고 플레이 모드에 들어가 테스트해 보세요. 완료되면 플레이 모드를 종료합니다.
16. 요약
본 튜토리얼에서는 게임에서 사용할 적을 모두 만들었습니다. 게임 제작이 거의 완료되었습니다. 그런데 게임이 너무 밋밋합니다. 전등에서 윙윙 소리가 나기는 하지만, 분위기를 고조시키기 위해 더 많은 음향 효과가 필요합니다. 다음 튜토리얼에서는 게임에 오디오를 추가해 보겠습니다.