1 00:00:00,000 --> 00:00:04,295 Unity 4.3에서 첫 2D 기능을 소개합니다. 2 00:00:04,295 --> 00:00:06,295 이를 알아보기 위해 이 툴을 이용하여 3 00:00:06,295 --> 00:00:08,295 데모 프로젝트를 만들어봤습니다. 4 00:00:08,295 --> 00:00:11,527 이 2D 플랫폼 게임은 Tower Bridge Defence라고 합니다. 5 00:00:11,527 --> 00:00:13,776 외계인의 습격을 받은 영국의 타워 브리지를 6 00:00:13,776 --> 00:00:15,556 묘사하고 있습니다. 7 00:00:15,556 --> 00:00:17,955 이는 스프라이트 및 물리 기반의 2D 샘플 레벨로 8 00:00:17,955 --> 00:00:20,216 유니티를 통해 어떻게 2D 게임을 만들 수 있는지 9 00:00:20,216 --> 00:00:23,472 보여드리고자 합니다. 10 00:00:23,472 --> 00:00:25,472 이 비디오를 통해 데모에서 사용된 11 00:00:25,472 --> 00:00:28,184 배경과 전경 제작, 캐릭터, 효과, 카메라 추적, 12 00:00:28,184 --> 00:00:30,184 애니메이션 및 스크립팅에 대해 13 00:00:30,184 --> 00:00:31,639 설명하겠습니다. 14 00:00:31,639 --> 00:00:33,639 우선 유니티에서 2D를 어떻게 15 00:00:33,653 --> 00:00:36,139 사용하는지 기초부터 알아보겠습니다. 16 00:00:36,860 --> 00:00:39,291 2D 작업을 위해서 가장 먼저 여러 설정에서 17 00:00:39,291 --> 00:00:41,221 Editor Behaviour Mode를 18 00:00:41,221 --> 00:00:43,040 2D로 설정해야 합니다. 19 00:00:43,040 --> 00:00:45,040 이는 프로젝트 마법사의 드롭다운 메뉴를 사용하여 20 00:00:45,040 --> 00:00:47,040 새로운 프로젝트를 만들 때 설정하거나, 작업 중에 21 00:00:47,040 --> 00:00:49,543 상단 메뉴에서 Edit - Project Settings - Editor를 22 00:00:49,543 --> 00:00:53,172 선택하여 설정할 수 있습니다. 23 00:00:53,172 --> 00:00:55,172 이렇게 하면 기본적으로 텍스처를 24 00:00:55,172 --> 00:00:57,172 스프라이트로 가져오게 되고 25 00:00:57,172 --> 00:00:59,630 Scene View는 2D 모드로 기본 설정됩니다. 26 00:00:59,630 --> 00:01:01,630 이 설정으로 2D 게임 제작에 필요한 완전한 직교 뷰 27 00:01:01,630 --> 00:01:04,420 (orthographic view)가 제공됩니다. 28 00:01:04,420 --> 00:01:06,806 또한 화면의 오른쪽 상단에 일반적으로 위치한 29 00:01:06,806 --> 00:01:09,197 3D 기즈모를 숨겨 더 넓은 작업 공간을 확보할 수 30 00:01:09,197 --> 00:01:11,941 있습니다. 이러한 설정 이외에도 2D 워크플로우는 31 00:01:11,941 --> 00:01:14,244 유니티의 기존 3D 게임 제작 방식을 32 00:01:14,244 --> 00:01:17,040 그대로 반영하도록 설계되었습니다. 33 00:01:17,040 --> 00:01:19,040 즉, 이미 유니티에 대해 알고 있는 사용자라면 34 00:01:19,040 --> 00:01:21,040 2D 게임 제작을 바로 시작할 수 있는 유리한 위치를 35 00:01:21,040 --> 00:01:22,929 선점하신 겁니다. 36 00:01:22,929 --> 00:01:24,929 유니티에서는 2D와 3D를 함께 섞어 사용할 수 있다는 점에 37 00:01:24,929 --> 00:01:27,219 주목할 필요가 있습니다. 예를 들어 38 00:01:27,219 --> 00:01:29,722 2D 게임에 3D 요소를 추가하고 싶다면(반대의 경우도 마찬가지) 39 00:01:29,722 --> 00:01:32,870 아무런 문제 없이 진행할 수 있습니다. 40 00:01:33,366 --> 00:01:35,496 데모 프로젝트를 살펴보면서 어떻게 완성되는지 41 00:01:35,496 --> 00:01:38,312 하나씩 살펴보도록 하죠. 42 00:01:38,812 --> 00:01:40,812 우선은 샘플 레벨의 레벨 디자인을 43 00:01:40,812 --> 00:01:42,812 스케치하는 것으로 시작하여 44 00:01:42,812 --> 00:01:44,812 포토샵에서 레이아웃을 만드는 작업을 거칩니다. 45 00:01:45,312 --> 00:01:47,312 만들어서 내보낸 레이어는 46 00:01:47,312 --> 00:01:49,312 새로운 스프라이트 유형으로 47 00:01:49,312 --> 00:01:51,312 유니티에 가져올 수 있습니다. 48 00:01:58,373 --> 00:02:01,306 나중에 배경에 시차(parallax)를 생성하려면 49 00:02:01,306 --> 00:02:03,666 배경 요소의 일부를 분리해서 50 00:02:03,666 --> 00:02:06,515 Background Sorting Layer에 위치시킵니다. 51 00:02:06,515 --> 00:02:09,658 유니티의 또 다른 2D 개발 기능입니다. 52 00:02:10,158 --> 00:02:12,841 이 레이어에 모든 배경을 할당한 다음에는 53 00:02:12,841 --> 00:02:15,157 Sprite Renderer의 Order In Layer 속성을 이용하여 54 00:02:15,157 --> 00:02:17,379 정렬할 수 있습니다. 55 00:02:17,379 --> 00:02:19,379 모든 위치가 지정되면 56 00:02:19,379 --> 00:02:21,379 Background Sorting Layer를 잠글 수 있습니다. 57 00:02:21,379 --> 00:02:23,379 이를 잠금으로써 전경 요소 추가 시 58 00:02:23,379 --> 00:02:25,379 실수로 배경 요소를 드래그할지도 모른다는 59 00:02:25,379 --> 00:02:27,751 걱정에서 벗어날 수 있습니다. 60 00:02:27,751 --> 00:02:29,751 이는 인터페이스 오른쪽 상단의 풀다운 메뉴인 61 00:02:29,751 --> 00:02:31,751 Layers에서 실시할 수 있습니다. 62 00:02:32,817 --> 00:02:35,531 배경 요소는 순전히 장식용이기 때문에 63 00:02:35,531 --> 00:02:37,531 스프라이트 게임 오브젝트에는 64 00:02:37,531 --> 00:02:39,531 추가 요소가 필요 없습니다. 65 00:02:39,531 --> 00:02:41,531 이들은 BackgroundParallax라고 불리는 66 00:02:41,531 --> 00:02:44,201 시차 조절을 위한 단순한 스크립트가 포함된 빈 게임 오브젝트에 67 00:02:44,201 --> 00:02:46,201 하위(child) 관계로 지정되었습니다. 68 00:02:46,201 --> 00:02:48,643 이 스크립트는 Scripts 폴더에서 확인할 수 있습니다. 69 00:02:48,643 --> 00:02:50,643 아주 자세한 주석과 함께 설명되어 있습니다. 70 00:02:54,914 --> 00:02:56,914 이제 캐릭터들이 실제로 뛰어다닐 71 00:02:56,914 --> 00:02:59,400 전경 요소를 생성할 차례입니다. 72 00:02:59,790 --> 00:03:02,280 런던 타워 브리지에 가운데에 UFO가 착륙한 모습을 73 00:03:02,280 --> 00:03:03,466 디자인했습니다. 74 00:03:03,466 --> 00:03:05,466 캐릭터는 하늘에서 나타나는 적을 피해 배경에서 75 00:03:05,466 --> 00:03:07,466 자유롭게 돌아다니면서 다음 레벨로 76 00:03:07,466 --> 00:03:09,216 진행해 나갑니다. 77 00:03:09,216 --> 00:03:11,216 그러므로 각각의 전경에는 캐릭터가 걸음을 디딜 수 있는 78 00:03:11,216 --> 00:03:13,632 충돌체가 필요합니다. 79 00:03:13,632 --> 00:03:15,632 효율성을 위해 대부분의 배경에는 80 00:03:15,632 --> 00:03:17,632 2D 박스 충돌체(Box Collider)를 사용하지만 81 00:03:17,632 --> 00:03:21,239 UFO는 복잡한 형태를 지니고 있습니다. 82 00:03:22,505 --> 00:03:24,505 유니티의 폴리곤 충돌체(Polygon Collider)를 사용하면 83 00:03:24,505 --> 00:03:26,878 스프라이트의 형태를 기반으로 84 00:03:26,878 --> 00:03:28,724 충돌체가 자동으로 생성됩니다. 85 00:03:28,724 --> 00:03:30,724 이는 나중에 충돌체의 형태를 변경할 수도 있음을 86 00:03:30,724 --> 00:03:32,053 의미합니다. 87 00:03:32,053 --> 00:03:34,164 충돌체 형태의 포인트들을 이동, 추가 또는 빼서 88 00:03:34,164 --> 00:03:36,164 걸어 다니기에 더 적합하게 89 00:03:36,164 --> 00:03:38,164 만들 수 있습니다. 90 00:03:38,664 --> 00:03:40,664 이러한 전경을 분류하기 위해 91 00:03:40,664 --> 00:03:43,154 Foregrounds Sorting Layer를 생성합니다. 92 00:03:43,154 --> 00:03:45,599 이 레이어는 Tags And Layers 관리자의 배경에 앞서게 위치시킵니다. 93 00:03:48,875 --> 00:03:50,875 다음으로 우리의 주인공을 살펴보죠. 94 00:03:53,709 --> 00:03:55,598 플레이어 캐릭터도 포토샵에서 디자인되었는데 95 00:03:55,598 --> 00:03:57,598 이 데모에서는 96 00:03:57,598 --> 00:03:59,598 2D 대작 게임의 주인공인 Rayman 같은 97 00:03:59,598 --> 00:04:01,598 독립적인 팔다리와 기능을 가진 98 00:04:01,598 --> 00:04:03,598 캐릭터를 만들기로 했습니다. 99 00:04:03,598 --> 00:04:05,598 또 다른 방법으로 스프라이트 시트 기반의 100 00:04:05,598 --> 00:04:08,140 애니메이션으로 포토샵에서 개별 프레임을 101 00:04:08,140 --> 00:04:09,643 디자인할 수도 있습니다. 102 00:04:09,643 --> 00:04:12,365 이는 나중에 배경에 있는 백조에 사용하게 될 방법으로 103 00:04:12,365 --> 00:04:14,365 본 비디오 후반에 설명하도록 하겠습니다. 104 00:04:15,072 --> 00:04:17,072 여기서 캐릭터의 개별 요소를 움직이게 하려면 105 00:04:17,072 --> 00:04:20,196 디자인을 완성한 뒤 신체 요소들을 106 00:04:20,196 --> 00:04:22,196 캔버스의 별도 공간으로 이동시켜 107 00:04:22,196 --> 00:04:25,408 유니티가 이들을 Importer에서 개별 스프라이트로 108 00:04:25,408 --> 00:04:27,959 분리시키도록 합니다. 109 00:04:28,763 --> 00:04:30,763 이는 모든 스트라이트를 움직이는 개별 요소들로 110 00:04:30,763 --> 00:04:33,096 정할 수 있다는 뜻입니다. 111 00:04:33,096 --> 00:04:35,495 이 요소들을 방금 생성한 Character Sorting Layer에 112 00:04:35,495 --> 00:04:38,167 위치시키고 Transform(변환) 내 Z값을 조절해 113 00:04:38,167 --> 00:04:40,921 원하는 렌더링 깊이로 정렬합니다. 114 00:04:48,811 --> 00:04:50,811 이제 이 모든 스프라이트는 115 00:04:50,811 --> 00:04:52,811 컨트롤 스크립팅, 충돌체, 물리 등이 모두 116 00:04:52,811 --> 00:04:56,591 포함되어 있는 빈 게임 오브젝트 내에 정렬됩니다. 117 00:04:56,591 --> 00:04:58,591 여기까지 완성되면 캐릭터의 각각의 스프라이트를 애니메이팅하여 118 00:04:58,591 --> 00:05:01,041 Idle, Run, Jump, Shoot 및 Death 애니메이션을 119 00:05:01,041 --> 00:05:03,906 만들 수 있는 업그레이드된 애니메이션 창을 120 00:05:03,906 --> 00:05:07,095 사용할 수 있게 됩니다. 121 00:05:07,095 --> 00:05:09,795 애니메이션 창의 새로운 도프시트 보기 덕분에 122 00:05:09,795 --> 00:05:11,795 이 작업이 정말 편해졌습니다. 123 00:05:13,414 --> 00:05:16,006 애니메이션을 상위(parent) 오브젝트에 추가하고 124 00:05:16,006 --> 00:05:19,403 하위(child) 오브젝트의 키프레임을 생성하면 됩니다. 125 00:05:19,403 --> 00:05:21,403 원하는 곳으로 플레이헤드를 옮긴 후 126 00:05:21,403 --> 00:05:23,403 캐릭터의 여러 부분을 옮기면 127 00:05:23,403 --> 00:05:25,403 키프레임 애니메이션이 자동으로 만들어집니다. 128 00:05:27,313 --> 00:05:29,644 애니메이션을 커브와 도프시트 사이에서 129 00:05:29,644 --> 00:05:32,448 전환하여 볼 수 있기 때문에 타이밍과 디자인 조절이 130 00:05:32,448 --> 00:05:35,064 정말 쉬워졌습니다. 131 00:05:36,730 --> 00:05:38,730 이렇게 생성된 애니메이션으로 132 00:05:38,730 --> 00:05:41,370 캐릭터의 상태 머신을 디자인하면 133 00:05:41,370 --> 00:05:43,801 코드가 호출되었을 때 여러 가지 애니메이션을 134 00:05:43,801 --> 00:05:45,277 재생할 수 있습니다. 135 00:05:45,277 --> 00:05:47,277 캐릭터의 애니메이터 컨트롤러는 136 00:05:47,277 --> 00:05:50,574 3D 바이패드로 구동되는 것이 아니므로 137 00:05:50,574 --> 00:05:53,673 물리 엔진에 맞춰 애니메이션을 구동하려면 138 00:05:53,673 --> 00:05:55,673 Apply Root Motion의 선택을 해제하고 139 00:05:55,673 --> 00:05:57,287 Animate Physics를 선택합니다. 140 00:05:57,287 --> 00:05:59,858 배경에서 움직이게 하려면 주인공의 발에는 141 00:05:59,858 --> 00:06:02,231 원형 충돌체를 지정하고 나머지 몸통 부분에는 142 00:06:02,231 --> 00:06:04,564 박스 충돌체를 지정합니다. 143 00:06:04,564 --> 00:06:07,067 이를 통해 주인공은 오르막을 자연스럽게 오르내릴 수 있고, 144 00:06:07,067 --> 00:06:09,454 점프하면 천장에 머리가 닿게 됩니다. 145 00:06:09,802 --> 00:06:12,537 캐릭터와 캐릭터 움직임을 제어하기 위해 146 00:06:12,537 --> 00:06:16,038 2D 물리 포스 내에서 움직이도록 스크립트를 작성했습니다. 147 00:06:16,038 --> 00:06:18,038 이를 통해 게임 중 물리를 주인공과 적에게 148 00:06:18,038 --> 00:06:20,038 적용할 수 있어 더욱 역동적인 게임 플레이가 149 00:06:20,038 --> 00:06:21,427 가능합니다. 150 00:06:21,427 --> 00:06:23,814 캐릭터의 PlayerControl 스크립트에서 151 00:06:23,814 --> 00:06:25,814 플레이어의 입력(input)을 확인합니다. 152 00:06:25,814 --> 00:06:27,814 이를 사용하여 물리 포스를 움직임에 적용하고 153 00:06:27,814 --> 00:06:30,766 입력 값을 애니메이터에게 전송함으로써 154 00:06:30,766 --> 00:06:33,487 어떤 애니메이션이 재생될지 정의하고 155 00:06:33,487 --> 00:06:36,475 상태(state)로 생성한 156 00:06:36,475 --> 00:06:38,475 여러 가지 애니메이션 클립 간의 157 00:06:38,475 --> 00:06:40,475 매끄러운 전환이 가능해집니다. 158 00:06:40,475 --> 00:06:42,475 애니메이션 클립에서 상태를 생성할 수 있는 159 00:06:42,475 --> 00:06:44,475 애니메이터를 사용해서 가장 좋은 점은 160 00:06:44,475 --> 00:06:46,861 다시 애니메이션 작업을 하지 않아도 물리 속도에 맞게 161 00:06:46,861 --> 00:06:48,861 애니메이션의 속도를 162 00:06:48,861 --> 00:06:51,278 조절할 수 있다는 것입니다. 163 00:07:23,129 --> 00:07:25,129 FixedUpdate 함수는 각 물리 단계를 평가한 다음 164 00:07:25,129 --> 00:07:27,588 가장 먼저 하는 것은 165 00:07:27,588 --> 00:07:29,588 Horizontal 입력 값을 애니메이터의 166 00:07:29,588 --> 00:07:32,994 Speed 매개변수에 공급하는 것입니다. 167 00:07:33,950 --> 00:07:35,950 단순한 상태 머신에서 Idle과 Run 간에 168 00:07:35,950 --> 00:07:37,950 전환하려면 Speed 매개변수가 169 00:07:37,950 --> 00:07:41,718 0.1 이상이어야 합니다. 170 00:07:41,718 --> 00:07:44,025 그렇게 되면 애니메이터는 Idle에서 Run 상태로 171 00:07:44,025 --> 00:07:46,025 블렌딩합니다. 172 00:07:51,857 --> 00:07:53,857 그리고 나서 움직이도록 하려면 173 00:07:53,857 --> 00:07:57,184 플레이어의 2D 물리 요소인 rigidbody2D에 174 00:07:57,184 --> 00:07:58,822 포스를 추가합니다. 175 00:07:59,626 --> 00:08:02,521 또한 Horizontal 입력 값이 0 보다 높은지 낮은지 확인하여 176 00:08:02,521 --> 00:08:04,702 캐릭터가 어느 방향을 바라보게 만들지 177 00:08:04,702 --> 00:08:07,710 결정합니다. 178 00:08:07,710 --> 00:08:10,557 그 원리는 유니티 내에서 왼쪽 입력 키를 누르면 179 00:08:10,557 --> 00:08:14,573 -1 값이 되고 오른쪽 입력 키는 +1 값이 되기 때문입니다. 180 00:08:15,073 --> 00:08:18,700 입력에 따라 캐릭터의 X축을 역전시켜 181 00:08:18,700 --> 00:08:21,477 캐릭터를 반대 방향으로 바꾸는 182 00:08:21,477 --> 00:08:24,566 뒤집기 함수를 호출합니다. 183 00:08:26,848 --> 00:08:28,848 플레이어가 지상에 있도록 정하려면 184 00:08:28,848 --> 00:08:31,605 Ground라고 하는 유니티 레이어를 추가하고 185 00:08:31,605 --> 00:08:34,982 캐릭터가 걸어 다닐 수 있는 전경 표면 전체에 적용합니다. 186 00:08:43,397 --> 00:08:45,969 2D의 Linecast 함수를 사용하면 187 00:08:45,969 --> 00:08:47,969 Ground 레이어에 속한 요소 중 캐릭터의 발밑에 위치한 것이 있는지 188 00:08:47,969 --> 00:08:50,234 확인할 수 있습니다. 189 00:08:50,234 --> 00:08:52,777 이를 더 손쉽게 커스터마이징하기 위해 190 00:08:52,777 --> 00:08:54,777 지상을 확인할 수 있는 포인트로 사용할 191 00:08:54,777 --> 00:08:56,777 빈 게임 오브젝트를 생성합니다. 192 00:08:56,777 --> 00:08:59,083 이 빈 오브젝트에 기즈모를 추가하면 193 00:08:59,083 --> 00:09:01,083 캐릭터 아래로 얼마나 먼지 조종할 수 있어 194 00:09:01,083 --> 00:09:03,083 지상을 확인할 수 있습니다. 195 00:09:03,083 --> 00:09:05,486 이것은 게임플레이 측면에서 보면 캐릭터가 196 00:09:05,486 --> 00:09:07,958 지상에 있을 때만 점프할 수 있다는 뜻이 됩니다. 197 00:09:08,456 --> 00:09:10,456 플레이어 제어에 대한 자세한 정보는 스크립트의 198 00:09:10,456 --> 00:09:12,648 다른 코멘트를 확인하십시오. 199 00:09:12,648 --> 00:09:14,648 플레이어의 무기는 비디오 후반에 200 00:09:14,648 --> 00:09:15,879 살펴보겠습니다. 201 00:09:15,879 --> 00:09:17,879 이제 데모에서 카메라가 어떻게 플레이어를 202 00:09:17,879 --> 00:09:19,879 추적하는지 알아보겠습니다. 203 00:09:21,291 --> 00:09:24,352 3D 게임과 마찬가지로 2D 게임에서도 204 00:09:24,352 --> 00:09:26,352 액션을 추적하는 카메라의 움직임이 205 00:09:26,352 --> 00:09:27,824 게임을 완성되게 만들 수도, 망칠 수도 있습니다. 206 00:09:27,824 --> 00:09:30,581 전통 2D 플랫폼 게임을 만들기 위해 2D 게임 역사에서 207 00:09:30,581 --> 00:09:33,625 가장 흥미로운 카메라 기법을 사용했던 208 00:09:33,625 --> 00:09:36,651 슈퍼 닌텐도 또는 슈퍼 패미콤용 게임인 209 00:09:36,651 --> 00:09:38,651 Super Mario World를 살펴보겠습니다. 210 00:09:38,651 --> 00:09:40,651 Super Mario world에서 카메라는 211 00:09:40,651 --> 00:09:42,651 수평으로 움직이지만 Viewport 중심에서 212 00:09:42,651 --> 00:09:45,119 사각지대 또는 여백을 사용하므로 213 00:09:45,119 --> 00:09:47,119 캐릭터가 조금씩 움직일 때는 214 00:09:47,119 --> 00:09:49,342 카메라가 쫓아가지 않아도 됩니다. 215 00:09:49,342 --> 00:09:51,635 캐릭터가 여백 밖으로 이동하면 216 00:09:51,635 --> 00:09:54,047 그제야 카메라가 따라옵니다. 217 00:09:54,047 --> 00:09:56,867 Super Mario World 카메라는 수직으로 순간 이동하기 위해 218 00:09:56,867 --> 00:09:59,544 특정한 높이를 사용합니다. 219 00:09:59,544 --> 00:10:01,544 앞으로 스테이지가 추가되면 필요하겠지만 220 00:10:01,544 --> 00:10:03,878 현재 이 게임에서는 X축으로 긴 레벨이 없으므로 221 00:10:03,878 --> 00:10:06,848 이러한 세부 사항까지는 필요 없습니다. 222 00:10:07,210 --> 00:10:09,210 이러한 이유로 카메라는 수평 작동 방식과 223 00:10:09,210 --> 00:10:12,787 비슷하게 수직으로 이동합니다. 224 00:10:18,779 --> 00:10:20,779 mainCamera 게임 오브젝트에서 CameraFollow 스크립트의 225 00:10:20,779 --> 00:10:23,138 코멘트를 통해 이러한 효과를 어떻게 226 00:10:23,138 --> 00:10:25,138 만들었는지 확인해 보십시오. 227 00:10:26,135 --> 00:10:27,845 이 게임에서 사용된 효과가 몇 개가 있으나 228 00:10:27,845 --> 00:10:29,845 주인공이 맞닥뜨린 외계인 학살자들을 공격하여 229 00:10:29,845 --> 00:10:32,732 처치하는 능력이 가장 중요합니다. 230 00:10:32,732 --> 00:10:36,338 주인공은 반동으로 발사되는 바주카를 사용합니다. 231 00:10:36,338 --> 00:10:38,898 이 동작은 여러 부분으로 나누어집니다. 232 00:10:38,898 --> 00:10:41,643 먼저 키 입력을 정하고, Fire 키가 눌러지면 233 00:10:41,643 --> 00:10:43,962 로켓의 인스턴스를 만들고 234 00:10:43,962 --> 00:10:47,969 오디오 클립을 재생하여 재생할 애니메이션 상태를 작동시킵니다. 235 00:10:47,969 --> 00:10:49,969 좀 더 자세하게 알아보도록 하죠. 236 00:10:49,969 --> 00:10:52,418 Run과 같은 다른 애니메이션 재생 중에 237 00:10:52,418 --> 00:10:54,418 Shoot 애니메이션을 재생하려면 238 00:10:54,418 --> 00:10:56,418 애니메이터 내에 Shooting이라는 별도의 레이어를 239 00:10:56,418 --> 00:10:57,677 만들어야 합니다. 240 00:10:57,677 --> 00:10:59,677 여기서 Weight 속성을 1로 설정하면 241 00:10:59,677 --> 00:11:02,532 Shooting 레이어에서 클립으로 움직이는 242 00:11:02,532 --> 00:11:04,532 캐릭터의 모든 부위에 대한 움직임을 기본 레이어에서 243 00:11:04,532 --> 00:11:06,980 완전히 재지정할 수 있습니다. 244 00:11:20,499 --> 00:11:22,499 이 레이어에서 Shoot 트리거 매개변수가 245 00:11:22,499 --> 00:11:25,351 코드에서 호출될 때 Shoot 애니메이션을 246 00:11:25,351 --> 00:11:27,351 다른 상태로 전환합니다. 247 00:11:27,351 --> 00:11:30,543 이 부분을 맡고 있는 Gun 스크립트를 확인해 볼까요? 248 00:11:32,700 --> 00:11:35,140 애니메이터에 접근하여 트리거를 True로 249 00:11:35,140 --> 00:11:37,402 설정한 것을 확인할 수 있습니다. 250 00:11:37,402 --> 00:11:40,513 트리거는 스위치로 작동하며 다음 프레임에서 스스로 False로 재설정해 251 00:11:40,513 --> 00:11:43,247 다시 호출할 수 있게 만들기 때문에 252 00:11:43,247 --> 00:11:45,511 Shooting과 같은 동작에 최적입니다. 253 00:11:46,011 --> 00:11:48,673 이 스크립트에서는 애니메이션 설정뿐만 아니라 254 00:11:48,673 --> 00:11:50,673 로켓을 발사하고, 255 00:11:50,673 --> 00:11:52,673 오디오 클립을 재생하고, 256 00:11:52,673 --> 00:11:54,673 플레이어가 바라보는 방향에 따라 257 00:11:54,673 --> 00:11:57,775 로켓의 인스턴스를 만들고 속도를 지정합니다. 258 00:11:57,775 --> 00:12:00,555 이는 X축에서 양수 또는 음수로 표시됩니다. 259 00:12:01,276 --> 00:12:03,933 이 스크립트는 주인공의 hierarchy의 빈 게임 오브젝트인 260 00:12:03,933 --> 00:12:05,294 Gun에 포함되어 있습니다. 261 00:12:05,294 --> 00:12:08,078 코드를 이런 방식으로 빈 게임 오브젝트에 놓으면 262 00:12:08,078 --> 00:12:10,078 로켓이 생성될 자리를 263 00:12:10,078 --> 00:12:11,663 쉽게 잡을 수 있습니다. 264 00:12:11,663 --> 00:12:13,663 바주카 끝 부분에 265 00:12:13,663 --> 00:12:16,010 빈 오브젝트를 위치시키고, 266 00:12:16,010 --> 00:12:18,010 로켓이 나타날 지점으로 267 00:12:18,010 --> 00:12:20,010 그 위치를 사용하게 됩니다. 268 00:12:40,248 --> 00:12:42,804 2D rigidbody로 만들어진 로켓이 269 00:12:42,804 --> 00:12:44,804 움직이게 만들려면 270 00:12:44,804 --> 00:12:46,804 속도를 지정해야 합니다. 271 00:12:46,804 --> 00:12:49,096 스트라이트 전환 불꽃 배기가스에 272 00:12:49,096 --> 00:12:51,096 연기를 표현하는 파티클 시스템이 있습니다. 273 00:12:52,826 --> 00:12:56,482 파티클 시스템은 새로운 스프라이트 그래픽 유형을 허용합니다. 274 00:12:56,482 --> 00:12:58,482 그러므로 재질에 연기 스프라이트 시트를 추가하여 275 00:12:58,482 --> 00:13:00,482 파티클 시스템의 텍스트 시트 애니메이션 모듈에 276 00:13:00,482 --> 00:13:04,149 할당할 수 있고 파티클 배출용 스프라이트의 277 00:13:04,149 --> 00:13:06,232 즉각적인 애니메이션을 278 00:13:06,232 --> 00:13:08,232 확보할 수 있습니다. 279 00:13:16,122 --> 00:13:18,935 로켓이 적을 강타하거나 배경의 일부에 맞으면 280 00:13:18,935 --> 00:13:20,935 로켓은 파괴되고 281 00:13:20,935 --> 00:13:22,935 폭파가 일어납니다. 282 00:13:22,935 --> 00:13:24,935 이러한 폭파는 생성한 스프라이트 시트를 통해 283 00:13:24,935 --> 00:13:27,731 애니메이팅 되는 스프라이트 게임 오브젝트입니다. 284 00:13:27,731 --> 00:13:30,311 그리고 다시 분류 레이어를 사용하여 285 00:13:30,311 --> 00:13:33,699 모든 전경 오브젝트 중 가장 낮은 레이어 순서에서 렌더링합니다. 286 00:13:36,174 --> 00:13:38,174 이러한 스프라이트 기반 애니메이션을 추가할 때 287 00:13:38,174 --> 00:13:40,174 Project 패널의 파일을 선택하고 288 00:13:40,174 --> 00:13:42,174 Sprite Mode Multiple을 선택하여 289 00:13:42,174 --> 00:13:44,576 스프라이트를 설정합니다. 290 00:13:44,576 --> 00:13:46,576 이를 통해 Sprite Editor에 액세스할 수 있어 291 00:13:46,576 --> 00:13:49,757 수동 또는 자동으로 자를 수 있습니다. 292 00:13:49,757 --> 00:13:52,406 파일에서 적절한 스프라이트를 선택한 후 293 00:13:52,406 --> 00:13:54,406 Apply를 클릭하면 294 00:13:54,406 --> 00:13:56,765 유니티에서 프로젝트에서 사용할 파일의 295 00:13:56,765 --> 00:13:58,765 하위 스프라이트를 생성합니다. 296 00:13:59,707 --> 00:14:01,693 로켓 만들기 아주 간단하죠? 297 00:14:01,693 --> 00:14:03,693 적을 처치하는 기법은 비디오 후반의 298 00:14:03,693 --> 00:14:06,533 적군 편에서 확인하겠습니다. 299 00:14:07,102 --> 00:14:09,448 플레이어 캐릭터로 돌아가서 체력과 적에게 입은 300 00:14:09,448 --> 00:14:12,194 피해를 어떻게 처리할지 확인해 보겠습니다. 301 00:14:12,194 --> 00:14:14,194 체력은 부동(Float)으로 저장되고 302 00:14:14,194 --> 00:14:16,194 적과 닿아서 생기는 상호 작용을 303 00:14:16,190 --> 00:14:18,548 TakeDamage 함수라고 부릅니다. 304 00:14:18,548 --> 00:14:20,548 이는 repeatDamagePeriod가 지났을 때만 305 00:14:20,548 --> 00:14:22,548 작동하여 플레이어가 너무 일찍 306 00:14:22,548 --> 00:14:25,347 죽는 것을 방지합니다. 307 00:14:26,524 --> 00:14:29,136 플레이어가 적을 더 쉽게 피하고 308 00:14:29,136 --> 00:14:31,136 피해를 입었을 때 알 수 있도록 309 00:14:31,136 --> 00:14:33,136 캐릭터가 물리적으로 피해를 받고 310 00:14:33,136 --> 00:14:34,847 반동으로 튕겨 나가게 만듭니다. 311 00:14:34,847 --> 00:14:37,540 이를 위해 TakeDamage 함수는 물리 포스를 추가하여 312 00:14:37,540 --> 00:14:39,540 플레이어의 잠시 점프하지 못하게 만들고 313 00:14:39,540 --> 00:14:42,125 적의 플레이어를 향한 벡터를 찾아 314 00:14:42,125 --> 00:14:44,125 적을 해당 방향으로 315 00:14:44,125 --> 00:14:46,125 튕겨 나가게 합니다. 316 00:14:46,125 --> 00:14:48,684 hurtForce 변수는 Inspector에 공개되어 있어 317 00:14:48,684 --> 00:14:51,323 스크립트로 다시 돌아가지 않고 318 00:14:51,323 --> 00:14:53,323 게임 플레이의 해당 요소를 조정하도록 319 00:14:53,323 --> 00:14:55,323 변경할 수 있습니다. 320 00:14:55,323 --> 00:14:57,323 플레이어를 밀어내는 것뿐 아니라 321 00:14:57,323 --> 00:14:59,810 플레이어의 체력을 감소시키고 322 00:14:59,810 --> 00:15:02,209 체력 게이지를 업데이트하는 것도 가능합니다. 323 00:15:02,209 --> 00:15:04,624 체력의 감소를 나타내려면 체력 게이지의 324 00:15:04,624 --> 00:15:06,885 가로 길이에서 감소한 부분을 빼며 325 00:15:06,885 --> 00:15:09,825 총 체력 대비 현재 체력의 비율을 찾아 326 00:15:09,825 --> 00:15:12,640 녹색과 빨간색의 색상 알림을 사용하여 327 00:15:12,640 --> 00:15:14,640 나타냅니다. 328 00:15:14,640 --> 00:15:17,873 체력 게이지는 게이지의 윤곽과 게이지 본체, 329 00:15:17,873 --> 00:15:19,965 즉 두 개의 스프라이트로 330 00:15:19,965 --> 00:15:21,744 구성되어 있습니다. 331 00:15:21,744 --> 00:15:23,744 이 체력 게이지는 포토샵에서 디자인된 다음에 332 00:15:23,744 --> 00:15:25,954 두 가지 개별 요소로 내보내진 것입니다. 333 00:15:25,954 --> 00:15:27,954 이 스프라이트의 가져오기 설정에서 334 00:15:27,954 --> 00:15:30,470 축을 그래픽 왼쪽 중간으로 설정하면 335 00:15:30,470 --> 00:15:34,053 값이 낮아질 때 왼쪽으로 줄어들게 됩니다. 336 00:15:48,573 --> 00:15:50,573 이 두 개의 스프라이트는 플레이어를 쫓아가도록 만드는 337 00:15:50,573 --> 00:15:52,573 단순한 스크립트를 가진 빈 상위 게임 오브젝트에 338 00:15:52,573 --> 00:15:54,573 속해 있습니다. 339 00:15:54,573 --> 00:15:56,621 플레이어 오브젝트의 위치와 같은 위치에 340 00:15:56,621 --> 00:15:58,621 설정하면 이것이 가능합니다. 341 00:15:58,621 --> 00:16:00,621 거기에 공개로 설정한 오프셋을 통해 342 00:16:00,621 --> 00:16:02,621 Inspector에서 조절할 수 있습니다. 343 00:16:16,215 --> 00:16:18,215 플레이어의 체력이 0이 되면 344 00:16:18,215 --> 00:16:20,215 충돌체를 트리거로 설정하여 345 00:16:20,215 --> 00:16:22,629 레벨에서 떨어지게 만듭니다. 346 00:16:22,629 --> 00:16:24,629 그리고 Sprite Renderer를 347 00:16:24,629 --> 00:16:28,194 게임의 가장 앞쪽에서 렌더링하도록 만드는 UI Sorting layer에 위치시켜 348 00:16:28,194 --> 00:16:31,594 렌더링의 가장 앞으로 플레이어를 이동시킵니다. 349 00:16:31,594 --> 00:16:34,223 플레이어 사망 시 모자와 총이 사라지는 Death와 350 00:16:34,223 --> 00:16:37,252 Falling이라고 부르는 두 개의 애니메이션이 351 00:16:37,252 --> 00:16:38,631 마련되어 있습니다. 352 00:16:38,631 --> 00:16:40,631 Death 애니메이션이 끝나면 353 00:16:40,631 --> 00:16:44,002 애니메이터의 전환 조건인 Exit Time에 따라 354 00:16:44,002 --> 00:16:47,239 Falling으로 자연스럽게 바뀝니다. 355 00:16:50,778 --> 00:16:52,778 마지막으로 Death 시퀀스 중 플레이어가 캐릭터를 356 00:16:52,778 --> 00:16:55,278 이동하거나 총을 쏘지 못하도록 하기 위해 357 00:16:55,278 --> 00:16:58,340 PlayerControl 및 Gun 스크립트를 비활성화합니다. 358 00:16:58,340 --> 00:17:00,731 Die 함수는 public으로 만들어졌으므로 359 00:17:00,731 --> 00:17:03,332 플레이어가 물에 빠지는 경우와 같은 여러 경우에 360 00:17:03,332 --> 00:17:05,040 호출할 수 있습니다. 361 00:17:05,040 --> 00:17:07,733 플레이어가 물에 닿았을 때 게임을 초기화하기 위해 362 00:17:07,733 --> 00:17:09,733 트리거 충돌체와 스크립트로 간단하게 구성된 363 00:17:09,733 --> 00:17:12,463 KillTrigger 오브젝트가 있습니다. 364 00:17:12,463 --> 00:17:15,012 게임 대부분의 경우 Remover 스크립트의 목적은 365 00:17:15,012 --> 00:17:17,012 강에 빠지는 적 오브젝트를 제거하고 366 00:17:17,012 --> 00:17:19,789 스플래시 애니메이션 및 사운드 효과의 367 00:17:19,789 --> 00:17:21,442 인스턴스 생성에 있습니다. 368 00:17:21,442 --> 00:17:24,001 그러나 이 트리거에서 플레이어가 감지되면 369 00:17:24,001 --> 00:17:27,092 PlayerHealth 스크립트의 Die 함수를 호출합니다. 370 00:17:27,092 --> 00:17:29,092 그리고 플레이어를 화면 밖으로 이동시키고 371 00:17:29,092 --> 00:17:31,092 2초간 일시 중지한 뒤 372 00:17:31,092 --> 00:17:34,527 코루틴을 호출하고 레벨을 다시 불러오는 동안 373 00:17:34,527 --> 00:17:36,527 CameraTracking을 비활성화합니다. 374 00:17:37,079 --> 00:17:39,079 이제 죽음에 대한 이야기는 그만하고 375 00:17:39,079 --> 00:17:41,079 생존과 그에 필요한 도구에 대해 376 00:17:41,079 --> 00:17:42,481 알아보죠. 377 00:17:42,481 --> 00:17:44,481 이 게임에서는 플레이어에게 도움을 주는 378 00:17:44,481 --> 00:17:47,124 2개의 상자가 하늘에서 떨어지는데 하나는 폭탄, 379 00:17:47,124 --> 00:17:49,911 다른 하나는 체력을 보충하는 구급 상자가 들어 있습니다. 380 00:17:50,411 --> 00:17:52,963 이 상자는 상자와 낙하산 이렇게 두 개의 381 00:17:52,963 --> 00:17:55,695 부분으로 구성되어 있습니다. 382 00:17:58,046 --> 00:18:01,311 이 두 요소는 빈 상위 오브젝트에 속해 있어 383 00:18:01,311 --> 00:18:03,768 그룹으로 애니메이트할 수 있습니다. 384 00:18:03,768 --> 00:18:05,768 낙하산의 중심이 상위 오브젝트의 중심에 놓이도록 385 00:18:05,768 --> 00:18:08,476 두 개의 스프라이트를 위치시킵니다. 386 00:18:09,045 --> 00:18:11,907 이로써 상자 달린 낙하산 전체가 지상으로 387 00:18:11,907 --> 00:18:15,307 내려오는 것처럼 애니메이션이 좌우로 흔들리게 됩니다. 388 00:18:15,307 --> 00:18:17,307 그리고 나서 rigidbody를 추가하여 중력에 의해 389 00:18:17,307 --> 00:18:19,307 오브젝트가 지상으로 내려오게 만듭니다. 390 00:18:19,307 --> 00:18:21,307 그리고 충돌체를 상자에 추가하여 상자가 391 00:18:21,307 --> 00:18:23,307 지상에 닿고 플레이어가 상자를 수집하는 순간을 392 00:18:23,307 --> 00:18:24,962 감지할 수 있도록 만듭니다. 393 00:18:24,962 --> 00:18:26,962 상자가 지상에 닿자마자 낙하산이 작아지는 394 00:18:26,962 --> 00:18:30,513 두 번째 애니메이션 상태로 전환합니다. 394 00:18:30,513 --> 00:18:33,308 게임의 다른 부분과 마찬가지로 애니메이터는 395 00:18:33,308 --> 00:18:34,916 오브젝트의 상태를 처리합니다. 396 00:18:34,916 --> 00:18:36,916 기본적으로 floatDown 애니메이션 상태의 397 00:18:36,916 --> 00:18:38,916 재생을 볼 수 있으나 398 00:18:38,916 --> 00:18:40,916 트리거 Land가 True로 설정되면 399 00:18:40,916 --> 00:18:43,472 Landing 상태로 전환됩니다. 400 00:18:43,972 --> 00:18:47,383 스크립트에서는 태그를 통해 지상을 감지하는 onTriggerEnter 함수를 401 00:18:47,383 --> 00:18:49,732 사용하여 이를 실시할 수 있습니다. 402 00:18:49,732 --> 00:18:52,822 또한 상위 오브젝트에서 상자 자체를 분리하고 403 00:18:52,822 --> 00:18:55,098 자신만의 rigidbody를 부여합니다. 404 00:18:55,098 --> 00:18:57,490 그리하여 경사지에 착륙했을 때 사실적으로 405 00:18:57,490 --> 00:19:00,624 배경과 상호 작용할 수 있도록 합니다. 406 00:19:00,624 --> 00:19:03,672 일단 폭탄을 살펴볼까요? 407 00:19:03,672 --> 00:19:05,672 폭탄 상자 수집은 상자에 연결된 408 00:19:05,672 --> 00:19:08,475 BombPickup 스크립트를 통해 처리하게 됩니다. 409 00:19:08,475 --> 00:19:11,057 상자를 수집 처리는 상자를 파괴하고 410 00:19:11,057 --> 00:19:13,057 LayBombs라고 불리는 플레이어에 연결된 411 00:19:13,057 --> 00:19:15,057 스크립트 안에 보유한 폭탄 수가 올라감으로써 412 00:19:15,057 --> 00:19:16,739 처리됩니다. 413 00:19:17,557 --> 00:19:19,557 LayBombs 스크립트는 단순히 플레이어가 414 00:19:19,557 --> 00:19:21,557 폭탄을 가지고 있는지 확인합니다. 415 00:19:21,557 --> 00:19:23,557 그리고 폭탄 프리팹 인스턴스를 416 00:19:23,557 --> 00:19:25,557 생성합니다. 417 00:19:27,424 --> 00:19:29,952 폭탄 프리팹에는 시한 퓨즈가 있는데 418 00:19:29,952 --> 00:19:32,147 Explode 함수를 호출하기 전까지 419 00:19:32,147 --> 00:19:34,147 BombDetonation 코루틴 내 Yield를 사용하여 420 00:19:34,147 --> 00:19:36,147 대기합니다. 421 00:19:36,799 --> 00:19:39,545 Explode 함수는 여러 가지 행동을 합니다. 422 00:19:39,545 --> 00:19:41,545 먼저 bombLaid 변수를 초기화하여 423 00:19:41,545 --> 00:19:43,797 다른 폭탄이 배치되도록 합니다. 424 00:19:43,797 --> 00:19:45,797 그리고는 수집 생성 지점에 새로운 상자가 425 00:19:45,797 --> 00:19:47,797 생성되도록 하고 정의된 폭발 범위 내 426 00:19:47,797 --> 00:19:49,797 적을 처치하도록 합니다. 427 00:19:50,518 --> 00:19:53,058 마지막 이 부분이 어떻게 작동하는지 살펴봅시다. 428 00:19:53,058 --> 00:19:55,058 폭탄은 적에게 남아 있는 체력과 관계없이 치명적인 무기이므로 429 00:19:55,058 --> 00:19:57,180 Physics.OverlapCircleAll을 사용하여 430 00:19:57,180 --> 00:19:59,976 폭탄의 특정 범위 내에 있는 431 00:19:59,976 --> 00:20:03,470 적으로 태그된 모든 오브젝트를 수집합니다. 432 00:20:03,470 --> 00:20:06,612 그리고 나서 발견한 모든 적에게 foreach loop를 실행하여 433 00:20:06,612 --> 00:20:10,663 체력을 0으로 설정하고 폭탄의 위치에서 적이 있었던 곳으로의 434 00:20:10,663 --> 00:20:12,663 벡터를 찾아 해당 벡터 방향에 435 00:20:12,663 --> 00:20:15,542 포스를 적용합니다. 436 00:20:16,304 --> 00:20:18,538 일단 foreach loop이 완성되면 437 00:20:18,538 --> 00:20:21,381 비주얼 효과를 재생하고 인스턴스화하고 438 00:20:21,381 --> 00:20:23,381 폭발음을 위한 오디오 클립을 재생하며 439 00:20:23,381 --> 00:20:25,907 폭탄을 폭발시킵니다. 440 00:20:26,875 --> 00:20:29,252 폭발은 두 부분으로 되어 있습니다. 441 00:20:29,252 --> 00:20:31,252 여기서 주요 부분은 잠시 나타났다가 442 00:20:31,252 --> 00:20:33,583 사라지는 원이고 443 00:20:33,583 --> 00:20:35,583 두 번째 부분은 로켓 폭발과 같은 스프라이트를 444 00:20:35,583 --> 00:20:37,583 다시 사용하는 별의 445 00:20:37,583 --> 00:20:39,583 파티클 시스템입니다. 446 00:20:42,265 --> 00:20:44,265 효율성을 위해 해당 씬에서 447 00:20:44,265 --> 00:20:46,265 파티클 시스템을 항상 유지하고 있으며 448 00:20:46,265 --> 00:20:48,265 필요 시 원하는 위치로 시스템을 이동해 449 00:20:48,265 --> 00:20:51,735 재생할 때는 코드를 사용합니다. 450 00:20:52,511 --> 00:20:54,511 메모리에 파티클 시스템을 유지하고 451 00:20:54,511 --> 00:20:56,511 게임을 효율적으로 만들어 줍니다. 452 00:20:57,011 --> 00:20:59,011 이 씬에서 플레이어는 453 00:20:59,011 --> 00:21:01,011 한 번에 하나의 폭탄만 던질 수 있습니다. 454 00:21:01,011 --> 00:21:04,668 즉 폭발은 한 번만 발생한다는 것을 알고 있기 때문에 455 00:21:04,668 --> 00:21:07,794 이렇게 작업할 수 있다는 것을 참고하시기 바랍니다. 456 00:21:07,794 --> 00:21:09,794 씬에서 인스턴스를 생성했다가 제거하는 것보다 457 00:21:09,794 --> 00:21:11,794 유지한 파티클 시스템을 재생하는 것이 458 00:21:11,794 --> 00:21:14,936 더 효율적인 이유가 바로 여기 있습니다. 459 00:21:15,714 --> 00:21:17,618 그러나 로켓 폭발의 경우, 460 00:21:17,618 --> 00:21:19,618 한 번에 여러 번의 폭발이 발생할 수 있으므로 461 00:21:19,618 --> 00:21:21,618 생성 후 제거해야 합니다. 462 00:21:22,118 --> 00:21:24,118 이제 플레이어가 적을 처치하고 점수를 얻는 장면을 463 00:21:24,118 --> 00:21:26,118 확인해 볼까요? 464 00:21:26,618 --> 00:21:28,436 이것도 두 가지 부분이 있습니다. 465 00:21:28,436 --> 00:21:31,668 100점 획득을 보여주는 점수 획득 애니메이션과 466 00:21:31,668 --> 00:21:33,668 점수 증분을 보여주는 화면 상단의 467 00:21:33,668 --> 00:21:35,528 점수 UI입니다. 468 00:21:35,528 --> 00:21:38,303 점수 애니메이션은 1과 0, 두 개의 숫자 스프라이트로 469 00:21:38,303 --> 00:21:40,193 구성되어 있습니다. 470 00:21:40,193 --> 00:21:42,872 이것을 빈 상위 오브젝트에 속한 씬에 위치시키고 471 00:21:42,872 --> 00:21:46,036 간단한 Destroyer 스크립트를 사용하여 애니메이팅하고, 472 00:21:46,036 --> 00:21:49,186 애니메이션이 끝나면 씬에서 제거합니다. 473 00:21:49,186 --> 00:21:51,186 타임라인 마지막에 애니메이션 이벤트를 474 00:21:51,186 --> 00:21:53,186 위치시켜 스크립트의 475 00:21:53,186 --> 00:21:55,186 Destroyer 함수를 호출합니다. 476 00:22:06,142 --> 00:22:09,703 ScoreUI 자체는 사용자 정의 폰트와 스크립트로 이루어진 477 00:22:09,703 --> 00:22:11,703 간단한 GUI 텍스트 요소로, 478 00:22:11,703 --> 00:22:13,703 플레이어의 점수를 관리합니다. 479 00:22:13,703 --> 00:22:16,759 Score 변수는 public 변수인데 이는 적이 사망했을 때 480 00:22:16,759 --> 00:22:18,980 Enemy 스트립트에서 읽어 100점을 추가할 수 있음을 481 00:22:18,980 --> 00:22:20,980 의미합니다. 482 00:22:20,980 --> 00:22:22,980 지금부터는 적에 대해서 좀 더 자세히 483 00:22:22,980 --> 00:22:24,980 알아보겠습니다. 484 00:22:25,480 --> 00:22:28,260 게임에는 민달팽이처럼 생긴 단순한 녹색 괴물과 485 00:22:28,260 --> 00:22:30,854 침공 중 자신을 보호하기 위해 486 00:22:30,854 --> 00:22:32,854 함선을 타고 오는 487 00:22:32,854 --> 00:22:34,563 두 종류의 외계인이 있습니다. 488 00:22:34,563 --> 00:22:36,563 이 캐릭터들의 행동은 매우 흡사하기 때문에 489 00:22:36,563 --> 00:22:38,563 같은 스크립트를 공유하지만 490 00:22:38,563 --> 00:22:40,881 Inspector에서 각각의 이동 속도와 방어력을 491 00:22:40,881 --> 00:22:42,881 public 변수들로 설정하여 492 00:22:42,881 --> 00:22:45,765 다르게 만들 수 있습니다. 493 00:22:46,638 --> 00:22:49,093 적들은 서로 다른 Walk 애니메이션을 가지고 있는데, 494 00:22:49,093 --> 00:22:51,093 민달팽이는 움직이는 꼬리를 가지고 있고 495 00:22:51,093 --> 00:22:54,444 함선을 타고 있는 외계인은 앞뒤로 움직이며 다가옵니다. 496 00:22:55,994 --> 00:22:57,994 민달팽이는 Sprite Importer를 사용하여 497 00:22:57,994 --> 00:22:59,994 그래픽의 꼬리 부분을 498 00:22:59,994 --> 00:23:01,994 개별 스프라이트 요소로 정의합니다. 499 00:23:01,994 --> 00:23:04,438 이를 통해 전체 스프라이트를 조정하지 않고도 500 00:23:04,438 --> 00:23:07,475 꼬리를 개별적으로 움직일 수 있습니다. 501 00:23:07,475 --> 00:23:09,475 축을 오른쪽으로 설정하면 502 00:23:09,475 --> 00:23:12,124 그 점에서부터 꼬리가 늘어났다 줄어드는 애니메이션을 503 00:23:12,124 --> 00:23:14,124 만들 수 있습니다. 504 00:23:16,475 --> 00:23:19,918 이 캐릭터의 경우 눈꺼풀을 위아래로 움직이는데 505 00:23:19,918 --> 00:23:21,918 Z값을 사용하여 여러 스프라이트를 서로 분류하여 506 00:23:21,918 --> 00:23:24,859 눈이 눈꺼풀 뒤에 오고 눈앞에서 눈꺼풀 애니메이션이 507 00:23:24,859 --> 00:23:26,859 연출되게 할 수 있습니다. 508 00:23:28,865 --> 00:23:31,268 두 번째 적의 애니메이션은 앞뒤로 회전만 시키면 되므로 509 00:23:31,268 --> 00:23:34,046 상당히 간단합니다. 510 00:23:35,798 --> 00:23:37,798 적을 이동시키는 기법은 511 00:23:37,798 --> 00:23:41,229 rigidbody의 속도를 설정하여 구동합니다. 512 00:23:41,229 --> 00:23:43,889 벽과 같은 장애물에 맞닥뜨리면 513 00:23:43,889 --> 00:23:47,826 충돌체와 겹치는 공간의 점을 확인하는 514 00:23:47,826 --> 00:23:51,317 Physics.OverlapPoint 함수로 이를 감지합니다. 515 00:23:51,317 --> 00:23:53,854 레벨 양쪽의 벽 또는 탑이 장애물로 516 00:23:53,854 --> 00:23:55,854 태그되어 있습니다. 517 00:23:55,850 --> 00:23:59,161 이 함수가 장애물을 감지하고 Flip 함수를 호출하면 518 00:23:59,161 --> 00:24:01,767 적의 X 스케일이 역전되고 519 00:24:01,767 --> 00:24:04,070 다른 방향으로 이동하게 됩니다. 520 00:24:04,070 --> 00:24:06,070 로켓이 적에 부딪힐 때마다 적을 처치하는 경우, 521 00:24:06,070 --> 00:24:09,036 스크립트는 로켓이 닿은 특정 적의 522 00:24:09,036 --> 00:24:11,036 Hurt 함수를 호출합니다. 523 00:24:14,962 --> 00:24:16,962 이 함수는 해당 적의 체력에서 524 00:24:16,962 --> 00:24:19,213 1을 감소시킵니다. 525 00:24:19,213 --> 00:24:21,213 그리고는 FixedUpdate 함수 내에서 526 00:24:21,213 --> 00:24:23,213 적의 체력을 계속 감소시키다가 527 00:24:23,213 --> 00:24:27,124 체력이 0으로 떨어지면 Death 함수를 호출합니다. 528 00:24:31,229 --> 00:24:33,916 적이 사망하면 몇 가지 함수를 수행합니다. 529 00:24:33,916 --> 00:24:35,916 먼저 2D 캐릭터가 움직이는 530 00:24:35,916 --> 00:24:37,916 여러 스프라이트 오브젝트로 구성되어 있으므로 531 00:24:37,916 --> 00:24:39,916 모든 Sprite Renderer를 비활성화합니다. 532 00:24:40,941 --> 00:24:42,941 이는 사망한 캐릭터의 움직이는 요소들을 533 00:24:42,941 --> 00:24:44,941 단일 스프라이트로 대체하기 534 00:24:44,941 --> 00:24:46,941 위해서입니다. 535 00:24:47,745 --> 00:24:49,745 주요 Sprite Renderer에 이와 같이 하려면 536 00:24:49,745 --> 00:24:51,745 deadEnemy 변수에 할당된 스프라이트를 사용하도록 537 00:24:51,745 --> 00:24:54,165 설정하면 됩니다. 538 00:24:54,165 --> 00:24:56,165 이제 Score 스크립트의 public 변수를 사용하여 539 00:24:56,165 --> 00:24:58,165 점수를 추가합니다. 540 00:24:58,165 --> 00:25:00,744 적 사망 시 토크를 추가하여 적을 회전시킴으로써 541 00:25:00,744 --> 00:25:03,534 적의 죽음에 시각적 효과를 추가합니다. 542 00:25:04,448 --> 00:25:06,448 적이 죽을 때는 배경을 통과해 떨어져 543 00:25:06,448 --> 00:25:08,881 강에 빠져야 하기 때문에 544 00:25:08,881 --> 00:25:10,881 오브젝트의 모든 충돌체를 찾은 다음 545 00:25:10,881 --> 00:25:13,589 IsTrigger 매개변수를 True로 설정합니다. 546 00:25:13,589 --> 00:25:15,139 이로써 적이 배경 충돌체에 충돌하지 않고 547 00:25:15,139 --> 00:25:17,417 떨어지게 됩니다. 548 00:25:17,417 --> 00:25:20,054 앞서 설명한 Score 애니메이션의 인스턴스를 생성하기 전에 549 00:25:20,054 --> 00:25:22,054 Death 오디오 클립 배열에서 하나를 550 00:25:22,054 --> 00:25:25,470 선택하여 재생합니다. 551 00:25:27,876 --> 00:25:29,876 사망한 적을 씬에서 제거하려면 552 00:25:29,876 --> 00:25:31,876 killTrigger 오브젝트를 이용합니다. 553 00:25:31,876 --> 00:25:34,762 killTrigger는 초반에 설명했던 것과 동일한 기능을 수행합니다. 554 00:25:34,762 --> 00:25:36,762 플레이어가 아닌 오브젝트가 건드리면 555 00:25:36,762 --> 00:25:39,950 스플래시 애니메이션이 작동되고 해당 오브젝트가 제거됩니다. 556 00:25:39,950 --> 00:25:41,950 물에 빠질 때 나는 사운드 효과는 557 00:25:41,950 --> 00:25:43,950 애니메이팅된 스플래시에 연결되어 Awake 작동 시 558 00:25:43,950 --> 00:25:45,950 재생되는 오디오 클립입니다. 559 00:25:45,950 --> 00:25:47,950 이로써 움직이는 오브젝트의 인스턴스가 생성되면 560 00:25:47,950 --> 00:25:50,634 사운드가 바로 재생되는 것입니다. 561 00:25:55,153 --> 00:25:57,153 게임 레벨을 마무리하기 위해서 배경을 몇 가지 562 00:25:57,153 --> 00:25:59,153 움직이는 소품으로 꾸밉니다. 563 00:25:59,153 --> 00:26:02,302 이를 통해 게임 배경을 좀 더 역동적으로 만들 수 있습니다. 564 00:26:02,302 --> 00:26:05,703 날아가는 백조에 강둑을 따라 달리는 버스와 택시를 565 00:26:05,703 --> 00:26:07,125 추가해 보죠. 566 00:26:07,125 --> 00:26:10,634 먼저 백조부터 시작합니다. 스프라이트 시트에서 생성하고 567 00:26:10,634 --> 00:26:12,634 포토샵에서 그린 다음 Inspector의 568 00:26:12,634 --> 00:26:14,634 Multiple Sprite Mode 가져오기 설정을 사용하여 가져온 569 00:26:14,634 --> 00:26:16,051 백조가 있습니다. 570 00:26:16,051 --> 00:26:18,800 이러한 접근을 선택함으로써 유니티는 시트의 각 프레임을 571 00:26:18,800 --> 00:26:20,800 선택하고 에셋의 상위 계층 아래에 속한 해당 프레임을 572 00:26:20,800 --> 00:26:22,800 개별 스프라이트로 가져오는 작업을 573 00:26:22,800 --> 00:26:24,579 자동화합니다. 574 00:26:24,579 --> 00:26:27,279 이들은 애니메이션 프레임의 선형 집단으로 575 00:26:27,279 --> 00:26:29,279 해당 스프라이트를 모두 드래그하여 씬에 넣기만 하면 576 00:26:29,279 --> 00:26:32,346 유니티가 알아서 애니메이션 작업을 진행합니다. 577 00:26:32,346 --> 00:26:35,317 드디어, 날아가는 백조가 배경 요소로 578 00:26:35,317 --> 00:26:37,759 추가될 준비가 되었습니다. 579 00:26:37,759 --> 00:26:40,165 이제는 백조에 rigidbody2D를 적용해서 580 00:26:40,165 --> 00:26:42,165 화면을 가로질러 날아갈 수 있는 속도를 581 00:26:42,165 --> 00:26:43,369 사용할 수 있도록 합니다. 582 00:26:43,369 --> 00:26:47,334 버스와 택시처럼 백조도 프리팹으로 저장됩니다. 583 00:26:49,257 --> 00:26:51,257 버스 및 택시 프리팹의 경우 584 00:26:51,257 --> 00:26:53,257 차량의 본체와 바퀴를 585 00:26:53,257 --> 00:26:55,257 Sprite Importer를 통해 분리하고 586 00:26:55,257 --> 00:26:58,392 간단히 흔들리는 애니메이션을 적용합니다. 587 00:26:58,392 --> 00:27:00,793 여기에 2d rigidbody도 적용하여 588 00:27:00,793 --> 00:27:02,793 속도를 사용해 화면을 지나가도록 만들 수 589 00:27:02,793 --> 00:27:04,376 있습니다. 590 00:27:07,279 --> 00:27:10,271 3가지 소품인 버스, 택시, 백조가 591 00:27:10,271 --> 00:27:12,271 화면에 나타나게 만드는 592 00:27:12,271 --> 00:27:14,271 재사용 가능한 하나의 스크립트를 생성했습니다. 593 00:27:14,271 --> 00:27:16,616 BackgroundPropsSpawner 스크립트 또한 594 00:27:16,616 --> 00:27:19,838 화면에 나타나는 출현 빈도, 지정 속도 및 595 00:27:19,838 --> 00:27:21,838 생성 위치를 처리합니다. 597 00:27:21,838 --> 00:27:24,521 이는 우리가 동일한 스크립트로 3개의 Creator 오브젝트를 596 00:27:24,521 --> 00:27:26,521 변경할 수 있다는 뜻입니다. 597 00:27:26,521 --> 00:27:28,521 어떤 프리팹을 생성할지, 어떤 속성을 줄 것인지 598 00:27:28,521 --> 00:27:30,521 변경할 수가 있는 것입니다. 599 00:27:30,521 --> 00:27:33,854 자세한 내용은 스크립트의 코멘트를 확인하십시오. 600 00:27:33,854 --> 00:27:36,172 마지막으로 배경에 역동성을 가미하기 위해 601 00:27:36,172 --> 00:27:40,409 흐르는 구름, 강과 안개를 추가했습니다. 602 00:27:41,323 --> 00:27:44,525 이들은 2개의 배경 스프라이트 인스턴스를 상위 오브젝트에 추가하여 603 00:27:44,525 --> 00:27:48,004 만들었는데 화면을 가로지르며 서서히 진행하는 애니메이션을 604 00:27:48,004 --> 00:27:50,004 사용했습니다. 605 00:27:50,004 --> 00:27:52,652 이 애니메이션은 루프 기능으로 606 00:27:52,652 --> 00:27:54,652 무한 반복됩니다. 607 00:27:59,185 --> 00:28:01,031 지금까지 유니티 게임 제작 방법을 소개해 드렸습니다. 608 00:28:01,031 --> 00:28:03,031 이 개요를 통해 유니티를 사용해 2D 게임을 제작하는 데 609 00:28:03,031 --> 00:28:05,516 도움이 되었길 바라고, 610 00:28:05,516 --> 00:28:07,516 앞으로 간단한 프로젝트 및 튜토리얼을 더 선보일 611 00:28:07,516 --> 00:28:08,971 것을 약속드립니다. 612 00:28:08,971 --> 00:28:11,689 Unity 4.3에 대한 여러분의 의견을 기다립니다. 613 00:28:11,689 --> 00:28:13,689 그리고 곧 여러분이 만든 훌륭한 2D 게임을 614 00:28:13,689 --> 00:28:14,959 만나볼 수 있길 기대합니다. 615 00:28:14,959 --> 00:28:16,487 감사합니다.