WEBVTT 00:00:00.000 --> 00:00:04.295 Unity 4.3에서 첫 2D 기능을 소개합니다. 00:00:04.295 --> 00:00:06.295 이를 알아보기 위해 이 툴을 이용하여 00:00:06.295 --> 00:00:08.295 데모 프로젝트를 만들어봤습니다. 00:00:08.295 --> 00:00:11.527 이 2D 플랫폼 게임은 Tower Bridge Defence라고 합니다. 00:00:11.527 --> 00:00:13.776 외계인의 습격을 받은 영국의 타워 브리지를 00:00:13.776 --> 00:00:15.556 묘사하고 있습니다. 00:00:15.556 --> 00:00:17.955 이는 스프라이트 및 물리 기반의 2D 샘플 레벨로 00:00:17.955 --> 00:00:20.216 유니티를 통해 어떻게 2D 게임을 만들 수 있는지 00:00:20.216 --> 00:00:23.472 보여드리고자 합니다. 00:00:23.472 --> 00:00:25.472 이 비디오를 통해 데모에서 사용된 00:00:25.472 --> 00:00:28.184 배경과 전경 제작, 캐릭터, 효과, 카메라 추적, 00:00:28.184 --> 00:00:30.184 애니메이션 및 스크립팅에 대해 00:00:30.184 --> 00:00:31.639 설명하겠습니다. 00:00:31.639 --> 00:00:33.639 우선 유니티에서 2D를 어떻게 00:00:33.653 --> 00:00:36.139 사용하는지 기초부터 알아보겠습니다. 00:00:36.860 --> 00:00:39.291 2D 작업을 위해서 가장 먼저 여러 설정에서 00:00:39.291 --> 00:00:41.221 Editor Behaviour Mode를 00:00:41.221 --> 00:00:43.040 2D로 설정해야 합니다. 00:00:43.040 --> 00:00:45.040 이는 프로젝트 마법사의 드롭다운 메뉴를 사용하여 00:00:45.040 --> 00:00:47.040 새로운 프로젝트를 만들 때 설정하거나, 작업 중에 00:00:47.040 --> 00:00:49.543 상단 메뉴에서 Edit - Project Settings - Editor를 00:00:49.543 --> 00:00:53.172 선택하여 설정할 수 있습니다. 00:00:53.172 --> 00:00:55.172 이렇게 하면 기본적으로 텍스처를 00:00:55.172 --> 00:00:57.172 스프라이트로 가져오게 되고 00:00:57.172 --> 00:00:59.630 Scene View는 2D 모드로 기본 설정됩니다. 00:00:59.630 --> 00:01:01.630 이 설정으로 2D 게임 제작에 필요한 완전한 직교 뷰 00:01:01.630 --> 00:01:04.420 (orthographic view)가 제공됩니다. 00:01:04.420 --> 00:01:06.806 또한 화면의 오른쪽 상단에 일반적으로 위치한 00:01:06.806 --> 00:01:09.197 3D 기즈모를 숨겨 더 넓은 작업 공간을 확보할 수 00:01:09.197 --> 00:01:11.941 있습니다. 이러한 설정 이외에도 2D 워크플로우는 00:01:11.941 --> 00:01:14.244 유니티의 기존 3D 게임 제작 방식을 00:01:14.244 --> 00:01:17.040 그대로 반영하도록 설계되었습니다. 00:01:17.040 --> 00:01:19.040 즉, 이미 유니티에 대해 알고 있는 사용자라면 00:01:19.040 --> 00:01:21.040 2D 게임 제작을 바로 시작할 수 있는 유리한 위치를 00:01:21.040 --> 00:01:22.929 선점하신 겁니다. 00:01:22.929 --> 00:01:24.929 유니티에서는 2D와 3D를 함께 섞어 사용할 수 있다는 점에 00:01:24.929 --> 00:01:27.219 주목할 필요가 있습니다. 예를 들어 00:01:27.219 --> 00:01:29.722 2D 게임에 3D 요소를 추가하고 싶다면(반대의 경우도 마찬가지) 00:01:29.722 --> 00:01:32.870 아무런 문제 없이 진행할 수 있습니다. 00:01:33.366 --> 00:01:35.496 데모 프로젝트를 살펴보면서 어떻게 완성되는지 00:01:35.496 --> 00:01:38.312 하나씩 살펴보도록 하죠. 00:01:38.812 --> 00:01:40.812 우선은 샘플 레벨의 레벨 디자인을 00:01:40.812 --> 00:01:42.812 스케치하는 것으로 시작하여 00:01:42.812 --> 00:01:44.812 포토샵에서 레이아웃을 만드는 작업을 거칩니다. 00:01:45.312 --> 00:01:47.312 만들어서 내보낸 레이어는 00:01:47.312 --> 00:01:49.312 새로운 스프라이트 유형으로 00:01:49.312 --> 00:01:51.312 유니티에 가져올 수 있습니다. 00:01:58.373 --> 00:02:01.306 나중에 배경에 시차(parallax)를 생성하려면 00:02:01.306 --> 00:02:03.666 배경 요소의 일부를 분리해서 00:02:03.666 --> 00:02:06.515 Background Sorting Layer에 위치시킵니다. 00:02:06.515 --> 00:02:09.658 유니티의 또 다른 2D 개발 기능입니다. 00:02:10.158 --> 00:02:12.841 이 레이어에 모든 배경을 할당한 다음에는 00:02:12.841 --> 00:02:15.157 Sprite Renderer의 Order In Layer 속성을 이용하여 00:02:15.157 --> 00:02:17.379 정렬할 수 있습니다. 00:02:17.379 --> 00:02:19.379 모든 위치가 지정되면 00:02:19.379 --> 00:02:21.379 Background Sorting Layer를 잠글 수 있습니다. 00:02:21.379 --> 00:02:23.379 이를 잠금으로써 전경 요소 추가 시 00:02:23.379 --> 00:02:25.379 실수로 배경 요소를 드래그할지도 모른다는 00:02:25.379 --> 00:02:27.751 걱정에서 벗어날 수 있습니다. 00:02:27.751 --> 00:02:29.751 이는 인터페이스 오른쪽 상단의 풀다운 메뉴인 00:02:29.751 --> 00:02:31.751 Layers에서 실시할 수 있습니다. 00:02:32.817 --> 00:02:35.531 배경 요소는 순전히 장식용이기 때문에 00:02:35.531 --> 00:02:37.531 스프라이트 게임 오브젝트에는 00:02:37.531 --> 00:02:39.531 추가 요소가 필요 없습니다. 00:02:39.531 --> 00:02:41.531 이들은 BackgroundParallax라고 불리는 00:02:41.531 --> 00:02:44.201 시차 조절을 위한 단순한 스크립트가 포함된 빈 게임 오브젝트에 00:02:44.201 --> 00:02:46.201 하위(child) 관계로 지정되었습니다. 00:02:46.201 --> 00:02:48.643 이 스크립트는 Scripts 폴더에서 확인할 수 있습니다. 00:02:48.643 --> 00:02:50.643 아주 자세한 주석과 함께 설명되어 있습니다. 00:02:54.914 --> 00:02:56.914 이제 캐릭터들이 실제로 뛰어다닐 00:02:56.914 --> 00:02:59.400 전경 요소를 생성할 차례입니다. 00:02:59.790 --> 00:03:02.280 런던 타워 브리지에 가운데에 UFO가 착륙한 모습을 00:03:02.280 --> 00:03:03.466 디자인했습니다. 00:03:03.466 --> 00:03:05.466 캐릭터는 하늘에서 나타나는 적을 피해 배경에서 00:03:05.466 --> 00:03:07.466 자유롭게 돌아다니면서 다음 레벨로 00:03:07.466 --> 00:03:09.216 진행해 나갑니다. 00:03:09.216 --> 00:03:11.216 그러므로 각각의 전경에는 캐릭터가 걸음을 디딜 수 있는 00:03:11.216 --> 00:03:13.632 충돌체가 필요합니다. 00:03:13.632 --> 00:03:15.632 효율성을 위해 대부분의 배경에는 00:03:15.632 --> 00:03:17.632 2D 박스 충돌체(Box Collider)를 사용하지만 00:03:17.632 --> 00:03:21.239 UFO는 복잡한 형태를 지니고 있습니다. 00:03:22.505 --> 00:03:24.505 유니티의 폴리곤 충돌체(Polygon Collider)를 사용하면 00:03:24.505 --> 00:03:26.878 스프라이트의 형태를 기반으로 00:03:26.878 --> 00:03:28.724 충돌체가 자동으로 생성됩니다. 00:03:28.724 --> 00:03:30.724 이는 나중에 충돌체의 형태를 변경할 수도 있음을 00:03:30.724 --> 00:03:32.053 의미합니다. 00:03:32.053 --> 00:03:34.164 충돌체 형태의 포인트들을 이동, 추가 또는 빼서 00:03:34.164 --> 00:03:36.164 걸어 다니기에 더 적합하게 00:03:36.164 --> 00:03:38.164 만들 수 있습니다. 00:03:38.664 --> 00:03:40.664 이러한 전경을 분류하기 위해 00:03:40.664 --> 00:03:43.154 Foregrounds Sorting Layer를 생성합니다. 00:03:43.154 --> 00:03:45.599 이 레이어는 Tags And Layers 관리자의 배경에 앞서게 위치시킵니다. 00:03:48.875 --> 00:03:50.875 다음으로 우리의 주인공을 살펴보죠. 00:03:53.709 --> 00:03:55.598 플레이어 캐릭터도 포토샵에서 디자인되었는데 00:03:55.598 --> 00:03:57.598 이 데모에서는 00:03:57.598 --> 00:03:59.598 2D 대작 게임의 주인공인 Rayman 같은 00:03:59.598 --> 00:04:01.598 독립적인 팔다리와 기능을 가진 00:04:01.598 --> 00:04:03.598 캐릭터를 만들기로 했습니다. 00:04:03.598 --> 00:04:05.598 또 다른 방법으로 스프라이트 시트 기반의 00:04:05.598 --> 00:04:08.140 애니메이션으로 포토샵에서 개별 프레임을 00:04:08.140 --> 00:04:09.643 디자인할 수도 있습니다. 00:04:09.643 --> 00:04:12.365 이는 나중에 배경에 있는 백조에 사용하게 될 방법으로 00:04:12.365 --> 00:04:14.365 본 비디오 후반에 설명하도록 하겠습니다. 00:04:15.072 --> 00:04:17.072 여기서 캐릭터의 개별 요소를 움직이게 하려면 00:04:17.072 --> 00:04:20.196 디자인을 완성한 뒤 신체 요소들을 00:04:20.196 --> 00:04:22.196 캔버스의 별도 공간으로 이동시켜 00:04:22.196 --> 00:04:25.408 유니티가 이들을 Importer에서 개별 스프라이트로 00:04:25.408 --> 00:04:27.959 분리시키도록 합니다. 00:04:28.763 --> 00:04:30.763 이는 모든 스트라이트를 움직이는 개별 요소들로 00:04:30.763 --> 00:04:33.096 정할 수 있다는 뜻입니다. 00:04:33.096 --> 00:04:35.495 이 요소들을 방금 생성한 Character Sorting Layer에 00:04:35.495 --> 00:04:38.167 위치시키고 Transform(변환) 내 Z값을 조절해 00:04:38.167 --> 00:04:40.921 원하는 렌더링 깊이로 정렬합니다. 00:04:48.811 --> 00:04:50.811 이제 이 모든 스프라이트는 00:04:50.811 --> 00:04:52.811 컨트롤 스크립팅, 충돌체, 물리 등이 모두 00:04:52.811 --> 00:04:56.591 포함되어 있는 빈 게임 오브젝트 내에 정렬됩니다. 00:04:56.591 --> 00:04:58.591 여기까지 완성되면 캐릭터의 각각의 스프라이트를 애니메이팅하여 00:04:58.591 --> 00:05:01.041 Idle, Run, Jump, Shoot 및 Death 애니메이션을 00:05:01.041 --> 00:05:03.906 만들 수 있는 업그레이드된 애니메이션 창을 00:05:03.906 --> 00:05:07.095 사용할 수 있게 됩니다. 00:05:07.095 --> 00:05:09.795 애니메이션 창의 새로운 도프시트 보기 덕분에 00:05:09.795 --> 00:05:11.795 이 작업이 정말 편해졌습니다. 00:05:13.414 --> 00:05:16.006 애니메이션을 상위(parent) 오브젝트에 추가하고 00:05:16.006 --> 00:05:19.403 하위(child) 오브젝트의 키프레임을 생성하면 됩니다. 00:05:19.403 --> 00:05:21.403 원하는 곳으로 플레이헤드를 옮긴 후 00:05:21.403 --> 00:05:23.403 캐릭터의 여러 부분을 옮기면 00:05:23.403 --> 00:05:25.403 키프레임 애니메이션이 자동으로 만들어집니다. 00:05:27.313 --> 00:05:29.644 애니메이션을 커브와 도프시트 사이에서 00:05:29.644 --> 00:05:32.448 전환하여 볼 수 있기 때문에 타이밍과 디자인 조절이 00:05:32.448 --> 00:05:35.064 정말 쉬워졌습니다. 00:05:36.730 --> 00:05:38.730 이렇게 생성된 애니메이션으로 00:05:38.730 --> 00:05:41.370 캐릭터의 상태 머신을 디자인하면 00:05:41.370 --> 00:05:43.801 코드가 호출되었을 때 여러 가지 애니메이션을 00:05:43.801 --> 00:05:45.277 재생할 수 있습니다. 00:05:45.277 --> 00:05:47.277 캐릭터의 애니메이터 컨트롤러는 00:05:47.277 --> 00:05:50.574 3D 바이패드로 구동되는 것이 아니므로 00:05:50.574 --> 00:05:53.673 물리 엔진에 맞춰 애니메이션을 구동하려면 00:05:53.673 --> 00:05:55.673 Apply Root Motion의 선택을 해제하고 00:05:55.673 --> 00:05:57.287 Animate Physics를 선택합니다. 00:05:57.287 --> 00:05:59.858 배경에서 움직이게 하려면 주인공의 발에는 00:05:59.858 --> 00:06:02.231 원형 충돌체를 지정하고 나머지 몸통 부분에는 00:06:02.231 --> 00:06:04.564 박스 충돌체를 지정합니다. 00:06:04.564 --> 00:06:07.067 이를 통해 주인공은 오르막을 자연스럽게 오르내릴 수 있고, 00:06:07.067 --> 00:06:09.454 점프하면 천장에 머리가 닿게 됩니다. 00:06:09.802 --> 00:06:12.537 캐릭터와 캐릭터 움직임을 제어하기 위해 00:06:12.537 --> 00:06:16.038 2D 물리 포스 내에서 움직이도록 스크립트를 작성했습니다. 00:06:16.038 --> 00:06:18.038 이를 통해 게임 중 물리를 주인공과 적에게 00:06:18.038 --> 00:06:20.038 적용할 수 있어 더욱 역동적인 게임 플레이가 00:06:20.038 --> 00:06:21.427 가능합니다. 00:06:21.427 --> 00:06:23.814 캐릭터의 PlayerControl 스크립트에서 00:06:23.814 --> 00:06:25.814 플레이어의 입력(input)을 확인합니다. 00:06:25.814 --> 00:06:27.814 이를 사용하여 물리 포스를 움직임에 적용하고 00:06:27.814 --> 00:06:30.766 입력 값을 애니메이터에게 전송함으로써 00:06:30.766 --> 00:06:33.487 어떤 애니메이션이 재생될지 정의하고 00:06:33.487 --> 00:06:36.475 상태(state)로 생성한 00:06:36.475 --> 00:06:38.475 여러 가지 애니메이션 클립 간의 00:06:38.475 --> 00:06:40.475 매끄러운 전환이 가능해집니다. 00:06:40.475 --> 00:06:42.475 애니메이션 클립에서 상태를 생성할 수 있는 00:06:42.475 --> 00:06:44.475 애니메이터를 사용해서 가장 좋은 점은 00:06:44.475 --> 00:06:46.861 다시 애니메이션 작업을 하지 않아도 물리 속도에 맞게 00:06:46.861 --> 00:06:48.861 애니메이션의 속도를 00:06:48.861 --> 00:06:51.278 조절할 수 있다는 것입니다. 00:07:23.129 --> 00:07:25.129 FixedUpdate 함수는 각 물리 단계를 평가한 다음 00:07:25.129 --> 00:07:27.588 가장 먼저 하는 것은 00:07:27.588 --> 00:07:29.588 Horizontal 입력 값을 애니메이터의 00:07:29.588 --> 00:07:32.994 Speed 매개변수에 공급하는 것입니다. 00:07:33.950 --> 00:07:35.950 단순한 상태 머신에서 Idle과 Run 간에 00:07:35.950 --> 00:07:37.950 전환하려면 Speed 매개변수가 00:07:37.950 --> 00:07:41.718 0.1 이상이어야 합니다. 00:07:41.718 --> 00:07:44.025 그렇게 되면 애니메이터는 Idle에서 Run 상태로 00:07:44.025 --> 00:07:46.025 블렌딩합니다. 00:07:51.857 --> 00:07:53.857 그리고 나서 움직이도록 하려면 00:07:53.857 --> 00:07:57.184 플레이어의 2D 물리 요소인 rigidbody2D에 00:07:57.184 --> 00:07:58.822 포스를 추가합니다. 00:07:59.626 --> 00:08:02.521 또한 Horizontal 입력 값이 0 보다 높은지 낮은지 확인하여 00:08:02.521 --> 00:08:04.702 캐릭터가 어느 방향을 바라보게 만들지 00:08:04.702 --> 00:08:07.710 결정합니다. 00:08:07.710 --> 00:08:10.557 그 원리는 유니티 내에서 왼쪽 입력 키를 누르면 00:08:10.557 --> 00:08:14.573 -1 값이 되고 오른쪽 입력 키는 +1 값이 되기 때문입니다. 00:08:15.073 --> 00:08:18.700 입력에 따라 캐릭터의 X축을 역전시켜 00:08:18.700 --> 00:08:21.477 캐릭터를 반대 방향으로 바꾸는 00:08:21.477 --> 00:08:24.566 뒤집기 함수를 호출합니다. 00:08:26.848 --> 00:08:28.848 플레이어가 지상에 있도록 정하려면 00:08:28.848 --> 00:08:31.605 Ground라고 하는 유니티 레이어를 추가하고 00:08:31.605 --> 00:08:34.982 캐릭터가 걸어 다닐 수 있는 전경 표면 전체에 적용합니다. 00:08:43.397 --> 00:08:45.969 2D의 Linecast 함수를 사용하면 00:08:45.969 --> 00:08:47.969 Ground 레이어에 속한 요소 중 캐릭터의 발밑에 위치한 것이 있는지 00:08:47.969 --> 00:08:50.234 확인할 수 있습니다. 00:08:50.234 --> 00:08:52.777 이를 더 손쉽게 커스터마이징하기 위해 00:08:52.777 --> 00:08:54.777 지상을 확인할 수 있는 포인트로 사용할 00:08:54.777 --> 00:08:56.777 빈 게임 오브젝트를 생성합니다. 00:08:56.777 --> 00:08:59.083 이 빈 오브젝트에 기즈모를 추가하면 00:08:59.083 --> 00:09:01.083 캐릭터 아래로 얼마나 먼지 조종할 수 있어 00:09:01.083 --> 00:09:03.083 지상을 확인할 수 있습니다. 00:09:03.083 --> 00:09:05.486 이것은 게임플레이 측면에서 보면 캐릭터가 00:09:05.486 --> 00:09:07.958 지상에 있을 때만 점프할 수 있다는 뜻이 됩니다. 00:09:08.456 --> 00:09:10.456 플레이어 제어에 대한 자세한 정보는 스크립트의 00:09:10.456 --> 00:09:12.648 다른 코멘트를 확인하십시오. 00:09:12.648 --> 00:09:14.648 플레이어의 무기는 비디오 후반에 00:09:14.648 --> 00:09:15.879 살펴보겠습니다. 00:09:15.879 --> 00:09:17.879 이제 데모에서 카메라가 어떻게 플레이어를 00:09:17.879 --> 00:09:19.879 추적하는지 알아보겠습니다. 00:09:21.291 --> 00:09:24.352 3D 게임과 마찬가지로 2D 게임에서도 00:09:24.352 --> 00:09:26.352 액션을 추적하는 카메라의 움직임이 00:09:26.352 --> 00:09:27.824 게임을 완성되게 만들 수도, 망칠 수도 있습니다. 00:09:27.824 --> 00:09:30.581 전통 2D 플랫폼 게임을 만들기 위해 2D 게임 역사에서 00:09:30.581 --> 00:09:33.625 가장 흥미로운 카메라 기법을 사용했던 00:09:33.625 --> 00:09:36.651 슈퍼 닌텐도 또는 슈퍼 패미콤용 게임인 00:09:36.651 --> 00:09:38.651 Super Mario World를 살펴보겠습니다. 00:09:38.651 --> 00:09:40.651 Super Mario world에서 카메라는 00:09:40.651 --> 00:09:42.651 수평으로 움직이지만 Viewport 중심에서 00:09:42.651 --> 00:09:45.119 사각지대 또는 여백을 사용하므로 00:09:45.119 --> 00:09:47.119 캐릭터가 조금씩 움직일 때는 00:09:47.119 --> 00:09:49.342 카메라가 쫓아가지 않아도 됩니다. 00:09:49.342 --> 00:09:51.635 캐릭터가 여백 밖으로 이동하면 00:09:51.635 --> 00:09:54.047 그제야 카메라가 따라옵니다. 00:09:54.047 --> 00:09:56.867 Super Mario World 카메라는 수직으로 순간 이동하기 위해 00:09:56.867 --> 00:09:59.544 특정한 높이를 사용합니다. 00:09:59.544 --> 00:10:01.544 앞으로 스테이지가 추가되면 필요하겠지만 00:10:01.544 --> 00:10:03.878 현재 이 게임에서는 X축으로 긴 레벨이 없으므로 00:10:03.878 --> 00:10:06.848 이러한 세부 사항까지는 필요 없습니다. 00:10:07.210 --> 00:10:09.210 이러한 이유로 카메라는 수평 작동 방식과 00:10:09.210 --> 00:10:12.787 비슷하게 수직으로 이동합니다. 00:10:18.779 --> 00:10:20.779 mainCamera 게임 오브젝트에서 CameraFollow 스크립트의 00:10:20.779 --> 00:10:23.138 코멘트를 통해 이러한 효과를 어떻게 00:10:23.138 --> 00:10:25.138 만들었는지 확인해 보십시오. 00:10:26.135 --> 00:10:27.845 이 게임에서 사용된 효과가 몇 개가 있으나 00:10:27.845 --> 00:10:29.845 주인공이 맞닥뜨린 외계인 학살자들을 공격하여 00:10:29.845 --> 00:10:32.732 처치하는 능력이 가장 중요합니다. 00:10:32.732 --> 00:10:36.338 주인공은 반동으로 발사되는 바주카를 사용합니다. 00:10:36.338 --> 00:10:38.898 이 동작은 여러 부분으로 나누어집니다. 00:10:38.898 --> 00:10:41.643 먼저 키 입력을 정하고, Fire 키가 눌러지면 00:10:41.643 --> 00:10:43.962 로켓의 인스턴스를 만들고 00:10:43.962 --> 00:10:47.969 오디오 클립을 재생하여 재생할 애니메이션 상태를 작동시킵니다. 00:10:47.969 --> 00:10:49.969 좀 더 자세하게 알아보도록 하죠. 00:10:49.969 --> 00:10:52.418 Run과 같은 다른 애니메이션 재생 중에 00:10:52.418 --> 00:10:54.418 Shoot 애니메이션을 재생하려면 00:10:54.418 --> 00:10:56.418 애니메이터 내에 Shooting이라는 별도의 레이어를 00:10:56.418 --> 00:10:57.677 만들어야 합니다. 00:10:57.677 --> 00:10:59.677 여기서 Weight 속성을 1로 설정하면 00:10:59.677 --> 00:11:02.532 Shooting 레이어에서 클립으로 움직이는 00:11:02.532 --> 00:11:04.532 캐릭터의 모든 부위에 대한 움직임을 기본 레이어에서 00:11:04.532 --> 00:11:06.980 완전히 재지정할 수 있습니다. 00:11:20.499 --> 00:11:22.499 이 레이어에서 Shoot 트리거 매개변수가 00:11:22.499 --> 00:11:25.351 코드에서 호출될 때 Shoot 애니메이션을 00:11:25.351 --> 00:11:27.351 다른 상태로 전환합니다. 00:11:27.351 --> 00:11:30.543 이 부분을 맡고 있는 Gun 스크립트를 확인해 볼까요? 00:11:32.700 --> 00:11:35.140 애니메이터에 접근하여 트리거를 True로 00:11:35.140 --> 00:11:37.402 설정한 것을 확인할 수 있습니다. 00:11:37.402 --> 00:11:40.513 트리거는 스위치로 작동하며 다음 프레임에서 스스로 False로 재설정해 00:11:40.513 --> 00:11:43.247 다시 호출할 수 있게 만들기 때문에 00:11:43.247 --> 00:11:45.511 Shooting과 같은 동작에 최적입니다. 00:11:46.011 --> 00:11:48.673 이 스크립트에서는 애니메이션 설정뿐만 아니라 00:11:48.673 --> 00:11:50.673 로켓을 발사하고, 00:11:50.673 --> 00:11:52.673 오디오 클립을 재생하고, 00:11:52.673 --> 00:11:54.673 플레이어가 바라보는 방향에 따라 00:11:54.673 --> 00:11:57.775 로켓의 인스턴스를 만들고 속도를 지정합니다. 00:11:57.775 --> 00:12:00.555 이는 X축에서 양수 또는 음수로 표시됩니다. 00:12:01.276 --> 00:12:03.933 이 스크립트는 주인공의 hierarchy의 빈 게임 오브젝트인 00:12:03.933 --> 00:12:05.294 Gun에 포함되어 있습니다. 00:12:05.294 --> 00:12:08.078 코드를 이런 방식으로 빈 게임 오브젝트에 놓으면 00:12:08.078 --> 00:12:10.078 로켓이 생성될 자리를 00:12:10.078 --> 00:12:11.663 쉽게 잡을 수 있습니다. 00:12:11.663 --> 00:12:13.663 바주카 끝 부분에 00:12:13.663 --> 00:12:16.010 빈 오브젝트를 위치시키고, 00:12:16.010 --> 00:12:18.010 로켓이 나타날 지점으로 00:12:18.010 --> 00:12:20.010 그 위치를 사용하게 됩니다. 00:12:40.248 --> 00:12:42.804 2D rigidbody로 만들어진 로켓이 00:12:42.804 --> 00:12:44.804 움직이게 만들려면 00:12:44.804 --> 00:12:46.804 속도를 지정해야 합니다. 00:12:46.804 --> 00:12:49.096 스트라이트 전환 불꽃 배기가스에 00:12:49.096 --> 00:12:51.096 연기를 표현하는 파티클 시스템이 있습니다. 00:12:52.826 --> 00:12:56.482 파티클 시스템은 새로운 스프라이트 그래픽 유형을 허용합니다. 00:12:56.482 --> 00:12:58.482 그러므로 재질에 연기 스프라이트 시트를 추가하여 00:12:58.482 --> 00:13:00.482 파티클 시스템의 텍스트 시트 애니메이션 모듈에 00:13:00.482 --> 00:13:04.149 할당할 수 있고 파티클 배출용 스프라이트의 00:13:04.149 --> 00:13:06.232 즉각적인 애니메이션을 00:13:06.232 --> 00:13:08.232 확보할 수 있습니다. 00:13:16.122 --> 00:13:18.935 로켓이 적을 강타하거나 배경의 일부에 맞으면 00:13:18.935 --> 00:13:20.935 로켓은 파괴되고 00:13:20.935 --> 00:13:22.935 폭파가 일어납니다. 00:13:22.935 --> 00:13:24.935 이러한 폭파는 생성한 스프라이트 시트를 통해 00:13:24.935 --> 00:13:27.731 애니메이팅 되는 스프라이트 게임 오브젝트입니다. 00:13:27.731 --> 00:13:30.311 그리고 다시 분류 레이어를 사용하여 00:13:30.311 --> 00:13:33.699 모든 전경 오브젝트 중 가장 낮은 레이어 순서에서 렌더링합니다. 00:13:36.174 --> 00:13:38.174 이러한 스프라이트 기반 애니메이션을 추가할 때 00:13:38.174 --> 00:13:40.174 Project 패널의 파일을 선택하고 00:13:40.174 --> 00:13:42.174 Sprite Mode Multiple을 선택하여 00:13:42.174 --> 00:13:44.576 스프라이트를 설정합니다. 00:13:44.576 --> 00:13:46.576 이를 통해 Sprite Editor에 액세스할 수 있어 00:13:46.576 --> 00:13:49.757 수동 또는 자동으로 자를 수 있습니다. 00:13:49.757 --> 00:13:52.406 파일에서 적절한 스프라이트를 선택한 후 00:13:52.406 --> 00:13:54.406 Apply를 클릭하면 00:13:54.406 --> 00:13:56.765 유니티에서 프로젝트에서 사용할 파일의 00:13:56.765 --> 00:13:58.765 하위 스프라이트를 생성합니다. 00:13:59.707 --> 00:14:01.693 로켓 만들기 아주 간단하죠? 00:14:01.693 --> 00:14:03.693 적을 처치하는 기법은 비디오 후반의 00:14:03.693 --> 00:14:06.533 적군 편에서 확인하겠습니다. 00:14:07.102 --> 00:14:09.448 플레이어 캐릭터로 돌아가서 체력과 적에게 입은 00:14:09.448 --> 00:14:12.194 피해를 어떻게 처리할지 확인해 보겠습니다. 00:14:12.194 --> 00:14:14.194 체력은 부동(Float)으로 저장되고 00:14:14.194 --> 00:14:16.194 적과 닿아서 생기는 상호 작용을 00:14:16.190 --> 00:14:18.548 TakeDamage 함수라고 부릅니다. 00:14:18.548 --> 00:14:20.548 이는 repeatDamagePeriod가 지났을 때만 00:14:20.548 --> 00:14:22.548 작동하여 플레이어가 너무 일찍 00:14:22.548 --> 00:14:25.347 죽는 것을 방지합니다. 00:14:26.524 --> 00:14:29.136 플레이어가 적을 더 쉽게 피하고 00:14:29.136 --> 00:14:31.136 피해를 입었을 때 알 수 있도록 00:14:31.136 --> 00:14:33.136 캐릭터가 물리적으로 피해를 받고 00:14:33.136 --> 00:14:34.847 반동으로 튕겨 나가게 만듭니다. 00:14:34.847 --> 00:14:37.540 이를 위해 TakeDamage 함수는 물리 포스를 추가하여 00:14:37.540 --> 00:14:39.540 플레이어의 잠시 점프하지 못하게 만들고 00:14:39.540 --> 00:14:42.125 적의 플레이어를 향한 벡터를 찾아 00:14:42.125 --> 00:14:44.125 적을 해당 방향으로 00:14:44.125 --> 00:14:46.125 튕겨 나가게 합니다. 00:14:46.125 --> 00:14:48.684 hurtForce 변수는 Inspector에 공개되어 있어 00:14:48.684 --> 00:14:51.323 스크립트로 다시 돌아가지 않고 00:14:51.323 --> 00:14:53.323 게임 플레이의 해당 요소를 조정하도록 00:14:53.323 --> 00:14:55.323 변경할 수 있습니다. 00:14:55.323 --> 00:14:57.323 플레이어를 밀어내는 것뿐 아니라 00:14:57.323 --> 00:14:59.810 플레이어의 체력을 감소시키고 00:14:59.810 --> 00:15:02.209 체력 게이지를 업데이트하는 것도 가능합니다. 00:15:02.209 --> 00:15:04.624 체력의 감소를 나타내려면 체력 게이지의 00:15:04.624 --> 00:15:06.885 가로 길이에서 감소한 부분을 빼며 00:15:06.885 --> 00:15:09.825 총 체력 대비 현재 체력의 비율을 찾아 00:15:09.825 --> 00:15:12.640 녹색과 빨간색의 색상 알림을 사용하여 00:15:12.640 --> 00:15:14.640 나타냅니다. 00:15:14.640 --> 00:15:17.873 체력 게이지는 게이지의 윤곽과 게이지 본체, 00:15:17.873 --> 00:15:19.965 즉 두 개의 스프라이트로 00:15:19.965 --> 00:15:21.744 구성되어 있습니다. 00:15:21.744 --> 00:15:23.744 이 체력 게이지는 포토샵에서 디자인된 다음에 00:15:23.744 --> 00:15:25.954 두 가지 개별 요소로 내보내진 것입니다. 00:15:25.954 --> 00:15:27.954 이 스프라이트의 가져오기 설정에서 00:15:27.954 --> 00:15:30.470 축을 그래픽 왼쪽 중간으로 설정하면 00:15:30.470 --> 00:15:34.053 값이 낮아질 때 왼쪽으로 줄어들게 됩니다. 00:15:48.573 --> 00:15:50.573 이 두 개의 스프라이트는 플레이어를 쫓아가도록 만드는 00:15:50.573 --> 00:15:52.573 단순한 스크립트를 가진 빈 상위 게임 오브젝트에 00:15:52.573 --> 00:15:54.573 속해 있습니다. 00:15:54.573 --> 00:15:56.621 플레이어 오브젝트의 위치와 같은 위치에 00:15:56.621 --> 00:15:58.621 설정하면 이것이 가능합니다. 00:15:58.621 --> 00:16:00.621 거기에 공개로 설정한 오프셋을 통해 00:16:00.621 --> 00:16:02.621 Inspector에서 조절할 수 있습니다. 00:16:16.215 --> 00:16:18.215 플레이어의 체력이 0이 되면 00:16:18.215 --> 00:16:20.215 충돌체를 트리거로 설정하여 00:16:20.215 --> 00:16:22.629 레벨에서 떨어지게 만듭니다. 00:16:22.629 --> 00:16:24.629 그리고 Sprite Renderer를 00:16:24.629 --> 00:16:28.194 게임의 가장 앞쪽에서 렌더링하도록 만드는 UI Sorting layer에 위치시켜 00:16:28.194 --> 00:16:31.594 렌더링의 가장 앞으로 플레이어를 이동시킵니다. 00:16:31.594 --> 00:16:34.223 플레이어 사망 시 모자와 총이 사라지는 Death와 00:16:34.223 --> 00:16:37.252 Falling이라고 부르는 두 개의 애니메이션이 00:16:37.252 --> 00:16:38.631 마련되어 있습니다. 00:16:38.631 --> 00:16:40.631 Death 애니메이션이 끝나면 00:16:40.631 --> 00:16:44.002 애니메이터의 전환 조건인 Exit Time에 따라 00:16:44.002 --> 00:16:47.239 Falling으로 자연스럽게 바뀝니다. 00:16:50.778 --> 00:16:52.778 마지막으로 Death 시퀀스 중 플레이어가 캐릭터를 00:16:52.778 --> 00:16:55.278 이동하거나 총을 쏘지 못하도록 하기 위해 00:16:55.278 --> 00:16:58.340 PlayerControl 및 Gun 스크립트를 비활성화합니다. 00:16:58.340 --> 00:17:00.731 Die 함수는 public으로 만들어졌으므로 00:17:00.731 --> 00:17:03.332 플레이어가 물에 빠지는 경우와 같은 여러 경우에 00:17:03.332 --> 00:17:05.040 호출할 수 있습니다. 00:17:05.040 --> 00:17:07.733 플레이어가 물에 닿았을 때 게임을 초기화하기 위해 00:17:07.733 --> 00:17:09.733 트리거 충돌체와 스크립트로 간단하게 구성된 00:17:09.733 --> 00:17:12.463 KillTrigger 오브젝트가 있습니다. 00:17:12.463 --> 00:17:15.012 게임 대부분의 경우 Remover 스크립트의 목적은 00:17:15.012 --> 00:17:17.012 강에 빠지는 적 오브젝트를 제거하고 00:17:17.012 --> 00:17:19.789 스플래시 애니메이션 및 사운드 효과의 00:17:19.789 --> 00:17:21.442 인스턴스 생성에 있습니다. 00:17:21.442 --> 00:17:24.001 그러나 이 트리거에서 플레이어가 감지되면 00:17:24.001 --> 00:17:27.092 PlayerHealth 스크립트의 Die 함수를 호출합니다. 00:17:27.092 --> 00:17:29.092 그리고 플레이어를 화면 밖으로 이동시키고 00:17:29.092 --> 00:17:31.092 2초간 일시 중지한 뒤 00:17:31.092 --> 00:17:34.527 코루틴을 호출하고 레벨을 다시 불러오는 동안 00:17:34.527 --> 00:17:36.527 CameraTracking을 비활성화합니다. 00:17:37.079 --> 00:17:39.079 이제 죽음에 대한 이야기는 그만하고 00:17:39.079 --> 00:17:41.079 생존과 그에 필요한 도구에 대해 00:17:41.079 --> 00:17:42.481 알아보죠. 00:17:42.481 --> 00:17:44.481 이 게임에서는 플레이어에게 도움을 주는 00:17:44.481 --> 00:17:47.124 2개의 상자가 하늘에서 떨어지는데 하나는 폭탄, 00:17:47.124 --> 00:17:49.911 다른 하나는 체력을 보충하는 구급 상자가 들어 있습니다. 00:17:50.411 --> 00:17:52.963 이 상자는 상자와 낙하산 이렇게 두 개의 00:17:52.963 --> 00:17:55.695 부분으로 구성되어 있습니다. 00:17:58.046 --> 00:18:01.311 이 두 요소는 빈 상위 오브젝트에 속해 있어 00:18:01.311 --> 00:18:03.768 그룹으로 애니메이트할 수 있습니다. 00:18:03.768 --> 00:18:05.768 낙하산의 중심이 상위 오브젝트의 중심에 놓이도록 00:18:05.768 --> 00:18:08.476 두 개의 스프라이트를 위치시킵니다. 00:18:09.045 --> 00:18:11.907 이로써 상자 달린 낙하산 전체가 지상으로 00:18:11.907 --> 00:18:15.307 내려오는 것처럼 애니메이션이 좌우로 흔들리게 됩니다. 00:18:15.307 --> 00:18:17.307 그리고 나서 rigidbody를 추가하여 중력에 의해 00:18:17.307 --> 00:18:19.307 오브젝트가 지상으로 내려오게 만듭니다. 00:18:19.307 --> 00:18:21.307 그리고 충돌체를 상자에 추가하여 상자가 00:18:21.307 --> 00:18:23.307 지상에 닿고 플레이어가 상자를 수집하는 순간을 00:18:23.307 --> 00:18:24.962 감지할 수 있도록 만듭니다. 00:18:24.962 --> 00:18:26.962 상자가 지상에 닿자마자 낙하산이 작아지는 394 00:18:26,962 --> 00:18:30,513 두 번째 애니메이션 상태로 전환합니다. 00:18:30.513 --> 00:18:33.308 게임의 다른 부분과 마찬가지로 애니메이터는 00:18:33.308 --> 00:18:34.916 오브젝트의 상태를 처리합니다. 00:18:34.916 --> 00:18:36.916 기본적으로 floatDown 애니메이션 상태의 00:18:36.916 --> 00:18:38.916 재생을 볼 수 있으나 00:18:38.916 --> 00:18:40.916 트리거 Land가 True로 설정되면 00:18:40.916 --> 00:18:43.472 Landing 상태로 전환됩니다. 00:18:43.972 --> 00:18:47.383 스크립트에서는 태그를 통해 지상을 감지하는 onTriggerEnter 함수를 00:18:47.383 --> 00:18:49.732 사용하여 이를 실시할 수 있습니다. 00:18:49.732 --> 00:18:52.822 또한 상위 오브젝트에서 상자 자체를 분리하고 00:18:52.822 --> 00:18:55.098 자신만의 rigidbody를 부여합니다. 00:18:55.098 --> 00:18:57.490 그리하여 경사지에 착륙했을 때 사실적으로 00:18:57.490 --> 00:19:00.624 배경과 상호 작용할 수 있도록 합니다. 00:19:00.624 --> 00:19:03.672 일단 폭탄을 살펴볼까요? 00:19:03.672 --> 00:19:05.672 폭탄 상자 수집은 상자에 연결된 00:19:05.672 --> 00:19:08.475 BombPickup 스크립트를 통해 처리하게 됩니다. 00:19:08.475 --> 00:19:11.057 상자를 수집 처리는 상자를 파괴하고 00:19:11.057 --> 00:19:13.057 LayBombs라고 불리는 플레이어에 연결된 00:19:13.057 --> 00:19:15.057 스크립트 안에 보유한 폭탄 수가 올라감으로써 00:19:15.057 --> 00:19:16.739 처리됩니다. 00:19:17.557 --> 00:19:19.557 LayBombs 스크립트는 단순히 플레이어가 00:19:19.557 --> 00:19:21.557 폭탄을 가지고 있는지 확인합니다. 00:19:21.557 --> 00:19:23.557 그리고 폭탄 프리팹 인스턴스를 00:19:23.557 --> 00:19:25.557 생성합니다. 00:19:27.424 --> 00:19:29.952 폭탄 프리팹에는 시한 퓨즈가 있는데 00:19:29.952 --> 00:19:32.147 Explode 함수를 호출하기 전까지 00:19:32.147 --> 00:19:34.147 BombDetonation 코루틴 내 Yield를 사용하여 00:19:34.147 --> 00:19:36.147 대기합니다. 00:19:36.799 --> 00:19:39.545 Explode 함수는 여러 가지 행동을 합니다. 00:19:39.545 --> 00:19:41.545 먼저 bombLaid 변수를 초기화하여 00:19:41.545 --> 00:19:43.797 다른 폭탄이 배치되도록 합니다. 00:19:43.797 --> 00:19:45.797 그리고는 수집 생성 지점에 새로운 상자가 00:19:45.797 --> 00:19:47.797 생성되도록 하고 정의된 폭발 범위 내 00:19:47.797 --> 00:19:49.797 적을 처치하도록 합니다. 00:19:50.518 --> 00:19:53.058 마지막 이 부분이 어떻게 작동하는지 살펴봅시다. 00:19:53.058 --> 00:19:55.058 폭탄은 적에게 남아 있는 체력과 관계없이 치명적인 무기이므로 00:19:55.058 --> 00:19:57.180 Physics.OverlapCircleAll을 사용하여 00:19:57.180 --> 00:19:59.976 폭탄의 특정 범위 내에 있는 00:19:59.976 --> 00:20:03.470 적으로 태그된 모든 오브젝트를 수집합니다. 00:20:03.470 --> 00:20:06.612 그리고 나서 발견한 모든 적에게 foreach loop를 실행하여 00:20:06.612 --> 00:20:10.663 체력을 0으로 설정하고 폭탄의 위치에서 적이 있었던 곳으로의 00:20:10.663 --> 00:20:12.663 벡터를 찾아 해당 벡터 방향에 00:20:12.663 --> 00:20:15.542 포스를 적용합니다. 00:20:16.304 --> 00:20:18.538 일단 foreach loop이 완성되면 00:20:18.538 --> 00:20:21.381 비주얼 효과를 재생하고 인스턴스화하고 00:20:21.381 --> 00:20:23.381 폭발음을 위한 오디오 클립을 재생하며 00:20:23.381 --> 00:20:25.907 폭탄을 폭발시킵니다. 00:20:26.875 --> 00:20:29.252 폭발은 두 부분으로 되어 있습니다. 00:20:29.252 --> 00:20:31.252 여기서 주요 부분은 잠시 나타났다가 00:20:31.252 --> 00:20:33.583 사라지는 원이고 00:20:33.583 --> 00:20:35.583 두 번째 부분은 로켓 폭발과 같은 스프라이트를 00:20:35.583 --> 00:20:37.583 다시 사용하는 별의 00:20:37.583 --> 00:20:39.583 파티클 시스템입니다. 00:20:42.265 --> 00:20:44.265 효율성을 위해 해당 씬에서 00:20:44.265 --> 00:20:46.265 파티클 시스템을 항상 유지하고 있으며 00:20:46.265 --> 00:20:48.265 필요 시 원하는 위치로 시스템을 이동해 00:20:48.265 --> 00:20:51.735 재생할 때는 코드를 사용합니다. 00:20:52.511 --> 00:20:54.511 메모리에 파티클 시스템을 유지하고 00:20:54.511 --> 00:20:56.511 게임을 효율적으로 만들어 줍니다. 00:20:57.011 --> 00:20:59.011 이 씬에서 플레이어는 00:20:59.011 --> 00:21:01.011 한 번에 하나의 폭탄만 던질 수 있습니다. 00:21:01.011 --> 00:21:04.668 즉 폭발은 한 번만 발생한다는 것을 알고 있기 때문에 00:21:04.668 --> 00:21:07.794 이렇게 작업할 수 있다는 것을 참고하시기 바랍니다. 00:21:07.794 --> 00:21:09.794 씬에서 인스턴스를 생성했다가 제거하는 것보다 00:21:09.794 --> 00:21:11.794 유지한 파티클 시스템을 재생하는 것이 00:21:11.794 --> 00:21:14.936 더 효율적인 이유가 바로 여기 있습니다. 00:21:15.714 --> 00:21:17.618 그러나 로켓 폭발의 경우, 00:21:17.618 --> 00:21:19.618 한 번에 여러 번의 폭발이 발생할 수 있으므로 00:21:19.618 --> 00:21:21.618 생성 후 제거해야 합니다. 00:21:22.118 --> 00:21:24.118 이제 플레이어가 적을 처치하고 점수를 얻는 장면을 00:21:24.118 --> 00:21:26.118 확인해 볼까요? 00:21:26.618 --> 00:21:28.436 이것도 두 가지 부분이 있습니다. 00:21:28.436 --> 00:21:31.668 100점 획득을 보여주는 점수 획득 애니메이션과 00:21:31.668 --> 00:21:33.668 점수 증분을 보여주는 화면 상단의 00:21:33.668 --> 00:21:35.528 점수 UI입니다. 00:21:35.528 --> 00:21:38.303 점수 애니메이션은 1과 0, 두 개의 숫자 스프라이트로 00:21:38.303 --> 00:21:40.193 구성되어 있습니다. 00:21:40.193 --> 00:21:42.872 이것을 빈 상위 오브젝트에 속한 씬에 위치시키고 00:21:42.872 --> 00:21:46.036 간단한 Destroyer 스크립트를 사용하여 애니메이팅하고, 00:21:46.036 --> 00:21:49.186 애니메이션이 끝나면 씬에서 제거합니다. 00:21:49.186 --> 00:21:51.186 타임라인 마지막에 애니메이션 이벤트를 00:21:51.186 --> 00:21:53.186 위치시켜 스크립트의 00:21:53.186 --> 00:21:55.186 Destroyer 함수를 호출합니다. 00:22:06.142 --> 00:22:09.703 ScoreUI 자체는 사용자 정의 폰트와 스크립트로 이루어진 00:22:09.703 --> 00:22:11.703 간단한 GUI 텍스트 요소로, 00:22:11.703 --> 00:22:13.703 플레이어의 점수를 관리합니다. 00:22:13.703 --> 00:22:16.759 Score 변수는 public 변수인데 이는 적이 사망했을 때 00:22:16.759 --> 00:22:18.980 Enemy 스트립트에서 읽어 100점을 추가할 수 있음을 00:22:18.980 --> 00:22:20.980 의미합니다. 00:22:20.980 --> 00:22:22.980 지금부터는 적에 대해서 좀 더 자세히 00:22:22.980 --> 00:22:24.980 알아보겠습니다. 00:22:25.480 --> 00:22:28.260 게임에는 민달팽이처럼 생긴 단순한 녹색 괴물과 00:22:28.260 --> 00:22:30.854 침공 중 자신을 보호하기 위해 00:22:30.854 --> 00:22:32.854 함선을 타고 오는 00:22:32.854 --> 00:22:34.563 두 종류의 외계인이 있습니다. 00:22:34.563 --> 00:22:36.563 이 캐릭터들의 행동은 매우 흡사하기 때문에 00:22:36.563 --> 00:22:38.563 같은 스크립트를 공유하지만 00:22:38.563 --> 00:22:40.881 Inspector에서 각각의 이동 속도와 방어력을 00:22:40.881 --> 00:22:42.881 public 변수들로 설정하여 00:22:42.881 --> 00:22:45.765 다르게 만들 수 있습니다. 00:22:46.638 --> 00:22:49.093 적들은 서로 다른 Walk 애니메이션을 가지고 있는데, 00:22:49.093 --> 00:22:51.093 민달팽이는 움직이는 꼬리를 가지고 있고 00:22:51.093 --> 00:22:54.444 함선을 타고 있는 외계인은 앞뒤로 움직이며 다가옵니다. 00:22:55.994 --> 00:22:57.994 민달팽이는 Sprite Importer를 사용하여 00:22:57.994 --> 00:22:59.994 그래픽의 꼬리 부분을 00:22:59.994 --> 00:23:01.994 개별 스프라이트 요소로 정의합니다. 00:23:01.994 --> 00:23:04.438 이를 통해 전체 스프라이트를 조정하지 않고도 00:23:04.438 --> 00:23:07.475 꼬리를 개별적으로 움직일 수 있습니다. 00:23:07.475 --> 00:23:09.475 축을 오른쪽으로 설정하면 00:23:09.475 --> 00:23:12.124 그 점에서부터 꼬리가 늘어났다 줄어드는 애니메이션을 00:23:12.124 --> 00:23:14.124 만들 수 있습니다. 00:23:16.475 --> 00:23:19.918 이 캐릭터의 경우 눈꺼풀을 위아래로 움직이는데 00:23:19.918 --> 00:23:21.918 Z값을 사용하여 여러 스프라이트를 서로 분류하여 00:23:21.918 --> 00:23:24.859 눈이 눈꺼풀 뒤에 오고 눈앞에서 눈꺼풀 애니메이션이 00:23:24.859 --> 00:23:26.859 연출되게 할 수 있습니다. 00:23:28.865 --> 00:23:31.268 두 번째 적의 애니메이션은 앞뒤로 회전만 시키면 되므로 00:23:31.268 --> 00:23:34.046 상당히 간단합니다. 00:23:35.798 --> 00:23:37.798 적을 이동시키는 기법은 00:23:37.798 --> 00:23:41.229 rigidbody의 속도를 설정하여 구동합니다. 00:23:41.229 --> 00:23:43.889 벽과 같은 장애물에 맞닥뜨리면 00:23:43.889 --> 00:23:47.826 충돌체와 겹치는 공간의 점을 확인하는 00:23:47.826 --> 00:23:51.317 Physics.OverlapPoint 함수로 이를 감지합니다. 00:23:51.317 --> 00:23:53.854 레벨 양쪽의 벽 또는 탑이 장애물로 00:23:53.854 --> 00:23:55.854 태그되어 있습니다. 00:23:55.850 --> 00:23:59.161 이 함수가 장애물을 감지하고 Flip 함수를 호출하면 00:23:59.161 --> 00:24:01.767 적의 X 스케일이 역전되고 00:24:01.767 --> 00:24:04.070 다른 방향으로 이동하게 됩니다. 00:24:04.070 --> 00:24:06.070 로켓이 적에 부딪힐 때마다 적을 처치하는 경우, 00:24:06.070 --> 00:24:09.036 스크립트는 로켓이 닿은 특정 적의 00:24:09.036 --> 00:24:11.036 Hurt 함수를 호출합니다. 00:24:14.962 --> 00:24:16.962 이 함수는 해당 적의 체력에서 00:24:16.962 --> 00:24:19.213 1을 감소시킵니다. 00:24:19.213 --> 00:24:21.213 그리고는 FixedUpdate 함수 내에서 00:24:21.213 --> 00:24:23.213 적의 체력을 계속 감소시키다가 00:24:23.213 --> 00:24:27.124 체력이 0으로 떨어지면 Death 함수를 호출합니다. 00:24:31.229 --> 00:24:33.916 적이 사망하면 몇 가지 함수를 수행합니다. 00:24:33.916 --> 00:24:35.916 먼저 2D 캐릭터가 움직이는 00:24:35.916 --> 00:24:37.916 여러 스프라이트 오브젝트로 구성되어 있으므로 00:24:37.916 --> 00:24:39.916 모든 Sprite Renderer를 비활성화합니다. 00:24:40.941 --> 00:24:42.941 이는 사망한 캐릭터의 움직이는 요소들을 00:24:42.941 --> 00:24:44.941 단일 스프라이트로 대체하기 00:24:44.941 --> 00:24:46.941 위해서입니다. 00:24:47.745 --> 00:24:49.745 주요 Sprite Renderer에 이와 같이 하려면 00:24:49.745 --> 00:24:51.745 deadEnemy 변수에 할당된 스프라이트를 사용하도록 00:24:51.745 --> 00:24:54.165 설정하면 됩니다. 00:24:54.165 --> 00:24:56.165 이제 Score 스크립트의 public 변수를 사용하여 00:24:56.165 --> 00:24:58.165 점수를 추가합니다. 00:24:58.165 --> 00:25:00.744 적 사망 시 토크를 추가하여 적을 회전시킴으로써 00:25:00.744 --> 00:25:03.534 적의 죽음에 시각적 효과를 추가합니다. 00:25:04.448 --> 00:25:06.448 적이 죽을 때는 배경을 통과해 떨어져 00:25:06.448 --> 00:25:08.881 강에 빠져야 하기 때문에 00:25:08.881 --> 00:25:10.881 오브젝트의 모든 충돌체를 찾은 다음 00:25:10.881 --> 00:25:13.589 IsTrigger 매개변수를 True로 설정합니다. 00:25:13.589 --> 00:25:15.139 이로써 적이 배경 충돌체에 충돌하지 않고 00:25:15.139 --> 00:25:17.417 떨어지게 됩니다. 00:25:17.417 --> 00:25:20.054 앞서 설명한 Score 애니메이션의 인스턴스를 생성하기 전에 00:25:20.054 --> 00:25:22.054 Death 오디오 클립 배열에서 하나를 00:25:22.054 --> 00:25:25.470 선택하여 재생합니다. 00:25:27.876 --> 00:25:29.876 사망한 적을 씬에서 제거하려면 00:25:29.876 --> 00:25:31.876 killTrigger 오브젝트를 이용합니다. 00:25:31.876 --> 00:25:34.762 killTrigger는 초반에 설명했던 것과 동일한 기능을 수행합니다. 00:25:34.762 --> 00:25:36.762 플레이어가 아닌 오브젝트가 건드리면 00:25:36.762 --> 00:25:39.950 스플래시 애니메이션이 작동되고 해당 오브젝트가 제거됩니다. 00:25:39.950 --> 00:25:41.950 물에 빠질 때 나는 사운드 효과는 00:25:41.950 --> 00:25:43.950 애니메이팅된 스플래시에 연결되어 Awake 작동 시 00:25:43.950 --> 00:25:45.950 재생되는 오디오 클립입니다. 00:25:45.950 --> 00:25:47.950 이로써 움직이는 오브젝트의 인스턴스가 생성되면 00:25:47.950 --> 00:25:50.634 사운드가 바로 재생되는 것입니다. 00:25:55.153 --> 00:25:57.153 게임 레벨을 마무리하기 위해서 배경을 몇 가지 00:25:57.153 --> 00:25:59.153 움직이는 소품으로 꾸밉니다. 00:25:59.153 --> 00:26:02.302 이를 통해 게임 배경을 좀 더 역동적으로 만들 수 있습니다. 00:26:02.302 --> 00:26:05.703 날아가는 백조에 강둑을 따라 달리는 버스와 택시를 00:26:05.703 --> 00:26:07.125 추가해 보죠. 00:26:07.125 --> 00:26:10.634 먼저 백조부터 시작합니다. 스프라이트 시트에서 생성하고 00:26:10.634 --> 00:26:12.634 포토샵에서 그린 다음 Inspector의 00:26:12.634 --> 00:26:14.634 Multiple Sprite Mode 가져오기 설정을 사용하여 가져온 00:26:14.634 --> 00:26:16.051 백조가 있습니다. 00:26:16.051 --> 00:26:18.800 이러한 접근을 선택함으로써 유니티는 시트의 각 프레임을 00:26:18.800 --> 00:26:20.800 선택하고 에셋의 상위 계층 아래에 속한 해당 프레임을 00:26:20.800 --> 00:26:22.800 개별 스프라이트로 가져오는 작업을 00:26:22.800 --> 00:26:24.579 자동화합니다. 00:26:24.579 --> 00:26:27.279 이들은 애니메이션 프레임의 선형 집단으로 00:26:27.279 --> 00:26:29.279 해당 스프라이트를 모두 드래그하여 씬에 넣기만 하면 00:26:29.279 --> 00:26:32.346 유니티가 알아서 애니메이션 작업을 진행합니다. 00:26:32.346 --> 00:26:35.317 드디어, 날아가는 백조가 배경 요소로 00:26:35.317 --> 00:26:37.759 추가될 준비가 되었습니다. 00:26:37.759 --> 00:26:40.165 이제는 백조에 rigidbody2D를 적용해서 00:26:40.165 --> 00:26:42.165 화면을 가로질러 날아갈 수 있는 속도를 00:26:42.165 --> 00:26:43.369 사용할 수 있도록 합니다. 00:26:43.369 --> 00:26:47.334 버스와 택시처럼 백조도 프리팹으로 저장됩니다. 00:26:49.257 --> 00:26:51.257 버스 및 택시 프리팹의 경우 00:26:51.257 --> 00:26:53.257 차량의 본체와 바퀴를 00:26:53.257 --> 00:26:55.257 Sprite Importer를 통해 분리하고 00:26:55.257 --> 00:26:58.392 간단히 흔들리는 애니메이션을 적용합니다. 00:26:58.392 --> 00:27:00.793 여기에 2d rigidbody도 적용하여 00:27:00.793 --> 00:27:02.793 속도를 사용해 화면을 지나가도록 만들 수 00:27:02.793 --> 00:27:04.376 있습니다. 00:27:07.279 --> 00:27:10.271 3가지 소품인 버스, 택시, 백조가 00:27:10.271 --> 00:27:12.271 화면에 나타나게 만드는 00:27:12.271 --> 00:27:14.271 재사용 가능한 하나의 스크립트를 생성했습니다. 00:27:14.271 --> 00:27:16.616 BackgroundPropsSpawner 스크립트 또한 00:27:16.616 --> 00:27:19.838 화면에 나타나는 출현 빈도, 지정 속도 및 00:27:19.838 --> 00:27:21.838 생성 위치를 처리합니다. 597 00:27:21,838 --> 00:27:24,521 이는 우리가 동일한 스크립트로 3개의 Creator 오브젝트를 00:27:24.521 --> 00:27:26.521 변경할 수 있다는 뜻입니다. 00:27:26.521 --> 00:27:28.521 어떤 프리팹을 생성할지, 어떤 속성을 줄 것인지 00:27:28.521 --> 00:27:30.521 변경할 수가 있는 것입니다. 00:27:30.521 --> 00:27:33.854 자세한 내용은 스크립트의 코멘트를 확인하십시오. 00:27:33.854 --> 00:27:36.172 마지막으로 배경에 역동성을 가미하기 위해 00:27:36.172 --> 00:27:40.409 흐르는 구름, 강과 안개를 추가했습니다. 00:27:41.323 --> 00:27:44.525 이들은 2개의 배경 스프라이트 인스턴스를 상위 오브젝트에 추가하여 00:27:44.525 --> 00:27:48.004 만들었는데 화면을 가로지르며 서서히 진행하는 애니메이션을 00:27:48.004 --> 00:27:50.004 사용했습니다. 00:27:50.004 --> 00:27:52.652 이 애니메이션은 루프 기능으로 00:27:52.652 --> 00:27:54.652 무한 반복됩니다. 00:27:59.185 --> 00:28:01.031 지금까지 유니티 게임 제작 방법을 소개해 드렸습니다. 00:28:01.031 --> 00:28:03.031 이 개요를 통해 유니티를 사용해 2D 게임을 제작하는 데 00:28:03.031 --> 00:28:05.516 도움이 되었길 바라고, 00:28:05.516 --> 00:28:07.516 앞으로 간단한 프로젝트 및 튜토리얼을 더 선보일 00:28:07.516 --> 00:28:08.971 것을 약속드립니다. 00:28:08.971 --> 00:28:11.689 Unity 4.3에 대한 여러분의 의견을 기다립니다. 00:28:11.689 --> 00:28:13.689 그리고 곧 여러분이 만든 훌륭한 2D 게임을 00:28:13.689 --> 00:28:14.959 만나볼 수 있길 기대합니다. 00:28:14.959 --> 00:28:16.487 감사합니다.