[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:05.94,Default,,0000,0000,0000,,안녕하세요, 제 이름은 Mark입니다. \N저는 수년동안 Unity같은 소프트웨어를 이용하여 Dialogue: 0,0:00:05.94,0:00:13.32,Default,,0000,0000,0000,,게임을 만들고 싶었습니다. Unity는 "컵헤드" ,"네온 화이트", \N"튜닉"; Dialogue: 0,0:00:13.32,0:00:18.60,Default,,0000,0000,0000,,"아우터 와일즈", "하스스톤", "파이어워치",\N심지어 포켓몬 다이다몬드 리메이크에도 사용되었습니다. Dialogue: 0,0:00:18.60,0:00:26.28,Default,,0000,0000,0000,,그런데 저는 항상 긴 튜토리얼 영상을 볼 때마다 잠이 오더군요 Dialogue: 0,0:00:26.28,0:00:31.14,Default,,0000,0000,0000,,전 다른 사람이 하는걸 보면서 따라하는 것보다\N직접 시도해보는게 적성에 더 맞더라고요 Dialogue: 0,0:00:31.14,0:00:37.50,Default,,0000,0000,0000,,그래서 작년에 3단계로 구성된 해결법을 만들었는데,\N꽤 효과가 좋았습니다 Dialogue: 0,0:00:37.50,0:00:44.82,Default,,0000,0000,0000,,1. Unity의 기본'만' 배우기,\N2. 간단한 시험으로 기본 익히기, Dialogue: 0,0:00:44.82,0:00:51.18,Default,,0000,0000,0000,,3. 나머지는 게임을 만들면서 알아서 배우기.\N제가 해봤더니 정말로 되더군요! Dialogue: 0,0:00:51.18,0:00:57.00,Default,,0000,0000,0000,,다른 모바일 게임을 배끼는 것부터 시작해서,\N자석을 이용한 저만의 퍼즐 플랫포머 게임을; Dialogue: 0,0:00:57.00,0:01:03.48,Default,,0000,0000,0000,,만들기까지 1년정도 걸렸습니다 Dialogue: 0,0:01:03.48,0:01:08.58,Default,,0000,0000,0000,,그런데 Unity같이 복잡한 소프트웨어의 기본을\N어떻게 배워야 하는지 Dialogue: 0,0:01:08.58,0:01:11.58,Default,,0000,0000,0000,,의문점이 들겁니다 Dialogue: 0,0:01:11.58,0:01:15.36,Default,,0000,0000,0000,,저는 대부분의 게임의 들어가는 \N공통적인 요소를 리스트로 만들었습니다 Dialogue: 0,0:01:15.36,0:01:19.98,Default,,0000,0000,0000,,캐릭터를 화면에 띄우는 방법; Dialogue: 0,0:01:19.98,0:01:24.06,Default,,0000,0000,0000,,캐릭터를 움직이게 하는 방법,\N뭔갈 생성하거나 없애는 방법; Dialogue: 0,0:01:24.06,0:01:28.68,Default,,0000,0000,0000,,캐릭터의 판정, 게임 오버, 애니매이션, 사운드 등등; Dialogue: 0,0:01:28.68,0:01:33.54,Default,,0000,0000,0000,,전 이 방법들을 \N긴 튜토리얼 영상, Unity 문서; Dialogue: 0,0:01:33.54,0:01:36.78,Default,,0000,0000,0000,,검색, 그리고 수많은 시행착오를 겪으면서 배웠습니다 Dialogue: 0,0:01:36.78,0:01:41.82,Default,,0000,0000,0000,,이 영상의 목적은 여러분이 그걸 겪지 않게 만드는 것입니다 Dialogue: 0,0:01:41.82,0:01:46.38,Default,,0000,0000,0000,,이 영상은 제가 Unity를 배울 적에 봤다면\N좋았을 영상입니다 Dialogue: 0,0:01:46.38,0:01:52.08,Default,,0000,0000,0000,,앞으로 40분동안 우리는 Unity를 이용해 \N플래피 버드를 만들겁니다 Dialogue: 0,0:01:52.08,0:01:57.06,Default,,0000,0000,0000,,플래피 버드를 만들고 싶어서가 아니라,\N플래피 버드를 만들려면 Dialogue: 0,0:01:57.06,0:02:02.22,Default,,0000,0000,0000,,제가 아까 말한 요소인 뭔갈 생성하는 것부터\N게임 오버까지 전부 필요하기 때문입니다 Dialogue: 0,0:02:02.22,0:02:08.46,Default,,0000,0000,0000,,이 튜토리얼에서는 Unity 설치부터 UI 이해; Dialogue: 0,0:02:08.46,0:02:13.68,Default,,0000,0000,0000,,프로그래밍, 그리고 당신의 지인들과 공유할 수 있도록\N게임을 빌드하는 것까지 배우게 됩니다 Dialogue: 0,0:02:13.68,0:02:19.08,Default,,0000,0000,0000,,그리고 튜토리얼이 끝난 후, 간단한 시험을 통해\N기본을 익히게 되고, Dialogue: 0,0:02:19.08,0:02:25.92,Default,,0000,0000,0000,,그 후로는 스스로 배우는게 가능해질겁니다\N괜찮은 것 같나요? 그렇다면 이제 시작하죠. Dialogue: 0,0:02:26.88,0:02:34.20,Default,,0000,0000,0000,,Unity를 다운받는 것부터 시작합시다.\N다운로드 후 Unity Hub를 설치하세요 Dialogue: 0,0:02:34.80,0:02:39.66,Default,,0000,0000,0000,,Unity를 사용하려면 계정이 필요합니다.\N계정을 만든 후, Dialogue: 0,0:02:39.66,0:02:45.84,Default,,0000,0000,0000,,Unity 에디터 설치 창이 나올겁니다.\N설치하세요 Dialogue: 0,0:02:45.84,0:02:49.02,Default,,0000,0000,0000,,*(이 영상에선 2021.3을 사용했지만, \N2022를 사용해도 상관없습니다) Dialogue: 0,0:02:49.02,0:02:52.38,Default,,0000,0000,0000,,*(설치 시 약 15분정도 걸립니다\N너무 오래 걸리면, Unity Hub를 관리자 권한으로 실행해보세요) Dialogue: 0,0:02:52.38,0:02:59.30,Default,,0000,0000,0000,,아직 끝난게 아닙니다. 옆에 톱니바퀴 아이콘을 누르고 모듈을 누르면 Dialogue: 0,0:03:00.30,0:03:04.98,Default,,0000,0000,0000,,Visual Studio가 체크되어있는게 보일겁니다\N저희는 이 프로그램으로 Dialogue: 0,0:03:04.98,0:03:10.62,Default,,0000,0000,0000,,코드를 작성할 겁니다\NVisual Studio를 설치한 후, 이 화면에서 Dialogue: 0,0:03:10.62,0:03:15.42,Default,,0000,0000,0000,,아래로 스크롤하고\N"Unity를 활용한 게임 개발"은 체크하고, Unity Hub는 해제합니다 Dialogue: 0,0:03:15.42,0:03:20.34,Default,,0000,0000,0000,,왜냐면 Hub는 이미 설치 되있으니까요.\NVisual Studio는 계정이 필요없으니 이건 스킵하고, Dialogue: 0,0:03:20.34,0:03:23.58,Default,,0000,0000,0000,,어차피 나중에 열거니 이 창은 닫아도 됩니다 Dialogue: 0,0:03:23.58,0:03:31.14,Default,,0000,0000,0000,,이제 Unity Hub에서 '새 프로젝트'를 누르고,\N'모든 템플릿'을 선택하고 '2D 코어'를 선택합니다 Dialogue: 0,0:03:31.14,0:03:35.94,Default,,0000,0000,0000,,'2D 코어'는 2D 게임을 만드는데 적합한\N빈 프로젝트입니다 Dialogue: 0,0:03:35.94,0:03:41.22,Default,,0000,0000,0000,,이름을 정하고, '프로젝트 생성' 버튼을 누르세요 Dialogue: 0,0:03:43.26,0:03:48.72,Default,,0000,0000,0000,,첫번째로, 우리는 Unity의 UI를 배울겁니다 Dialogue: 0,0:03:48.72,0:03:52.50,Default,,0000,0000,0000,,다른 패널들을 탐방하면서, 화면에 새를 띄울겁니다 Dialogue: 0,0:03:52.50,0:03:58.80,Default,,0000,0000,0000,,이게 Unity의 기본 레이아웃입니다\N4개의 패널로 나뉘어져 있죠 Dialogue: 0,0:03:59.88,0:04:05.34,Default,,0000,0000,0000,,아래에는 프로젝트 패널이 있습니다\N여기에는 게임에 들어가는 모든 요소가 포함됩니다 Dialogue: 0,0:04:05.34,0:04:12.66,Default,,0000,0000,0000,,예를 들면 스프라이트, 사운드, 스크립트, 타일, 폰트 등이 있습니다\N이중 일부는 Unity에서 직접 만들거지만 Dialogue: 0,0:04:12.66,0:04:17.94,Default,,0000,0000,0000,,다른 곳에서 파일을 드래그해도 됩니다 Dialogue: 0,0:04:17.94,0:04:22.80,Default,,0000,0000,0000,,저는 포토샵에서 새와 파이프의 스프라이트를 만든 후 Dialogue: 0,0:04:22.80,0:04:27.54,Default,,0000,0000,0000,,이걸 프로젝트에 드래그했습니다 \N전 여러분이 스프라이트를 직접 만들면 좋겠지만 Dialogue: 0,0:04:27.54,0:04:32.40,Default,,0000,0000,0000,,만약 그림을 잘 못그리겠다면 \N설명에 에셋 다운로드 링크를 확인하세요 Dialogue: 0,0:04:32.40,0:04:38.94,Default,,0000,0000,0000,,왼쪽에는 계층 구조 패널이 있습니다\N여기에는 현재 '장면'에 있는 것들이 포함되며 Dialogue: 0,0:04:38.94,0:04:42.96,Default,,0000,0000,0000,,'장면'은 대부분의 게임에서 레벨의 역할을 합니다.\N우선 새를 만드는 것부터 시작합시다 Dialogue: 0,0:04:42.96,0:04:50.28,Default,,0000,0000,0000,,계층 구조에서 빈 오브젝트 생성을 누르면\N빈 GameObject가 생성됩니다 Dialogue: 0,0:04:50.28,0:04:56.70,Default,,0000,0000,0000,,GameObject는 투명한 컨테이너와 같습니다\N위치를 지정하거나 회전할 수 있고; Dialogue: 0,0:04:56.70,0:05:03.30,Default,,0000,0000,0000,,크기를 조절할수도 있습니다. 그리고 \N컨테이너 안에 컴포넌트를 넣어 기능을 추가할 수 있죠 Dialogue: 0,0:05:03.30,0:05:08.22,Default,,0000,0000,0000,,예를 들어, '스프라이트 렌더러' 컴포넌트를 넣으면\NGameObject에 이미지를 넣을 수 있죠 Dialogue: 0,0:05:08.22,0:05:13.26,Default,,0000,0000,0000,,이 게임의 모든 것들은 '컴포넌트가 있는 GameObject'로\N구성되어 있습니다 Dialogue: 0,0:05:13.26,0:05:16.44,Default,,0000,0000,0000,,새, 파이프, 심지어 UI와 카메라까지 Dialogue: 0,0:05:16.44,0:05:22.68,Default,,0000,0000,0000,,이 모든 것들은 오른쪽의 인스펙터에서 관리할 수 있습니다 Dialogue: 0,0:05:22.68,0:05:28.44,Default,,0000,0000,0000,,빈 GameObject를 선택한 후, 위에서 이름을 정할 수 있습니다 Dialogue: 0,0:05:28.44,0:05:34.86,Default,,0000,0000,0000,,이름은 그냥 Bird라고 하죠\N그리고 Transform에서 위치, 기울기, 크기를 조절할 수 있습니다 Dialogue: 0,0:05:34.86,0:05:41.52,Default,,0000,0000,0000,,이제 '컴포넌트 추가'를 누르고, Rendering을 누르고\NSprite Renderer를 선택하세요 Dialogue: 0,0:05:41.52,0:05:45.54,Default,,0000,0000,0000,,이걸 작동하게 하려면, 스프라이트를 선택해야 하는데,\N그냥 프로젝트 패널에서 새 이미지를 Dialogue: 0,0:05:45.54,0:05:49.62,Default,,0000,0000,0000,,빈칸에 드래그하면, 그래픽이 생겼네요! Dialogue: 0,0:05:49.62,0:05:53.28,Default,,0000,0000,0000,,그래픽은 중앙에 있는 씬 패널에 나타납니다 Dialogue: 0,0:05:53.28,0:05:57.24,Default,,0000,0000,0000,,씬에서는 현재 씬에 무엇이 있는지 볼 수 있고, Dialogue: 0,0:05:57.24,0:06:01.56,Default,,0000,0000,0000,,이 기능들을 이용하여 움직이거나 회전시킬 수 있습니다 Dialogue: 0,0:06:01.56,0:06:06.90,Default,,0000,0000,0000,,이 섹션에는 '게임'이라는 탭이 있는데,\N여기선 게임을 실행할때 메인 카메라에서 Dialogue: 0,0:06:06.90,0:06:13.44,Default,,0000,0000,0000,,어떻게 보이는지 확인할 수 있습니다\N그리고 여기에선 해상도나 화면비를 설정할 수 있습니다 Dialogue: 0,0:06:13.44,0:06:19.08,Default,,0000,0000,0000,,다른 화면에서 어떻게 보이는지 알 수 있죠\N- 저는 1920x1080을 선택하겠습니다 Dialogue: 0,0:06:19.08,0:06:23.94,Default,,0000,0000,0000,,새가 너무 많은 공간을 차지하네요\N새의 크기를 줄일 수도 있지만, 저희는 Dialogue: 0,0:06:23.94,0:06:29.70,Default,,0000,0000,0000,,카메라를 축소할 겁니다. 카메라 또한 \N계층 구조에 있는 GameObject이기에 이를 선택하면 Dialogue: 0,0:06:29.70,0:06:35.88,Default,,0000,0000,0000,,Camera 컴포넌트에서 수치를 조절할 수 있습니다\N'크기'를 높이면 카메라가 축소됩니다 Dialogue: 0,0:06:36.42,0:06:39.42,Default,,0000,0000,0000,,그리고 배경 색도 바꾸겠습니다.\N좋네요 Dialogue: 0,0:06:39.42,0:06:44.34,Default,,0000,0000,0000,,이제 위에 있는 Play 버튼을 누르면 \N세상에서 가장 Dialogue: 0,0:06:44.34,0:06:47.76,Default,,0000,0000,0000,,지루한 게임이 시작됩니다 \N네. 이제 덜 지루하게 만들어 보죠 Dialogue: 0,0:06:49.32,0:06:55.44,Default,,0000,0000,0000,,잠깐 되돌아봅시다\NUnity에는 4개의 패널이 있고 그중 프로젝트에는 모든 요소가 들어가고, Dialogue: 0,0:06:55.44,0:07:00.90,Default,,0000,0000,0000,,계층 구조에는 현재 레벨에 있는 GameObject가 표시되고,\N인스펙터에는 Dialogue: 0,0:07:00.90,0:07:04.74,Default,,0000,0000,0000,,GameObject를 마음대로 조절할 수 있고, \N씬에서는 레벨을 볼 수 있다. Dialogue: 0,0:07:04.74,0:07:10.80,Default,,0000,0000,0000,,그리고 GameObject는 Sprite Renderer같은 \N컴포넌트를 담을 수 있는 투명한 컨테이너다. Dialogue: 0,0:07:11.58,0:07:15.90,Default,,0000,0000,0000,,두번째로, 저희는 더 많은 컴포넌트를 이용하여 Dialogue: 0,0:07:15.90,0:07:19.32,Default,,0000,0000,0000,,새를 중력에 영향을 받는 물리 오브젝트로 만들고 Dialogue: 0,0:07:19.32,0:07:23.40,Default,,0000,0000,0000,,코드를 이용하여 스페이스 바를 누를 떄마다 \N새를 위로 날게 만들겁니다 Dialogue: 0,0:07:23.40,0:07:29.76,Default,,0000,0000,0000,,이제 새에다가 Rigidbody2D 컴포넌트를 추가합시다. Dialogue: 0,0:07:29.76,0:07:36.60,Default,,0000,0000,0000,,이 컴포넌트는 새를 물리 오브젝트로 만들어 줍니다.\N그래서 Play 버튼을 누르면 새가 화면 밖으로 떨어집니다. Dialogue: 0,0:07:36.60,0:07:42.28,Default,,0000,0000,0000,,이 새가 다른 오브젝트와 상호작용하게 만들려면\NCollider가 필요합니다 Dialogue: 0,0:07:42.28,0:07:43.92,Default,,0000,0000,0000,,Circle Collider 2D를 추가합시다 Dialogue: 0,0:07:43.92,0:07:49.92,Default,,0000,0000,0000,,씬을 보면 초록색으로 된 선이 보입니다\N중심이 약간 안맞기 때문에; Dialogue: 0,0:07:49.92,0:07:55.26,Default,,0000,0000,0000,,오프셋을 조절해서 움직이겠습니다\N여기서 게임 디자인 팁을 주자면 Dialogue: 0,0:07:55.26,0:08:00.72,Default,,0000,0000,0000,,Collider(판정)를 이미지보다 조금 작게 만들면\N플레이어가 파이프에 아주 살짝 닿았더라도 Dialogue: 0,0:08:00.72,0:08:05.22,Default,,0000,0000,0000,,게임 오버가 되지 않기에\N빡센 느낌이 줄어들게 됩니다 Dialogue: 0,0:08:05.22,0:08:10.92,Default,,0000,0000,0000,,마지막으로, 스크립트를 추가하겠습니다\N스크립트를 활용하면 사실상 나만의 컴포넌트를 Dialogue: 0,0:08:10.92,0:08:16.68,Default,,0000,0000,0000,,만들 수 있게 되지만, 우리가 코드를 이용해서 직접 만들어야 합니다\N컴포넌트 추가에서 New Script를 선택하고, Dialogue: 0,0:08:16.68,0:08:21.78,Default,,0000,0000,0000,,이름은 BirdScript라고 하겠습니다.\N만든 후, 스크립트를 더블클릭하면 Dialogue: 0,0:08:21.78,0:08:27.00,Default,,0000,0000,0000,,전에 설치한 Visual Studio가 열릴겁니다 Dialogue: 0,0:08:27.00,0:08:31.02,Default,,0000,0000,0000,,프로그래밍의 세계에 온걸 환영합니다!\N너무 무섭게 생각하지 마세요; Dialogue: 0,0:08:31.02,0:08:35.46,Default,,0000,0000,0000,,천천히 설명해드릴 겁니다.\N저희는 C#으로 코드를 작성할겁니다 Dialogue: 0,0:08:35.46,0:08:41.34,Default,,0000,0000,0000,,먼저 Start와 Update, 이 2개에 대해\N알아보겠습니다 Dialogue: 0,0:08:41.34,0:08:46.62,Default,,0000,0000,0000,,Start는 (이 스크립트가 활성화 돼있으면) 처음으로 실행되는 코드이고, Dialogue: 0,0:08:46.62,0:08:52.62,Default,,0000,0000,0000,,단 한번만 실행됩니다.\NUpdate는 (이 스크립트가 활성화 돼있으면) 항상 실행되는 코드이고, Dialogue: 0,0:08:52.62,0:08:57.36,Default,,0000,0000,0000,,매 프레임마다 코드가 실행됩니다. Dialogue: 0,0:08:58.08,0:09:02.82,Default,,0000,0000,0000,,아무튼, 저희가 코드로 작성할 건\N- Unity로 다시 돌아가보면 Dialogue: 0,0:09:02.82,0:09:08.34,Default,,0000,0000,0000,,컴포넌트에 있는 숫자들이나 텍스트를 마음대로 조절할 수 있죠 Dialogue: 0,0:09:08.34,0:09:13.32,Default,,0000,0000,0000,,저희는 코드를 이용하여\N게임이 실행되는 동안 이것들을 조절할 겁니다 Dialogue: 0,0:09:13.32,0:09:17.88,Default,,0000,0000,0000,,간단한 예시를 들자면 Dialogue: 0,0:09:17.88,0:09:24.92,Default,,0000,0000,0000,,Start에 gameObject(오른쪽 위에 있는걸 의미함)를 치고, \N점[.]을 치면 리스트가 보일겁니다 Dialogue: 0,0:09:24.92,0:09:25.92,Default,,0000,0000,0000,,*(리스트가 안보이면, Unity 위에 '창'->'패키지 관리자'->아래로 내려서 'Visual Studio Editor' 선택 후 설치\N그후 Unity 위에 '편집'->'환경 설정'->'외부 툴'->Visual Studio 선택 후 전부 체크하고 재실행) Dialogue: 0,0:09:25.92,0:09:30.72,Default,,0000,0000,0000,,이중 대부분은 인스펙터에 있는걸 나타냅니다\N예를 들면 정적(isStatic); Dialogue: 0,0:09:30.72,0:09:38.94,Default,,0000,0000,0000,,태그, 레이어, 이름이 있죠\Nname을 선택하고, [=] 쓰고, 큰따옴표[" "]로 Dialogue: 0,0:09:38.94,0:09:44.64,Default,,0000,0000,0000,,새의 이름을 넣으면 됩니다.\N마지막으로, 명령 끝엔 항상 세미콜론[;]이 있어야 합니다 Dialogue: 0,0:09:45.43,0:09:49.57,Default,,0000,0000,0000,,그리고 스크립트를 저장하는것도 잊지 마세요 Dialogue: 0,0:09:49.57,0:09:54.36,Default,,0000,0000,0000,,이제 게임을 실행하면... GameObject의 이름이\N바뀌였네요. 좋습니다 Dialogue: 0,0:09:55.08,0:09:58.56,Default,,0000,0000,0000,,네, 이제 그 코드는 지우세요. \N방금 쓴 코드는 우리가 코드로 Dialogue: 0,0:09:58.56,0:10:03.12,Default,,0000,0000,0000,,게임과 대화할 수 있다는 걸 알려줍니다\N저희는 코드를 작성하여 누구와 대화할지 Dialogue: 0,0:10:03.12,0:10:08.28,Default,,0000,0000,0000,,대상을 정할 수 있고, 대화의 주제도 정하고, Dialogue: 0,0:10:08.28,0:10:14.16,Default,,0000,0000,0000,,그 후 명령을 정할 수 있습니다\N저희는 이 짓을 많이 하게 될겁니다. Dialogue: 0,0:10:14.88,0:10:19.74,Default,,0000,0000,0000,,아무튼 저희가 진짜로 해야할 일은,\NRigidbody2D 컴포넌트에서 Info 아래에 보면 Dialogue: 0,0:10:19.74,0:10:23.40,Default,,0000,0000,0000,,Velocity가 회색으로 표시된게 보일겁니다 Dialogue: 0,0:10:23.40,0:10:27.12,Default,,0000,0000,0000,,저희는 위쪽으로 Velocity를 주는 코드를 작성해서\N새가 하늘로 날 수 있게 만들겁니다 Dialogue: 0,0:10:27.12,0:10:32.64,Default,,0000,0000,0000,,문제는, 이 스크립트는 GameObject의 \N윗부분과 Transform끼리만 대화할 수 있고 Dialogue: 0,0:10:32.64,0:10:37.20,Default,,0000,0000,0000,,다른 컴포넌트의 존재도 모릅니다 Dialogue: 0,0:10:37.20,0:10:42.48,Default,,0000,0000,0000,,그래서 이 스크립트에 RigidBody2D를 위한 공간을 만들어야 합니다 Dialogue: 0,0:10:42.48,0:10:48.36,Default,,0000,0000,0000,,그러면 대화를 할 수 있게 되고 명령을 보낼 수 있게 되며\N이를 '레퍼런스'라 부릅니다 Dialogue: 0,0:10:48.36,0:10:52.38,Default,,0000,0000,0000,,Class와 Start 사이에 레퍼런스를 작성할 겁니다: Dialogue: 0,0:10:52.38,0:10:57.84,Default,,0000,0000,0000,,public RigidBody2D myRigidBody; Dialogue: 0,0:11:00.54,0:11:06.48,Default,,0000,0000,0000,,이제 RigidBody2D를 보관할 공간이 생겼고,\N다른 Rigidbody2D와 구분하기 위해 Dialogue: 0,0:11:06.48,0:11:12.06,Default,,0000,0000,0000,,공간의 이름도 정했습니다\Npublic으로 정했기 때문에 스크립트 밖에서도 Dialogue: 0,0:11:12.06,0:11:18.24,Default,,0000,0000,0000,,공간을 건드릴 수 있습니다\N저장하고 Unity로 돌아가면, 스크립트 컴포넌트에 Dialogue: 0,0:11:18.24,0:11:24.78,Default,,0000,0000,0000,,RigidBody2D를 위한 공간이 생긴걸 볼 수 있습니다\N이제 RigidBody2D 컴포넌트를 빈칸에 드래그하면, Dialogue: 0,0:11:24.78,0:11:28.74,Default,,0000,0000,0000,,이제 스크립트와 RigidBody간의 통신선이 생겼습니다. Dialogue: 0,0:11:29.34,0:11:36.30,Default,,0000,0000,0000,,다시 Visual Studio로 돌아와서, Update에\NmyRigidBody 그리고 점[.]을 치면 Dialogue: 0,0:11:36.30,0:11:40.44,Default,,0000,0000,0000,,이 많은 대화 주제들을 보세요\NangularDrag, gravityScale, mass; Dialogue: 0,0:11:40.44,0:11:45.54,Default,,0000,0000,0000,,이것들이 전부 RigidBody2D에 있는 속성들입니다\N우리가 원하는건 velocity죠 Dialogue: 0,0:11:45.54,0:11:51.06,Default,,0000,0000,0000,,전에 했던 것처럼 [=]을 쓰고, Dialogue: 0,0:11:51.06,0:11:57.18,Default,,0000,0000,0000,,여기에서는 Vector라는 2D 공간에서 위치를 나타내는\N값을 이용할 겁니다 Dialogue: 0,0:11:57.18,0:12:02.40,Default,,0000,0000,0000,,여기서 Vector는 새가 나는 방향을 나타내는데 사용할겁니다 Dialogue: 0,0:12:02.40,0:12:08.94,Default,,0000,0000,0000,,저희는 새가 위로 나는걸 원하기 때문에, \N(0,1)이 좋겠네요. 저는 Vector2.up을 이용할 겁니다 Dialogue: 0,0:12:08.94,0:12:14.40,Default,,0000,0000,0000,,*Vector2.up은 Vector2(0,1)과 같은 의미입니다\N그리고 힘을 주려면 Dialogue: 0,0:12:14.40,0:12:19.92,Default,,0000,0000,0000,,Vector에 힘을 곱하면 됩니다\N힘은 대충 10 정도면 충분할 겁니다 Dialogue: 0,0:12:19.92,0:12:24.72,Default,,0000,0000,0000,,그리고, 전에 말했지만, Update 안에 있는 코드는 \N매 프레임마다 실행되기 때문에 Dialogue: 0,0:12:24.72,0:12:31.56,Default,,0000,0000,0000,,저장하고 플레이 해보면... 영원히 날아갑니다 Dialogue: 0,0:12:31.56,0:12:36.36,Default,,0000,0000,0000,,하지만 저희가 원하는건 스페이스 바를 누를 때만 \N새가 날아가게 하는 것이죠 Dialogue: 0,0:12:36.36,0:12:41.04,Default,,0000,0000,0000,,이제 프로그래밍에서 가장 중요한 요소를 사용할 때입니다:\N바로 if 입니다. Dialogue: 0,0:12:41.04,0:12:43.38,Default,,0000,0000,0000,,if는 마치 관문과도 같습니다 Dialogue: 0,0:12:43.38,0:12:47.64,Default,,0000,0000,0000,,게임이 특정 조건을 만족하지 못한다면, \N매 프레임마다 그 코드는 완전히 무시됩니다 Dialogue: 0,0:12:47.64,0:12:52.02,Default,,0000,0000,0000,,반대로, 관문에 적혀 있는 특정 조건을 만족한다면, Dialogue: 0,0:12:52.02,0:12:56.70,Default,,0000,0000,0000,,통과할 수 있게 되고 코드가 실행됩니다. Dialogue: 0,0:12:56.70,0:13:00.96,Default,,0000,0000,0000,,저희가 원하는건 "만약 플레이어가 스페이스 바를 누르면,\N위쪽으로 velocity를 더한다"죠 Dialogue: 0,0:13:00.96,0:13:06.30,Default,,0000,0000,0000,,if를 적고 괄호 안에 조건을 적으면 됩니다 Dialogue: 0,0:13:06.30,0:13:12.36,Default,,0000,0000,0000,,여기서는 컴포넌트와 대화하는게 아니라 Unity와 대화하게 됩니다\N정확히는 Unity의 인풋 시스템이죠 Dialogue: 0,0:13:12.36,0:13:20.16,Default,,0000,0000,0000,,(Input.GetKeyDown, 그리고 괄호 안에 KeyCode.Space)\N이렇게 하면 Unity에게 Dialogue: 0,0:13:20.16,0:13:25.20,Default,,0000,0000,0000,,이 프레임에 스페이스를 눌렀는지 물어볼 수 있습니다\N그리고 마지막에 ==true 로 마무리합시다 Dialogue: 0,0:13:25.20,0:13:31.02,Default,,0000,0000,0000,,참고로 등호를 1개[=] 만 사용하면\N왼쪽에 있는 걸 Dialogue: 0,0:13:31.02,0:13:35.28,Default,,0000,0000,0000,,오른쪽과 같게 만들라는 의미이고, \N2개[==]를 사용하면 왼쪽에 있는게 오른쪽에 있는것과 같은지 Dialogue: 0,0:13:35.28,0:13:38.52,Default,,0000,0000,0000,,여부를 확인하라는 의미입니다.\N괜찮죠? Dialogue: 0,0:13:38.52,0:13:43.74,Default,,0000,0000,0000,,아무튼, "만약 스페이스가 눌리면..." Dialogue: 0,0:13:43.74,0:13:48.96,Default,,0000,0000,0000,,그 후는 중괄호{}를 사용해야 합니다.\N중괄호 안에 위로 velocity를 주는 코드를 쓰면 됩니다 Dialogue: 0,0:13:50.10,0:13:54.24,Default,,0000,0000,0000,,이제 Update에서 - 매 프레임마다 게임이 관문에 가서 Dialogue: 0,0:13:54.24,0:13:59.34,Default,,0000,0000,0000,,"스페이스가 눌렸니?"라는 질문을 받은 후, 만약 맞다면\N코드가 실행되고 새는 날게 되겠죠, 아니라면 Dialogue: 0,0:13:59.34,0:14:02.76,Default,,0000,0000,0000,,중괄호 안에 있는 코드는 무시하고,\N다음 프레임에 다시 시도하게 될겁니다 Dialogue: 0,0:14:02.76,0:14:08.16,Default,,0000,0000,0000,,이제 저장하고 Unity로 돌아와서 플레이해보면, 짜잔: Dialogue: 0,0:14:08.16,0:14:11.46,Default,,0000,0000,0000,,이제 스페이스를 누를 때마다 새가 위로 올라가네요 Dialogue: 0,0:14:11.46,0:14:17.34,Default,,0000,0000,0000,,이제 저희는 Input에 반응하는 캐릭터를 만들었습니다. \N이것은 게임입니다. 좋아요! Dialogue: 0,0:14:17.34,0:14:23.10,Default,,0000,0000,0000,,그런데, 조작감이 좀 쓰레기같네요\N원작 플래피 버드와는 전혀 다른 느낌입니다 Dialogue: 0,0:14:23.10,0:14:31.86,Default,,0000,0000,0000,,그러니 숫자를 좀 바꿔볼까요\N저장, 플레이, 그래도 별로네, 정지, 숫자 번경; Dialogue: 0,0:14:31.86,0:14:36.54,Default,,0000,0000,0000,,저장,... 그런데 이건 너무 느리고 바보같네요\N덜 바보같은 짓을 해봅시다 Dialogue: 0,0:14:36.54,0:14:41.52,Default,,0000,0000,0000,,먼저, 함수를 만들겁니다. 스크립트의 윗부분의 \NRigidBody 레퍼런스 바로 밑에 Dialogue: 0,0:14:41.52,0:14:47.16,Default,,0000,0000,0000,,public float flapStrength를 만듭시다 Dialogue: 0,0:14:47.16,0:14:51.96,Default,,0000,0000,0000,,float란 부동소수점(floating point number)를 뜻합니다.\N간단히 말하면 소수점이 있는 숫자라는 의미입니다 Dialogue: 0,0:14:51.96,0:14:57.72,Default,,0000,0000,0000,,다시 Update로 돌아와서, Vector2.up에 10이 아니라\NflapStrength를 곱할겁니다 Dialogue: 0,0:14:57.72,0:15:02.04,Default,,0000,0000,0000,,이제 스크립트 컴포넌트를 보면 새로운 공간이 보일겁니다: Dialogue: 0,0:15:02.04,0:15:06.90,Default,,0000,0000,0000,,Flap Strength. 그리고 이건 언제든지 번경할 수 있습니다; Dialogue: 0,0:15:06.90,0:15:11.34,Default,,0000,0000,0000,,심지어 플레이 중에도 번경할 수 있습니다\N참고로 플레이 중 번경한 값은 Dialogue: 0,0:15:11.34,0:15:15.36,Default,,0000,0000,0000,,저장되지 않기 때문에, \N게임의 중요한 요소를 다룰 때에도 Dialogue: 0,0:15:15.36,0:15:18.66,Default,,0000,0000,0000,,아무 숫자나 막 집어넣어도 상관없습니다 Dialogue: 0,0:15:18.66,0:15:22.68,Default,,0000,0000,0000,,그래서, flapStrength와 RigidBody의 중력 스케일이나 Dialogue: 0,0:15:22.68,0:15:26.70,Default,,0000,0000,0000,,질량을 적당히 조절하다 보면 언젠가는 \N좋은 값을 찾을 수 있을 겁니다 Dialogue: 0,0:15:26.70,0:15:29.64,Default,,0000,0000,0000,,숫자 계속 바꾸기,\N이게 게임 디자인이죠 Dialogue: 0,0:15:30.30,0:15:31.44,Default,,0000,0000,0000,,잠깐 되돌아봅시다 Dialogue: 0,0:15:31.44,0:15:36.00,Default,,0000,0000,0000,,코드를 활용하여 플레이 중에도 컴포넌트의 속성을 바꿀 수 있다. Dialogue: 0,0:15:36.00,0:15:40.86,Default,,0000,0000,0000,,스크립트는 기본적으로 gameObject에 있는 다른 컴포넌트들과 \N대화할 수 없고, 할려면 Dialogue: 0,0:15:40.86,0:15:45.00,Default,,0000,0000,0000,,원하는 컴포넌트의 레퍼런스(공간)를 만들어야 한다. Dialogue: 0,0:15:45.00,0:15:49.86,Default,,0000,0000,0000,,레퍼런스(공간)는 코딩으로 만들고, 빈 공간은 Unity에서\N드래그 앤 드롭으로 채운다 Dialogue: 0,0:15:50.40,0:15:56.28,Default,,0000,0000,0000,,Start에 있는 코드는 (스크립트가 존재할 때) 한번만 실행되고\NUpdate에 있는 코드는 Dialogue: 0,0:15:56.28,0:16:01.92,Default,,0000,0000,0000,,매 프레임마다 계속 실행된다. 하지만 if를 사용하여\N조건 미충족시 코드를 스킵할 수도 있다 Dialogue: 0,0:16:01.92,0:16:04.74,Default,,0000,0000,0000,,그리고 public을 사용하면\N*(팁: [SerializeField]를 사용하면 private여도 Unity에서 값 바꿀수 있음) Dialogue: 0,0:16:04.74,0:16:07.86,Default,,0000,0000,0000,,Unity의 인스펙터에서 값을 바꿀 수 있다.\N*(팁: [SerializeField]를 사용하면 private여도 Unity에서 값 바꿀수 있음) Dialogue: 0,0:16:09.48,0:16:13.68,Default,,0000,0000,0000,,플래피 버드의 비밀을 하나 말씀드리자면 Dialogue: 0,0:16:13.68,0:16:18.18,Default,,0000,0000,0000,,새가 파이프를 지나는 것처럼 보이지만 Dialogue: 0,0:16:18.18,0:16:23.64,Default,,0000,0000,0000,,새는 가만히 있고 파이프가 움직이는 겁니다\N그래서 이번에는 Dialogue: 0,0:16:23.64,0:16:28.62,Default,,0000,0000,0000,,파이프 생성, 그리고 파이프를 움직이게 하고 \N없애는것까지 배울겁니다 Dialogue: 0,0:16:28.62,0:16:32.28,Default,,0000,0000,0000,,우선 생성할 오브젝트를 만듭시다 Dialogue: 0,0:16:32.28,0:16:35.10,Default,,0000,0000,0000,,오른쪽에서 왼쪽으로 가는 파이프 2개를요 Dialogue: 0,0:16:35.10,0:16:40.50,Default,,0000,0000,0000,,빈 오브젝트를 만들고, 이름은 pipe로 합시다\N일단은 파이프 크기를 맞추기 위해 Dialogue: 0,0:16:40.50,0:16:44.52,Default,,0000,0000,0000,,새 중앙에 놓겠습니다.\N그 다음 pipe 안에 빈 오브젝트를 만들고 Dialogue: 0,0:16:44.52,0:16:50.70,Default,,0000,0000,0000,,이름은 top pipe로 하겠습니다\N이런 걸 GameObject의 "자식"(child) 이라고 합니다 Dialogue: 0,0:16:50.70,0:16:55.08,Default,,0000,0000,0000,,자식을 이용하면 GameObejct 여러 개를 한 곳에 모와,\N"부모"를 움직이면 자식도 함께 움직이게 할 수 있습니다 Dialogue: 0,0:16:55.98,0:17:00.00,Default,,0000,0000,0000,,새를 만들 때 했었던 짓을 또 하겠습니다\N이미지를 넣기 위해 Sprite Renderer를 추가하고 Dialogue: 0,0:17:00.90,0:17:06.84,Default,,0000,0000,0000,,판정을 위해 Box Collider 2D를 넣겠습니다\NRigidbody는 필요 없습니다 Dialogue: 0,0:17:06.84,0:17:13.44,Default,,0000,0000,0000,,물리의 영향을 받을 필요가 없으니까요.\N파이프를 위로 올리겠습니다 - 단, X좌표는 0으로 하세요 Dialogue: 0,0:17:13.44,0:17:19.02,Default,,0000,0000,0000,,그 후, 이걸 복사하고\N이름을 bottom pipe로 바꾼 후, Dialogue: 0,0:17:19.02,0:17:24.42,Default,,0000,0000,0000,,180도 회전하고 아래로 내리겠습니다 Dialogue: 0,0:17:24.42,0:17:31.02,Default,,0000,0000,0000,,여기서 부모 GameObject를 움직여 보면,\N파이프 2개가 부모를 중심으로 Dialogue: 0,0:17:31.02,0:17:35.40,Default,,0000,0000,0000,,동시에 움직이는걸 볼 수 있습니다 Dialogue: 0,0:17:35.40,0:17:38.94,Default,,0000,0000,0000,,이제 움직이게 하기 위해\N부모에 스크립트를 추가하겠습니다 Dialogue: 0,0:17:40.68,0:17:46.08,Default,,0000,0000,0000,,우선 이동 속도를 위한 변수를 하나 만듭시다\N여기에 값을 부여하면, Dialogue: 0,0:17:46.08,0:17:50.70,Default,,0000,0000,0000,,Unity에서 그 값이 기본으로 설정됩니다\N물론 Unity에서 언제든지 바꿀 수 있긴 합니다 Dialogue: 0,0:17:50.70,0:17:56.10,Default,,0000,0000,0000,,이제 Update에 오브젝트를 움직이는 코드를 작성합시다\N여기서 Dialogue: 0,0:17:56.10,0:18:03.36,Default,,0000,0000,0000,,그냥 transform.position.x로 할 수 있다면 좋겠지만\N아쉽게도 안됩니다 Dialogue: 0,0:18:03.36,0:18:08.58,Default,,0000,0000,0000,,Vector 전체를 한번에 바꿔야 합니다\N그리고 이번엔 Vector2 대신 Vector3를 쓸 겁니다 Dialogue: 0,0:18:08.58,0:18:14.76,Default,,0000,0000,0000,,transform은 값 3개가 필요하기 때문이죠\N이 게임은 2D이긴 하지만 Dialogue: 0,0:18:14.76,0:18:19.98,Default,,0000,0000,0000,,Unity는 근본적으로 3D 엔진이기 때문에\N오브젝트의 Z값도 필요합니다 Dialogue: 0,0:18:20.58,0:18:26.16,Default,,0000,0000,0000,,아무튼, 움직이게 하려면\N현재 위치에다가 다른걸 더해야 하기 떄문에 Dialogue: 0,0:18:26.16,0:18:31.20,Default,,0000,0000,0000,,transform.position = transform.position + Dialogue: 0,0:18:31.20,0:18:37.32,Default,,0000,0000,0000,,그 후 괄호 안에 Vector3.left * moveSpeed; Dialogue: 0,0:18:39.00,0:18:43.50,Default,,0000,0000,0000,,Unity로 돌아와서, 플레이를 누르면\N너무 빠르네요 Dialogue: 0,0:18:43.50,0:18:47.52,Default,,0000,0000,0000,,그냥 moveSpeed에 엄청 작은 값, Dialogue: 0,0:18:47.52,0:18:53.28,Default,,0000,0000,0000,,예를 들어 0.001을 넣어도 되긴 하지만\N문제의 근본적인 원인은 그게 아닙니다 Dialogue: 0,0:18:53.28,0:18:58.86,Default,,0000,0000,0000,,Update에 있는 코드는 가능한 한 많이 실행됩니다\N게임 뷰에서 통계를 보면; Dialogue: 0,0:18:58.86,0:19:03.06,Default,,0000,0000,0000,,게임이 초당 1000프레임으로 구동되고 있는게 보이네요 Dialogue: 0,0:19:03.06,0:19:07.68,Default,,0000,0000,0000,,플레이스테이션 5에게 미안해지네요,\N120프레임? 플래피 버드에겐 잽도 안되는군요 Dialogue: 0,0:19:07.68,0:19:11.88,Default,,0000,0000,0000,,아무튼 이게 중요한 이유는,\N컴퓨터 사양에 따라 게임이 다른 속도로 구동될 가능성이 있다는 겁니다 Dialogue: 0,0:19:11.88,0:19:16.44,Default,,0000,0000,0000,,컴퓨터 사양에 따라 파이프 속도가 달라지면 안돼죠 Dialogue: 0,0:19:16.44,0:19:22.68,Default,,0000,0000,0000,,시장에 있는 게임에도 이런 실수가 종종 보입니다 -\N다크 소울 2에선, 무기 내구도가 프레임과 Dialogue: 0,0:19:22.68,0:19:30.66,Default,,0000,0000,0000,,연관되어 있어서 60프레임에선 30프레임보다\N내구도가 2배 빨리 닳았습니다 Dialogue: 0,0:19:30.66,0:19:36.42,Default,,0000,0000,0000,,해결법은 간단합니다\N그냥 Time.deltaTime을 곱하면 됩니다 Dialogue: 0,0:19:36.42,0:19:41.28,Default,,0000,0000,0000,,이러면 프레임에 상관 없이 움직임이 일정한 간격으로 발생합니다 Dialogue: 0,0:19:41.28,0:19:44.82,Default,,0000,0000,0000,,Rigidbody에 이게 없어도 됐던 이유는\N물리와 관련된 건 타이머가 내장되어 있기 때문이였고, Dialogue: 0,0:19:44.82,0:19:49.32,Default,,0000,0000,0000,,그 외 상황에는 필요합니다.\N이거(혹은 다른거 뭐든지)에 대해 알고 싶다면, Dialogue: 0,0:19:49.32,0:19:53.58,Default,,0000,0000,0000,,Unity 사용자 매뉴얼을 확인해보세요\N정보와 샘플 코드도 있습니다 Dialogue: 0,0:19:53.58,0:19:59.40,Default,,0000,0000,0000,,아무튼, 이제 파이프가 부드럽게 움직이네요\N좋습니다 Dialogue: 0,0:19:59.40,0:20:04.56,Default,,0000,0000,0000,,다음으로, 파이프가 무한히 생성되는 시스템을 만들겠습니다 Dialogue: 0,0:20:04.56,0:20:10.74,Default,,0000,0000,0000,,우선 계층 구조에 있는 부모 GameObject를 프로젝트에 드래그하세요 Dialogue: 0,0:20:10.74,0:20:16.98,Default,,0000,0000,0000,,이러면 프리팹이 생성됩니다\N프리팹은 이 GameObject 전체의 설계도와도 같죠 Dialogue: 0,0:20:16.98,0:20:22.50,Default,,0000,0000,0000,,그리고 프리팹을 이용하면\N이 GameObject들의 바리에이션을 만들기 쉬워집니다 Dialogue: 0,0:20:22.50,0:20:26.46,Default,,0000,0000,0000,,프리팹을 만들었으면, 계층 구조에 있는건 지워도 됩니다. Dialogue: 0,0:20:26.46,0:20:29.46,Default,,0000,0000,0000,,이제 새로운 빈 오브젝트를 만들고\N이름을 PipeSpawner로 지읍시다 Dialogue: 0,0:20:30.72,0:20:36.24,Default,,0000,0000,0000,,카메라 영역 오른쪽에 놓고,\N이제 스크립트를 만듭시다 Dialogue: 0,0:20:36.24,0:20:41.82,Default,,0000,0000,0000,,스크립트에는 매초마다 파이프 프리팹의 새로운 바리에이션을\N생성하는 코드를 작성할겁니다 - 파이프가 왼쪽으로 움직이는건 Dialogue: 0,0:20:41.82,0:20:46.80,Default,,0000,0000,0000,,이미 전에 했기 덕분에, 파이프가 생성되면 자동으로 왼쪽으로 움직일겁니다 Dialogue: 0,0:20:47.40,0:20:51.36,Default,,0000,0000,0000,,방금 전에 만든 프리팹을 소환하는 코드를 작성할겁니다 Dialogue: 0,0:20:51.36,0:20:54.28,Default,,0000,0000,0000,,일단 프리팹의 레퍼런스부터 만들겠습니다 Dialogue: 0,0:20:54.28,0:20:58.68,Default,,0000,0000,0000,,여기에 public GameObject pipe; 를 작성합니다 Dialogue: 0,0:20:58.68,0:21:03.84,Default,,0000,0000,0000,,그 후 Unity에서 빈칸을 드래그로 채울겁니다.\N이 빈칸은 Dialogue: 0,0:21:03.84,0:21:07.92,Default,,0000,0000,0000,,컴포넌트로 채우는게 아니라, 프리팹으로 채워야 합니다 Dialogue: 0,0:21:07.92,0:21:11.58,Default,,0000,0000,0000,,Unity에는 새로운 GameObject를 생성하는 기능이 내장되어 있기에 Dialogue: 0,0:21:11.58,0:21:17.88,Default,,0000,0000,0000,,그걸 써먹으려면, Instantiate, 그리고 괄호를 열면 Dialogue: 0,0:21:17.88,0:21:22.98,Default,,0000,0000,0000,,뭔가 자세히 입력하라고 뜨네요\N화살표를 눌러 이 레시피? 같은걸 넘기다 Dialogue: 0,0:21:22.98,0:21:28.50,Default,,0000,0000,0000,,보면 - 4번이 좋아보이는군요\N특정한 좌표와 기울기를 가진 GameObject를 생성한다고 하네요 Dialogue: 0,0:21:28.50,0:21:32.76,Default,,0000,0000,0000,,생성할 GameObject는 pipe고; 좌표는 Dialogue: 0,0:21:32.76,0:21:37.56,Default,,0000,0000,0000,,transform.position을 사용하면 이 스크립트가 달린 오브젝트의 Dialogue: 0,0:21:37.56,0:21:42.18,Default,,0000,0000,0000,,좌표를 구할 수 있기에 그걸 쓰면 되고,\N기울기는 Dialogue: 0,0:21:42.18,0:21:46.80,Default,,0000,0000,0000,,같은 원리로 transform.rotation을 쓰면 됩니다 Dialogue: 0,0:21:48.30,0:21:52.74,Default,,0000,0000,0000,,플레이 해보면, 맙소사 너무 많이 소환되네요 \N소환은 되는데 Dialogue: 0,0:21:52.74,0:21:55.56,Default,,0000,0000,0000,,매 프레임마다 소환되고 있습니다 Dialogue: 0,0:21:55.56,0:21:59.76,Default,,0000,0000,0000,,작당한 간격을 두고 소환되게 만듭시다\N- Visual Studio로 돌아와서 Dialogue: 0,0:21:59.76,0:22:05.10,Default,,0000,0000,0000,,타이머를 만들겁니다 Dialogue: 0,0:22:05.10,0:22:10.14,Default,,0000,0000,0000,,타이머가 끝나면, 코드 실행,\N타이머, 같은 식으로요 Dialogue: 0,0:22:10.14,0:22:14.52,Default,,0000,0000,0000,,일단 변수 몇개를 만들어야 합니다\NspawnRate는 소환 간 간격을 Dialogue: 0,0:22:14.52,0:22:19.56,Default,,0000,0000,0000,,나타내고, timer는 말 그대로 타이머입니다 Dialogue: 0,0:22:19.56,0:22:22.98,Default,,0000,0000,0000,,timer는 private로 작성할 겁니다\N왜냐면 다른 스크립트에서도 timer를 쓰면 혼동이 오니까요 Dialogue: 0,0:22:22.98,0:22:29.40,Default,,0000,0000,0000,,Update에는, if를 작성할겁니다\N만약 timer가 spawnRate보다 작다면: Dialogue: 0,0:22:29.40,0:22:34.98,Default,,0000,0000,0000,,timer를 1만큼 올릴겁니다\N그럴려면 Dialogue: 0,0:22:34.98,0:22:39.78,Default,,0000,0000,0000,,현재 timer에 time.deltaTime을 더하면 됩니다\N이러면 매 프레임마다 timer가 올라가고 Dialogue: 0,0:22:39.78,0:22:42.60,Default,,0000,0000,0000,,컴퓨터 사양에 상관없이 타이머가 일정하게 올라갑니다 Dialogue: 0,0:22:42.60,0:22:48.48,Default,,0000,0000,0000,,이 과정은 += 로 줄일 수 있지만,\N다른 사람한데 꼽사리 안받으려고 Dialogue: 0,0:22:48.48,0:22:53.04,Default,,0000,0000,0000,,코드 분량을 이 악물고 줄일 필요는 없습니다 Dialogue: 0,0:22:53.04,0:22:58.44,Default,,0000,0000,0000,,만약 timer = timer + ~ 가 읽기 더 편하다면\N그렇게 쓰면 됩니다 Dialogue: 0,0:22:58.44,0:23:01.74,Default,,0000,0000,0000,,나중에 생각이 바뀌더라도 그냥 바꾸면 되니까요 Dialogue: 0,0:23:01.74,0:23:05.22,Default,,0000,0000,0000,,아무튼, 제가 전에 if는 관문과도 같단 말을 했었죠 Dialogue: 0,0:23:05.22,0:23:09.54,Default,,0000,0000,0000,,else를 이용하면 관문 옆에 또다른 관문을 만들 수 있습니다 Dialogue: 0,0:23:09.54,0:23:14.52,Default,,0000,0000,0000,,즉, if 조건을 만족하지 못하면 else에 있는 조건을 시도합니다 Dialogue: 0,0:23:14.52,0:23:22.56,Default,,0000,0000,0000,,이제 else 안에 파이프 생성 코드를 쓰고, \Ntimer를 0으로 리셋하는 코드도 쓰겠습니다. 이제 매 프레임마다 Dialogue: 0,0:23:22.56,0:23:28.50,Default,,0000,0000,0000,,timer가 spawnRate보다 작은지 확인하고,\N만약 맞다면, timer 증가, 아니라면, 즉 Dialogue: 0,0:23:28.50,0:23:33.42,Default,,0000,0000,0000,,timer가 생성 주기와 같거나 높으면, \N파이프를 생성하고 timer를 0으로 리셋. Dialogue: 0,0:23:33.42,0:23:38.82,Default,,0000,0000,0000,,저장하고 플레이하면 - 잘 되네요\N근데 한가지 문제점은, Dialogue: 0,0:23:38.82,0:23:44.10,Default,,0000,0000,0000,,첫 파이프가 생성될때까지 한참 기다려야 된다는 점입니다\N파이프가 시작하자마자 나오면 좋을텐데요 Dialogue: 0,0:23:44.10,0:23:49.56,Default,,0000,0000,0000,,파이프 생성 코드를 Start에 복붙하면,\N시작하자마자 파이프가 나올겁니다 Dialogue: 0,0:23:49.56,0:23:55.32,Default,,0000,0000,0000,,그런데 이런 식으로 코드 전체를 복붙하는건 좋은 습관이 아닙니다 Dialogue: 0,0:23:55.32,0:24:00.90,Default,,0000,0000,0000,,게임을 만들 때는, 똑같거나 비슷한 코드를 온갖곳에 두는건\N피해야 합니다. 이유를 말하자면, Dialogue: 0,0:24:00.90,0:24:06.12,Default,,0000,0000,0000,,예를 들어 파이프 스폰 방식을 바꾸고 싶다고 하면\N온갖곳에 있는 코드를 전부 일일히 바꿔야 할겁니다 Dialogue: 0,0:24:06.12,0:24:10.26,Default,,0000,0000,0000,,대신, 그 코드를 새로운 함수(function)에 넣고, \N그 함수를 실행하면 됩니다 Dialogue: 0,0:24:10.26,0:24:15.18,Default,,0000,0000,0000,,Update 밑에, 마지막 중꽐호 위에, Dialogue: 0,0:24:15.18,0:24:21.42,Default,,0000,0000,0000,,void spawnPipe()라는 함수를 만들고,\N파이프 생성 코드를 안에 넣으면 되죠 Dialogue: 0,0:24:21.42,0:24:27.72,Default,,0000,0000,0000,,이제 원래 그게 있던 자리에 spawnPipe()만 넣으면 됩니다 Dialogue: 0,0:24:27.72,0:24:32.34,Default,,0000,0000,0000,,이제 spawnPipe()라는 코드가 실행될 때마다 \N아래에 있는 함수가 실행됩니다 Dialogue: 0,0:24:32.34,0:24:37.80,Default,,0000,0000,0000,,잘 되는지 확인해보면,\N처음 시작할때 파이프 나오고, 타이머 지날때마다 생성되네요. 좋습니다 Dialogue: 0,0:24:38.76,0:24:44.70,Default,,0000,0000,0000,,그런데, 파이프가 항상 중간에 나오니\N게임이 너무 단조롭네요 Dialogue: 0,0:24:44.70,0:24:49.08,Default,,0000,0000,0000,,파이프의 높이가 랜덤하게 나왔으면 좋겠는데;\N파이프 생성 코드가 어떻게 되있었는지 기억나시나요? Dialogue: 0,0:24:49.08,0:24:52.98,Default,,0000,0000,0000,,오브젝트의 생성 좌표를 지정할 수 있었던거 기억나나요?\N그 값을 바꿉시다 Dialogue: 0,0:24:52.98,0:24:58.14,Default,,0000,0000,0000,,현재는 파이프가 항상 같은 좌표에 생성되고 있죠\N Dialogue: 0,0:24:58.14,0:25:03.96,Default,,0000,0000,0000,,X좌표는 같아도 되니 냅두고, Y는... \NPipeSpawner 위 혹은 아래에 랜덤하게 생성되면 좋겠네요 Dialogue: 0,0:25:03.96,0:25:08.52,Default,,0000,0000,0000,,우선 heightOffset이라는 public 변수를 만듭시다\N값은 10정도로 하죠 Dialogue: 0,0:25:08.52,0:25:14.22,Default,,0000,0000,0000,,그리고 이 안에 lowestPoint라는 float를 만들겁니다\N함수 안에서 변수를 만들고 있기에, Dialogue: 0,0:25:14.22,0:25:19.80,Default,,0000,0000,0000,,이 변수는 이 함수 안에서만 사용 가능합니다 Dialogue: 0,0:25:19.80,0:25:22.20,Default,,0000,0000,0000,,또한, ??? Dialogue: 0,0:25:22.20,0:25:29.82,Default,,0000,0000,0000,,일단 lowestPoint = transform.position.y - heightOffset\N그리고 Dialogue: 0,0:25:29.82,0:25:36.60,Default,,0000,0000,0000,,highestPoint도 만들겁니다 \Nlowest와 같지만 - 대신 +를 넣으면 됩니다. 숫자 2개가 만들어졌으니 Dialogue: 0,0:25:37.56,0:25:41.40,Default,,0000,0000,0000,, Dialogue: 0,0:25:41.40,0:25:47.40,Default,,0000,0000,0000,, Dialogue: 0,0:25:47.40,0:25:53.70,Default,,0000,0000,0000,, Dialogue: 0,0:25:53.70,0:25:59.16,Default,,0000,0000,0000,, Dialogue: 0,0:25:59.16,0:26:05.16,Default,,0000,0000,0000,, Dialogue: 0,0:26:05.16,0:26:12.30,Default,,0000,0000,0000,, Dialogue: 0,0:26:14.22,0:26:19.56,Default,,0000,0000,0000,, Dialogue: 0,0:26:19.56,0:26:24.78,Default,,0000,0000,0000,, Dialogue: 0,0:26:24.78,0:26:30.12,Default,,0000,0000,0000,, Dialogue: 0,0:26:30.12,0:26:35.10,Default,,0000,0000,0000,, Dialogue: 0,0:26:35.10,0:26:40.14,Default,,0000,0000,0000,, Dialogue: 0,0:26:40.14,0:26:45.06,Default,,0000,0000,0000,, Dialogue: 0,0:26:45.06,0:26:50.70,Default,,0000,0000,0000,, Dialogue: 0,0:26:50.70,0:26:58.26,Default,,0000,0000,0000,, Dialogue: 0,0:26:58.26,0:27:06.12,Default,,0000,0000,0000,, Dialogue: 0,0:27:06.12,0:27:13.02,Default,,0000,0000,0000,, Dialogue: 0,0:27:15.72,0:27:18.84,Default,,0000,0000,0000,, Dialogue: 0,0:27:18.84,0:27:24.42,Default,,0000,0000,0000,, Dialogue: 0,0:27:24.42,0:27:32.88,Default,,0000,0000,0000,, Dialogue: 0,0:27:32.88,0:27:39.42,Default,,0000,0000,0000,, Dialogue: 0,0:27:39.42,0:27:44.82,Default,,0000,0000,0000,, Dialogue: 0,0:27:44.82,0:27:50.28,Default,,0000,0000,0000,, Dialogue: 0,0:27:51.90,0:27:52.80,Default,,0000,0000,0000,, Dialogue: 0,0:27:52.80,0:27:55.56,Default,,0000,0000,0000,, Dialogue: 0,0:27:55.56,0:27:58.98,Default,,0000,0000,0000,, Dialogue: 0,0:27:58.98,0:28:04.02,Default,,0000,0000,0000,, Dialogue: 0,0:28:04.02,0:28:08.94,Default,,0000,0000,0000,, Dialogue: 0,0:28:08.94,0:28:12.66,Default,,0000,0000,0000,, Dialogue: 0,0:28:12.66,0:28:17.40,Default,,0000,0000,0000,, Dialogue: 0,0:28:17.40,0:28:21.54,Default,,0000,0000,0000,, Dialogue: 0,0:28:21.54,0:28:26.52,Default,,0000,0000,0000,, Dialogue: 0,0:28:26.52,0:28:30.96,Default,,0000,0000,0000,, Dialogue: 0,0:28:32.40,0:28:35.82,Default,,0000,0000,0000,, Dialogue: 0,0:28:35.82,0:28:39.36,Default,,0000,0000,0000,, Dialogue: 0,0:28:39.36,0:28:43.38,Default,,0000,0000,0000,, Dialogue: 0,0:28:43.38,0:28:47.46,Default,,0000,0000,0000,, Dialogue: 0,0:28:47.46,0:28:52.56,Default,,0000,0000,0000,, Dialogue: 0,0:28:52.56,0:28:57.54,Default,,0000,0000,0000,, Dialogue: 0,0:28:57.54,0:29:01.26,Default,,0000,0000,0000,, Dialogue: 0,0:29:01.26,0:29:06.60,Default,,0000,0000,0000,, Dialogue: 0,0:29:06.60,0:29:11.52,Default,,0000,0000,0000,, Dialogue: 0,0:29:11.52,0:29:16.68,Default,,0000,0000,0000,, Dialogue: 0,0:29:16.68,0:29:21.66,Default,,0000,0000,0000,, Dialogue: 0,0:29:21.66,0:29:28.26,Default,,0000,0000,0000,, Dialogue: 0,0:29:28.26,0:29:34.20,Default,,0000,0000,0000,, Dialogue: 0,0:29:34.20,0:29:40.14,Default,,0000,0000,0000,, Dialogue: 0,0:29:40.14,0:29:44.70,Default,,0000,0000,0000,, Dialogue: 0,0:29:46.62,0:29:49.08,Default,,0000,0000,0000,, Dialogue: 0,0:29:49.08,0:29:53.28,Default,,0000,0000,0000,, Dialogue: 0,0:29:53.28,0:29:56.64,Default,,0000,0000,0000,, Dialogue: 0,0:29:56.64,0:29:59.82,Default,,0000,0000,0000,, Dialogue: 0,0:29:59.82,0:30:02.94,Default,,0000,0000,0000,, Dialogue: 0,0:30:03.96,0:30:08.82,Default,,0000,0000,0000,, Dialogue: 0,0:30:08.82,0:30:13.86,Default,,0000,0000,0000,, Dialogue: 0,0:30:13.86,0:30:18.18,Default,,0000,0000,0000,, Dialogue: 0,0:30:18.18,0:30:22.74,Default,,0000,0000,0000,, Dialogue: 0,0:30:22.74,0:30:27.60,Default,,0000,0000,0000,, Dialogue: 0,0:30:27.60,0:30:30.36,Default,,0000,0000,0000,, Dialogue: 0,0:30:30.36,0:30:34.98,Default,,0000,0000,0000,, Dialogue: 0,0:30:34.98,0:30:40.68,Default,,0000,0000,0000,, Dialogue: 0,0:30:40.68,0:30:46.32,Default,,0000,0000,0000,, Dialogue: 0,0:30:46.32,0:30:52.50,Default,,0000,0000,0000,, Dialogue: 0,0:30:52.50,0:30:58.68,Default,,0000,0000,0000,, Dialogue: 0,0:30:59.28,0:31:04.68,Default,,0000,0000,0000,, Dialogue: 0,0:31:04.68,0:31:09.54,Default,,0000,0000,0000,, Dialogue: 0,0:31:09.54,0:31:16.02,Default,,0000,0000,0000,, Dialogue: 0,0:31:16.02,0:31:20.46,Default,,0000,0000,0000,, Dialogue: 0,0:31:20.46,0:31:25.01,Default,,0000,0000,0000,, Dialogue: 0,0:31:25.74,0:31:30.84,Default,,0000,0000,0000,, Dialogue: 0,0:31:30.84,0:31:39.24,Default,,0000,0000,0000,, Dialogue: 0,0:31:39.24,0:31:45.72,Default,,0000,0000,0000,, Dialogue: 0,0:31:45.72,0:31:51.72,Default,,0000,0000,0000,, Dialogue: 0,0:31:52.80,0:31:56.58,Default,,0000,0000,0000,, Dialogue: 0,0:31:56.58,0:32:02.82,Default,,0000,0000,0000,, Dialogue: 0,0:32:05.34,0:32:10.14,Default,,0000,0000,0000,, Dialogue: 0,0:32:10.80,0:32:14.46,Default,,0000,0000,0000,, Dialogue: 0,0:32:15.06,0:32:18.66,Default,,0000,0000,0000,, Dialogue: 0,0:32:18.66,0:32:23.22,Default,,0000,0000,0000,, Dialogue: 0,0:32:23.22,0:32:28.38,Default,,0000,0000,0000,, Dialogue: 0,0:32:28.38,0:32:33.06,Default,,0000,0000,0000,, Dialogue: 0,0:32:33.06,0:32:37.74,Default,,0000,0000,0000,, Dialogue: 0,0:32:37.74,0:32:42.00,Default,,0000,0000,0000,, Dialogue: 0,0:32:42.00,0:32:45.18,Default,,0000,0000,0000,, Dialogue: 0,0:32:45.18,0:32:50.70,Default,,0000,0000,0000,, Dialogue: 0,0:32:50.70,0:32:55.92,Default,,0000,0000,0000,, Dialogue: 0,0:32:55.92,0:33:00.90,Default,,0000,0000,0000,, Dialogue: 0,0:33:00.90,0:33:06.42,Default,,0000,0000,0000,, Dialogue: 0,0:33:06.42,0:33:13.92,Default,,0000,0000,0000,, Dialogue: 0,0:33:13.92,0:33:18.96,Default,,0000,0000,0000,, Dialogue: 0,0:33:18.96,0:33:25.62,Default,,0000,0000,0000,, Dialogue: 0,0:33:25.62,0:33:30.06,Default,,0000,0000,0000,, Dialogue: 0,0:33:30.06,0:33:34.44,Default,,0000,0000,0000,, Dialogue: 0,0:33:34.44,0:33:41.34,Default,,0000,0000,0000,, Dialogue: 0,0:33:41.34,0:33:45.84,Default,,0000,0000,0000,, Dialogue: 0,0:33:45.84,0:33:51.06,Default,,0000,0000,0000,, Dialogue: 0,0:33:51.06,0:33:56.88,Default,,0000,0000,0000,, Dialogue: 0,0:33:56.88,0:34:01.32,Default,,0000,0000,0000,, Dialogue: 0,0:34:01.32,0:34:05.52,Default,,0000,0000,0000,, Dialogue: 0,0:34:05.52,0:34:08.34,Default,,0000,0000,0000,, Dialogue: 0,0:34:08.34,0:34:12.72,Default,,0000,0000,0000,, Dialogue: 0,0:34:12.72,0:34:16.80,Default,,0000,0000,0000,, Dialogue: 0,0:34:16.80,0:34:23.82,Default,,0000,0000,0000,, Dialogue: 0,0:34:23.82,0:34:30.06,Default,,0000,0000,0000,, Dialogue: 0,0:34:30.06,0:34:34.68,Default,,0000,0000,0000,, Dialogue: 0,0:34:34.68,0:34:37.38,Default,,0000,0000,0000,, Dialogue: 0,0:34:37.38,0:34:46.74,Default,,0000,0000,0000,, Dialogue: 0,0:34:46.74,0:34:50.82,Default,,0000,0000,0000,, Dialogue: 0,0:34:50.82,0:34:54.42,Default,,0000,0000,0000,, Dialogue: 0,0:34:54.42,0:34:57.90,Default,,0000,0000,0000,, Dialogue: 0,0:34:57.90,0:35:02.28,Default,,0000,0000,0000,, Dialogue: 0,0:35:03.48,0:35:09.30,Default,,0000,0000,0000,, Dialogue: 0,0:35:09.30,0:35:13.80,Default,,0000,0000,0000,, Dialogue: 0,0:35:13.80,0:35:19.02,Default,,0000,0000,0000,, Dialogue: 0,0:35:19.02,0:35:22.74,Default,,0000,0000,0000,, Dialogue: 0,0:35:22.74,0:35:28.20,Default,,0000,0000,0000,, Dialogue: 0,0:35:28.86,0:35:33.96,Default,,0000,0000,0000,, Dialogue: 0,0:35:35.40,0:35:41.34,Default,,0000,0000,0000,, Dialogue: 0,0:35:41.34,0:35:47.34,Default,,0000,0000,0000,, Dialogue: 0,0:35:47.34,0:35:52.86,Default,,0000,0000,0000,, Dialogue: 0,0:35:52.86,0:35:57.66,Default,,0000,0000,0000,, Dialogue: 0,0:35:57.66,0:36:03.90,Default,,0000,0000,0000,, Dialogue: 0,0:36:03.90,0:36:10.62,Default,,0000,0000,0000,, Dialogue: 0,0:36:10.62,0:36:15.48,Default,,0000,0000,0000,, Dialogue: 0,0:36:15.48,0:36:20.40,Default,,0000,0000,0000,, Dialogue: 0,0:36:22.56,0:36:27.49,Default,,0000,0000,0000,, Dialogue: 0,0:36:27.49,0:36:33.42,Default,,0000,0000,0000,, Dialogue: 0,0:36:33.42,0:36:38.52,Default,,0000,0000,0000,, Dialogue: 0,0:36:39.24,0:36:45.36,Default,,0000,0000,0000,, Dialogue: 0,0:36:45.36,0:36:50.16,Default,,0000,0000,0000,, Dialogue: 0,0:36:50.16,0:36:54.90,Default,,0000,0000,0000,, Dialogue: 0,0:36:54.90,0:36:58.98,Default,,0000,0000,0000,, Dialogue: 0,0:36:58.98,0:37:03.12,Default,,0000,0000,0000,, Dialogue: 0,0:37:03.12,0:37:07.44,Default,,0000,0000,0000,, Dialogue: 0,0:37:07.44,0:37:12.66,Default,,0000,0000,0000,, Dialogue: 0,0:37:12.66,0:37:14.04,Default,,0000,0000,0000,, Dialogue: 0,0:37:14.04,0:37:17.88,Default,,0000,0000,0000,, Dialogue: 0,0:37:17.88,0:37:22.92,Default,,0000,0000,0000,, Dialogue: 0,0:37:22.92,0:37:25.68,Default,,0000,0000,0000,, Dialogue: 0,0:37:25.68,0:37:29.76,Default,,0000,0000,0000,, Dialogue: 0,0:37:29.76,0:37:34.08,Default,,0000,0000,0000,, Dialogue: 0,0:37:34.08,0:37:36.66,Default,,0000,0000,0000,, Dialogue: 0,0:37:36.66,0:37:42.30,Default,,0000,0000,0000,, Dialogue: 0,0:37:42.30,0:37:46.74,Default,,0000,0000,0000,, Dialogue: 0,0:37:46.74,0:37:50.94,Default,,0000,0000,0000,, Dialogue: 0,0:37:50.94,0:37:56.58,Default,,0000,0000,0000,, Dialogue: 0,0:37:56.58,0:37:59.40,Default,,0000,0000,0000,, Dialogue: 0,0:38:01.02,0:38:06.90,Default,,0000,0000,0000,, Dialogue: 0,0:38:06.90,0:38:11.34,Default,,0000,0000,0000,, Dialogue: 0,0:38:11.34,0:38:16.32,Default,,0000,0000,0000,, Dialogue: 0,0:38:16.98,0:38:21.06,Default,,0000,0000,0000,, Dialogue: 0,0:38:21.06,0:38:28.44,Default,,0000,0000,0000,, Dialogue: 0,0:38:30.96,0:38:36.90,Default,,0000,0000,0000,, Dialogue: 0,0:38:36.90,0:38:41.58,Default,,0000,0000,0000,, Dialogue: 0,0:38:43.44,0:38:48.00,Default,,0000,0000,0000,, Dialogue: 0,0:38:48.00,0:38:53.52,Default,,0000,0000,0000,, Dialogue: 0,0:38:53.52,0:38:58.68,Default,,0000,0000,0000,, Dialogue: 0,0:38:59.52,0:39:02.10,Default,,0000,0000,0000,, Dialogue: 0,0:39:02.10,0:39:07.08,Default,,0000,0000,0000,, Dialogue: 0,0:39:07.08,0:39:12.06,Default,,0000,0000,0000,, Dialogue: 0,0:39:12.06,0:39:17.58,Default,,0000,0000,0000,, Dialogue: 0,0:39:17.58,0:39:22.56,Default,,0000,0000,0000,, Dialogue: 0,0:39:23.94,0:39:30.18,Default,,0000,0000,0000,, Dialogue: 0,0:39:30.18,0:39:35.46,Default,,0000,0000,0000,, Dialogue: 0,0:39:35.46,0:39:42.72,Default,,0000,0000,0000,, Dialogue: 0,0:39:44.58,0:39:48.00,Default,,0000,0000,0000,, Dialogue: 0,0:39:48.96,0:39:53.34,Default,,0000,0000,0000,, Dialogue: 0,0:39:57.30,0:40:02.58,Default,,0000,0000,0000,, Dialogue: 0,0:40:02.58,0:40:07.56,Default,,0000,0000,0000,, Dialogue: 0,0:40:07.56,0:40:12.00,Default,,0000,0000,0000,, Dialogue: 0,0:40:13.38,0:40:16.26,Default,,0000,0000,0000,, Dialogue: 0,0:40:16.26,0:40:22.62,Default,,0000,0000,0000,, Dialogue: 0,0:40:22.62,0:40:27.75,Default,,0000,0000,0000,, Dialogue: 0,0:40:27.90,0:40:30.12,Default,,0000,0000,0000,, Dialogue: 0,0:40:31.47,0:40:38.61,Default,,0000,0000,0000,, Dialogue: 0,0:40:38.82,0:40:42.30,Default,,0000,0000,0000,, Dialogue: 0,0:40:42.30,0:40:48.18,Default,,0000,0000,0000,, Dialogue: 0,0:40:48.18,0:40:52.68,Default,,0000,0000,0000,, Dialogue: 0,0:40:52.68,0:40:57.72,Default,,0000,0000,0000,, Dialogue: 0,0:40:57.72,0:41:03.36,Default,,0000,0000,0000,, Dialogue: 0,0:41:03.36,0:41:10.28,Default,,0000,0000,0000,, Dialogue: 0,0:41:10.28,0:41:16.44,Default,,0000,0000,0000,, Dialogue: 0,0:41:16.44,0:41:21.42,Default,,0000,0000,0000,, Dialogue: 0,0:41:21.42,0:41:28.38,Default,,0000,0000,0000,, Dialogue: 0,0:41:28.38,0:41:34.32,Default,,0000,0000,0000,, Dialogue: 0,0:41:34.32,0:41:38.34,Default,,0000,0000,0000,, Dialogue: 0,0:41:38.94,0:41:44.16,Default,,0000,0000,0000,, Dialogue: 0,0:41:44.16,0:41:49.08,Default,,0000,0000,0000,, Dialogue: 0,0:41:49.08,0:41:54.48,Default,,0000,0000,0000,, Dialogue: 0,0:41:54.48,0:42:01.20,Default,,0000,0000,0000,, Dialogue: 0,0:42:01.20,0:42:06.36,Default,,0000,0000,0000,, Dialogue: 0,0:42:06.36,0:42:11.40,Default,,0000,0000,0000,, Dialogue: 0,0:42:11.40,0:42:17.04,Default,,0000,0000,0000,, Dialogue: 0,0:42:17.04,0:42:24.36,Default,,0000,0000,0000,, Dialogue: 0,0:42:24.36,0:42:31.50,Default,,0000,0000,0000,, Dialogue: 0,0:42:31.50,0:42:35.40,Default,,0000,0000,0000,, Dialogue: 0,0:42:35.40,0:42:39.96,Default,,0000,0000,0000,, Dialogue: 0,0:42:39.96,0:42:43.98,Default,,0000,0000,0000,, Dialogue: 0,0:42:43.98,0:42:48.66,Default,,0000,0000,0000,, Dialogue: 0,0:42:48.66,0:42:53.70,Default,,0000,0000,0000,, Dialogue: 0,0:42:53.70,0:42:55.57,Default,,0000,0000,0000,, Dialogue: 0,0:42:55.57,0:43:00.06,Default,,0000,0000,0000,, Dialogue: 0,0:43:00.06,0:43:05.22,Default,,0000,0000,0000,, Dialogue: 0,0:43:05.22,0:43:10.44,Default,,0000,0000,0000,, Dialogue: 0,0:43:10.44,0:43:15.66,Default,,0000,0000,0000,, Dialogue: 0,0:43:15.66,0:43:21.42,Default,,0000,0000,0000,, Dialogue: 0,0:43:21.42,0:43:27.56,Default,,0000,0000,0000,, Dialogue: 0,0:43:27.56,0:43:31.67,Default,,0000,0000,0000,, Dialogue: 0,0:43:31.67,0:43:37.26,Default,,0000,0000,0000,, Dialogue: 0,0:43:37.26,0:43:41.16,Default,,0000,0000,0000,, Dialogue: 0,0:43:41.16,0:43:43.86,Default,,0000,0000,0000,, Dialogue: 0,0:43:43.86,0:43:48.36,Default,,0000,0000,0000,, Dialogue: 0,0:43:48.36,0:43:51.90,Default,,0000,0000,0000,, Dialogue: 0,0:43:51.90,0:43:55.02,Default,,0000,0000,0000,, Dialogue: 0,0:43:55.02,0:44:00.30,Default,,0000,0000,0000,, Dialogue: 0,0:44:00.30,0:44:05.70,Default,,0000,0000,0000,, Dialogue: 0,0:44:05.70,0:44:11.22,Default,,0000,0000,0000,, Dialogue: 0,0:44:11.22,0:44:15.60,Default,,0000,0000,0000,, Dialogue: 0,0:44:15.60,0:44:19.32,Default,,0000,0000,0000,, Dialogue: 0,0:44:19.32,0:44:22.80,Default,,0000,0000,0000,, Dialogue: 0,0:44:22.80,0:44:25.74,Default,,0000,0000,0000,, Dialogue: 0,0:44:25.74,0:44:30.54,Default,,0000,0000,0000,, Dialogue: 0,0:44:30.54,0:44:35.40,Default,,0000,0000,0000,, Dialogue: 0,0:44:35.40,0:44:40.62,Default,,0000,0000,0000,, Dialogue: 0,0:44:40.62,0:44:45.12,Default,,0000,0000,0000,, Dialogue: 0,0:44:45.12,0:44:48.84,Default,,0000,0000,0000,, Dialogue: 0,0:44:48.84,0:44:53.28,Default,,0000,0000,0000,, Dialogue: 0,0:44:53.28,0:44:58.32,Default,,0000,0000,0000,, Dialogue: 0,0:44:58.32,0:45:03.48,Default,,0000,0000,0000,, Dialogue: 0,0:45:03.48,0:45:07.50,Default,,0000,0000,0000,, Dialogue: 0,0:45:07.50,0:45:11.58,Default,,0000,0000,0000,, Dialogue: 0,0:45:11.58,0:45:15.06,Default,,0000,0000,0000,, Dialogue: 0,0:45:15.06,0:45:19.20,Default,,0000,0000,0000,, Dialogue: 0,0:45:19.20,0:45:20.94,Default,,0000,0000,0000,, Dialogue: 0,0:45:20.94,0:45:25.68,Default,,0000,0000,0000,, Dialogue: 0,0:45:25.68,0:45:30.60,Default,,0000,0000,0000,, Dialogue: 0,0:45:30.60,0:45:35.22,Default,,0000,0000,0000,, Dialogue: 0,0:45:35.22,0:45:38.88,Default,,0000,0000,0000,, Dialogue: 0,0:45:38.88,0:45:46.37,Default,,0000,0000,0000,, Dialogue: 0,0:45:46.37,0:45:52.28,Default,,0000,0000,0000,, Dialogue: 0,0:45:52.28,0:45:54.54,Default,,0000,0000,0000,, Dialogue: 0,0:45:54.54,0:45:58.68,Default,,0000,0000,0000,, Dialogue: 0,0:45:58.68,0:46:04.38,Default,,0000,0000,0000,, Dialogue: 0,0:46:04.38,0:46:10.38,Default,,0000,0000,0000,, Dialogue: 0,0:46:10.38,0:46:14.04,Default,,0000,0000,0000,, Dialogue: 0,0:46:14.04,0:46:17.46,Default,,0000,0000,0000,, Dialogue: 0,0:46:17.46,0:46:22.14,Default,,0000,0000,0000,, Dialogue: 0,0:46:22.14,0:46:25.44,Default,,0000,0000,0000,, Dialogue: 0,0:46:25.44,0:46:30.54,Default,,0000,0000,0000,,