1 00:00:05.623 --> 00:00:09.632 게임 심화편 프로토타입2 2 00:00:09.632 --> 00:00:12.098 GCC 사관학교 3 00:00:27.786 --> 00:00:28.686 안녕하세요 4 00:00:28.686 --> 00:00:31.733 슈팅게임 제작 강의를 맡게 된 이영호입니다 5 00:00:31.733 --> 00:00:33.183 이번 단원에서는 6 00:00:33.183 --> 00:00:36.772 프로토타입 두 번째 내용을 학습하도록 하겠습니다 7 00:00:36.772 --> 00:00:39.972 먼저 Vector를 이해하고 이를 이용해 8 00:00:39.972 --> 00:00:44.723 등속운동 공식을 바탕으로 플레이어를 이동시켜 보겠습니다 9 00:00:44.723 --> 00:00:49.020 그리고 해당 사용자 입력 처리에 따른 이동을 구현해 보도록 하겠습니다 10 00:00:50.400 --> 00:00:54.221 Vector의 이해 11 00:00:54.544 --> 00:00:58.762 자 그럼 벡터의 이해부터 알아보도록 하겠습니다 12 00:00:58.762 --> 00:01:02.238 먼저 샘플 코드를 임의로 한번 만들어 볼게요 13 00:01:02.238 --> 00:01:04.985 플레이어가 오른쪽으로 계속 이동하는 14 00:01:04.985 --> 00:01:07.027 코드를 한번 만들어 보겠습니다 15 00:01:08.975 --> 00:01:14.891 플레이어가 오른쪽으로 계속 이동하고 싶다 16 00:01:14.891 --> 00:01:17.624 이 내용을 한번 작성해 보도록 할게요 17 00:01:21.069 --> 00:01:22.841 transform 18 00:01:24.544 --> 00:01:27.725 Translate 19 00:01:31.246 --> 00:01:41.185 여기다가 Vector3.right * 5 * Time.deltaTime 20 00:01:41.185 --> 00:01:44.285 이렇게 넣어보도록 하겠습니다 21 00:01:44.285 --> 00:01:46.983 이렇게 하면 플레이어가 오른쪽으로 계속 이동하고 싶다는 22 00:01:46.983 --> 00:01:48.544 내용을 넣은 거고요 23 00:01:48.544 --> 00:01:51.247 이 한글 내용을 먼저 저희가 써봤잖아요 24 00:01:51.247 --> 00:01:52.547 이 내용을 보면 25 00:01:52.547 --> 00:01:55.762 얘가 Start가 아닌 Update에 있는 이유가 있죠 26 00:01:55.762 --> 00:01:59.112 살아가는 동안 계속해서 뭔가를 하고 싶을 때 27 00:01:59.112 --> 00:02:01.062 그때 이 문장 자체가 28 00:02:01.062 --> 00:02:04.277 Start가 아닌 Update에 와야 되는 이유예요 29 00:02:04.277 --> 00:02:06.727 이렇게 저장을 하고 30 00:02:06.727 --> 00:02:09.762 이제 와서 플레이를 해 보도록 하겠습니다 31 00:02:09.762 --> 00:02:10.862 플레이 버튼을 눌러보면 32 00:02:13.278 --> 00:02:15.416 플레이어가 오른쪽으로 계속 이동하고 있죠 33 00:02:18.208 --> 00:02:24.000 이 내용을 가능하게 하는 이 문장이 중요합니다 34 00:02:24.000 --> 00:02:28.634 이걸 위해서 몇 가지 내용들을 알아 봐야 될 텐데요 35 00:02:28.634 --> 00:02:30.734 벡터에 대한 내용을 알아보고 36 00:02:30.734 --> 00:02:33.822 그다음에 이 문장 전체에 대해서도 알아보도록 하겠습니다 37 00:02:36.901 --> 00:02:41.505 그러면 먼저 벡터라는 애는 어떻게 되어있는 거냐 38 00:02:41.505 --> 00:02:45.247 일단 생김새를 보면 이런 식으로 생겼어요, 화살표로 39 00:02:45.247 --> 00:02:48.663 이 화살표는, 이 몸통 부분 있잖아요? 40 00:02:48.663 --> 00:02:50.594 이 몸통 부분, 꼬리 부분이라고 할게요 41 00:02:50.594 --> 00:02:53.832 이 꼬리 부분과 머리 부분 이렇게 보도록 하겠습니다 42 00:02:53.832 --> 00:02:58.307 이 부분을, 파란색으로 되어있는 부분을 크기라고 하고요 43 00:02:58.307 --> 00:03:01.505 그리고 이 빨간색으로 되어있는 화살표 부분 있죠? 44 00:03:01.505 --> 00:03:03.604 이것을 우리가 방향이라고 얘기합니다 45 00:03:06.396 --> 00:03:09.393 그래서 이 벡터라는 애는 두 가지 성분을 46 00:03:09.393 --> 00:03:11.455 함께 포함하고 있는 요소인데요 47 00:03:11.455 --> 00:03:14.000 하나는 크기고요 하나는 방향입니다 48 00:03:14.000 --> 00:03:16.050 이 두 가지를 함께 가지고 있는 애를 49 00:03:16.050 --> 00:03:17.386 우리는 벡터라고 얘기를 해요 50 00:03:19.584 --> 00:03:22.041 이 벡터는 우리가 물리적인 어떤 51 00:03:22.041 --> 00:03:23.911 움직임을 표현하려고 할 때 52 00:03:23.911 --> 00:03:27.238 굉장히 중요하게 사용되는 요소거든요 53 00:03:27.238 --> 00:03:30.588 단순하게 어떤 역학 중심의 물체를 이동한다 54 00:03:30.588 --> 00:03:32.525 이것뿐만 아니라 55 00:03:32.525 --> 00:03:37.911 우리가 빛에서, 어떤 빛이 어떤 물체하고 와서 부딪히고 56 00:03:37.911 --> 00:03:40.611 어떤 물체하고 부딪히고 다시 반사되는 57 00:03:40.611 --> 00:03:43.000 이 모든 것들을 시뮬레이션 할 때 58 00:03:43.000 --> 00:03:46.000 이 벡터라는 애를 결과적으로 많이 사용하게 되는데 59 00:03:46.000 --> 00:03:48.150 당장 이 화면에서 보는 것처럼 60 00:03:48.150 --> 00:03:51.782 빛의 방향을 뜻하는 이 화살표 자체가 다 뭐예요? 61 00:03:51.782 --> 00:03:54.396 바로 벡터로 볼 수가 있습니다 62 00:03:54.396 --> 00:03:58.594 그래서 여기에서 벡터에 대한 내용을 잘 이해해 두시면 63 00:03:58.594 --> 00:04:01.194 실제로 이렇게 유니티를 이용해서 64 00:04:01.194 --> 00:04:03.000 게임을 만드는 이 과정에서 65 00:04:03.000 --> 00:04:08.634 가장 핵심적인 부분을 잘 이해하게 되실 거예요 66 00:04:08.634 --> 00:04:12.337 그러면 먼저 벡터의 여러 가지 특징들이 있는데요 67 00:04:14.139 --> 00:04:17.168 벡터는 기본적으로 화살표로 표현하는데 68 00:04:17.168 --> 00:04:19.426 얘는 사칙연산이 가능합니다 69 00:04:22.683 --> 00:04:24.842 사칙연산이라고 하면 우리가 아는 게 70 00:04:24.842 --> 00:04:28.970 더하기, 빼기, 곱하기, 나누기가 있죠 71 00:04:28.970 --> 00:04:31.366 그렇죠? 나누기 이렇게 있는데 72 00:04:31.366 --> 00:04:35.166 벡터에서는 이 나누기하고 곱하기 73 00:04:35.166 --> 00:04:36.673 곱하기만 사용을 하는데요 74 00:04:36.673 --> 00:04:38.594 곱하기는 두 가지로 나눠져요 75 00:04:38.594 --> 00:04:40.744 하나는 Dot Product라고 해서 76 00:04:40.744 --> 00:04:43.604 이렇게 점으로 하는 연산을 뜻하고요 77 00:04:43.604 --> 00:04:46.704 그다음에 Cross Product라고 해서 78 00:04:46.704 --> 00:04:50.614 이 형태로 사용하는 두 가지의 곱하기가 있습니다 79 00:04:50.614 --> 00:04:53.485 얘는 점이니까 Dot Product라고 하고요 80 00:04:53.485 --> 00:04:56.435 얘는 이렇게 곱하기 x 모양으로 했죠 81 00:04:56.435 --> 00:04:58.386 그래서 얘를 Cross Product라고 해요 82 00:04:58.386 --> 00:05:01.486 얘는 한국말로 내적 이렇게 얘기하고요 83 00:05:01.486 --> 00:05:05.287 얘는 외적 이렇게 얘기합니다 84 00:05:05.287 --> 00:05:08.277 여기에서 우리가 주의깊게 봐야 될 것들은 85 00:05:08.277 --> 00:05:12.000 더하기, 빼기 이 부분을 먼저 깊게 알아 두시고요 86 00:05:12.000 --> 00:05:14.118 이것들을 우리가 작업하기 위해서 87 00:05:14.118 --> 00:05:15.406 이 두 가지가 되게 중요합니다 88 00:05:15.406 --> 00:05:18.606 그리고 내적과 외적은 굉장히 89 00:05:18.606 --> 00:05:20.832 여러가지 용도로써 또 사용이 돼요 90 00:05:20.832 --> 00:05:24.982 이 내적은 두 가지의 벡터를 가지고 연산을 91 00:05:24.982 --> 00:05:26.822 곱하기 연산, 내적 연산을 하면 92 00:05:26.822 --> 00:05:29.931 하나의 숫자 값이 나오게 됩니다 93 00:05:29.931 --> 00:05:35.168 우리가 벡터를 크기와 방향으로 이루어져 있다고 했는데 94 00:05:35.168 --> 00:05:36.668 이 크기 값을 우리는 95 00:05:36.668 --> 00:05:39.861 스칼라, 혹은 스캘러 이렇게 발음하죠 96 00:05:39.861 --> 00:05:42.851 이 Scalar 값이라고 합니다 97 00:05:42.851 --> 00:05:46.701 이 두 개의 내적, 즉 크기와 방향으로 가지고 있는 98 00:05:46.701 --> 00:05:50.604 얘를, 두 개의 벡터를 내적하면 99 00:05:50.604 --> 00:05:53.535 하나의 스칼라 값이 나오게 되는 게 바로 내적이고요 100 00:05:53.535 --> 00:05:56.435 그다음에 이 Cross Product, 외적은 101 00:05:56.435 --> 00:05:59.000 두 개의 벡터를 외적을 하면 102 00:05:59.000 --> 00:06:01.550 이 두 개의 벡터의 직각인 103 00:06:01.550 --> 00:06:04.475 이런 벡터가 하나 튀어나오게 돼요 104 00:06:04.475 --> 00:06:07.574 이걸 가지고 우리는 외적이라고 합니다 105 00:06:07.574 --> 00:06:09.647 두 개의 벡터는 각각의 목적에 따라서 106 00:06:09.647 --> 00:06:12.406 굉장히 중요한 역할들로 사용이 되는데 107 00:06:12.406 --> 00:06:14.056 지금 이번에 저희가 알아볼 건 108 00:06:14.056 --> 00:06:17.000 더하기하고 빼기를 알아보도록 하겠습니다 109 00:06:17.000 --> 00:06:23.188 그러면 더하기는 어떤 용도로 사용이 되느냐가 중요하겠죠 110 00:06:23.188 --> 00:06:26.000 두 개의 벡터가 존재한다고 볼게요 111 00:06:30.663 --> 00:06:32.258 자 보시겠습니다 112 00:06:35.280 --> 00:06:36.880 여기에 A의 벡터가 있고요 113 00:06:36.880 --> 00:06:39.440 그다음에 여기에 b의 벡터가 있습니다 114 00:06:39.440 --> 00:06:41.840 A의 벡터는 단순하게 여기에다가만 놓을 수 있는게 아니라 115 00:06:41.840 --> 00:06:43.360 이 위에도 놓을 수 있어요 116 00:06:43.360 --> 00:06:47.920 이 벡터라는 애는 크기와 방향이라고 했죠? 117 00:06:47.920 --> 00:06:52.600 즉, 여기에는 위치가 포함된 형태가 아니에요 118 00:06:52.600 --> 00:06:54.950 바람이, 이 A를 바람이라고 볼게요 119 00:06:54.950 --> 00:06:58.379 바람이 이렇게 불고 있는 거예요 지금 120 00:06:58.379 --> 00:07:00.429 이렇게 바람이 이렇게 불고 있는 거예요 121 00:07:00.429 --> 00:07:03.000 바람이 딱 이 지점에서 122 00:07:03.000 --> 00:07:05.500 이 지점에서 이렇게 불진 않죠 123 00:07:05.500 --> 00:07:08.560 여러분들 창문을 열었을 때 바람은 어떻게 불어요? 124 00:07:08.560 --> 00:07:10.281 그냥 이렇게 들어오죠 바람이 125 00:07:12.093 --> 00:07:13.510 바람이 이렇게 들어와요 126 00:07:13.510 --> 00:07:16.860 제가 있으면 바람이 이렇게 들어오는 거예요 127 00:07:16.860 --> 00:07:20.880 그래서 얘 자체는 위치하고는 상관이 없어요 128 00:07:20.880 --> 00:07:25.408 그래서 여기다가 놓든 여기다 놓든 바람이니까 129 00:07:25.408 --> 00:07:27.560 이렇게 부는 거예요 바람이 분다고요 130 00:07:27.560 --> 00:07:29.860 그래서 A의 위치를 131 00:07:29.860 --> 00:07:34.748 A의 이 벡터를 여기에다가 놔도 상관없겠죠? 132 00:07:34.748 --> 00:07:38.199 그러면 우리가 키보드의 오른쪽 키를 누르고 133 00:07:38.199 --> 00:07:41.559 그다음에 위 화살표 키를 눌렀다고 칠게요 134 00:07:41.559 --> 00:07:44.477 그러면 비행기가 두 개를 동시에 눌렀을 때는 135 00:07:44.477 --> 00:07:46.199 어떻게 가야 될까요? 136 00:07:46.199 --> 00:07:47.899 마지막 그림에서처럼 137 00:07:47.899 --> 00:07:51.040 이렇게 대각선으로 가야 된다는 것들을 알 수 있겠죠? 138 00:07:51.040 --> 00:07:56.559 즉, 두 벡터의 더하기는 이렇게 끝점을 이었을 때 139 00:07:56.559 --> 00:07:58.409 두 개의 마지막 점에 대해 있는 140 00:07:58.409 --> 00:08:02.463 여기로 향하는 벡터를 구할 수가 있습니다 141 00:08:02.463 --> 00:08:05.760 벡터의 더하기는 이렇게 돼요 142 00:08:05.760 --> 00:08:08.410 그래서 우리가 이 벡터의 더하기는 143 00:08:08.410 --> 00:08:12.523 모든 힘의 합을 뜻합니다 144 00:08:14.199 --> 00:08:15.460 예를 들어 볼까요? 145 00:08:17.400 --> 00:08:19.751 우리가 공을 하나 던져 볼게요 146 00:08:19.751 --> 00:08:22.905 이렇게 공을 던져 볼게요 147 00:08:22.905 --> 00:08:25.760 이렇게 공을 슝 던져보도록 하겠습니다 148 00:08:25.760 --> 00:08:29.960 그러면 이 공은 실제로 무한대로 149 00:08:29.960 --> 00:08:32.120 이 방향으로 계속해서 날아갈까요? 150 00:08:32.120 --> 00:08:35.519 그래서 지구를 뚫고도 날아가나요? 어떻게 날아가죠? 151 00:08:35.519 --> 00:08:36.340 실제로? 152 00:08:38.419 --> 00:08:42.039 이렇게 포물선을 그리면서 날아가게 되겠죠? 153 00:08:42.039 --> 00:08:43.960 그렇죠? 결국에는 바닥에 떨어질 거 아니에요 154 00:08:43.960 --> 00:08:47.160 일반적인 경우라면 날아가서 떨어지게 될 거예요 155 00:08:47.160 --> 00:08:49.240 이 이유가 뭐죠? 156 00:08:49.240 --> 00:08:51.320 바로 중력이 작용하니까요 157 00:08:51.320 --> 00:08:53.880 중력은 어떻게 작용하죠? 158 00:08:53.880 --> 00:08:55.360 이렇게 아래쪽으로 159 00:08:55.360 --> 00:08:57.810 즉, 두 개의 화살표를 더해 보면 160 00:08:57.810 --> 00:09:00.800 이렇게 되는 것을 볼 수가 있어요 161 00:09:00.800 --> 00:09:02.833 바로 이렇게 되는 게 아니라, 얘는 어때요? 162 00:09:02.833 --> 00:09:06.679 중력이 점차 나의 힘에 영향을 줘서, 어떻게 돼요? 163 00:09:06.679 --> 00:09:09.429 얘가 뚝뚝뚝뚝뚝뚝 가면서 이렇게 164 00:09:09.429 --> 00:09:12.199 포물선 운동을 하게 되는 경우죠 165 00:09:12.199 --> 00:09:16.712 그래서 벡터는 더하기를 이용했을 때 166 00:09:16.712 --> 00:09:20.000 모든 힘의 합을 표현할 수가 있어요 167 00:09:20.000 --> 00:09:22.679 만약에 바람이 역으로 쓱 불었어요 이렇게 168 00:09:22.679 --> 00:09:24.479 그리고 중력도 작용하고 있어요 169 00:09:24.479 --> 00:09:28.929 얘네들을 다 더하면 이 바람의 힘이 굉장히 쎘을 때 170 00:09:28.929 --> 00:09:31.679 공은 어떻게 날아갈 것 같아요? 171 00:09:31.679 --> 00:09:34.029 이렇게 슝 날아가다가 바람 때문에 다시 172 00:09:34.029 --> 00:09:37.355 이렇게 해서 다시 돌아가는 이런 느낌 173 00:09:37.355 --> 00:09:40.004 그렇죠? 이렇게 들어가는 느낌으로 연출이 될 수 있겠죠 174 00:09:42.360 --> 00:09:46.510 그러니까 바람은 이쪽 힘이고 175 00:09:46.510 --> 00:09:47.960 우리가 던진 힘은 이쪽이고 176 00:09:47.960 --> 00:09:50.110 아래로 떨어지는 중력의 힘 177 00:09:50.110 --> 00:09:54.960 얘네들을 다 더했을 때 최종 물체의 위치가 정해집니다 178 00:09:54.960 --> 00:09:58.455 바로 이 벡터가 정해지게 되는 거예요 179 00:09:58.455 --> 00:10:01.005 더하기는 이런 목적으로 사용이 된다는 거 180 00:10:01.005 --> 00:10:02.240 알아두시면 좋을 것 같고요 181 00:10:02.240 --> 00:10:06.479 대표적으로 야구 게임, 골프 이런 것들이 있잖아요 182 00:10:06.479 --> 00:10:09.529 그 다음 당구, 이 모든 것들은 183 00:10:09.529 --> 00:10:11.633 이 벡터에 더하기를 사용한다고 보시면 되겠어요 184 00:10:14.138 --> 00:10:16.309 빼기는 그러면 어떻게 사용을 할까요? 185 00:10:19.558 --> 00:10:23.726 빼기는, 결국에는 빼기도 더하기에 해당이 되겠죠? 186 00:10:27.418 --> 00:10:32.680 빼기도 A가 있으면 이렇게 해서 할 수가 있는 거잖아요 187 00:10:32.680 --> 00:10:34.639 그러니까 빼기도 결국엔 더하기가 되지만 188 00:10:34.639 --> 00:10:35.889 우리가 사용 목적에 따라서 189 00:10:35.889 --> 00:10:38.000 좀 달라진다고 볼 수가 있겠어요 190 00:10:38.000 --> 00:10:40.600 A벡터가 이렇게 있고요, B벡터가 있어요 191 00:10:40.600 --> 00:10:43.759 A를 빼 볼게요 192 00:10:43.759 --> 00:10:46.040 그러면 신기하게 어떻게 되어있어요? 193 00:10:46.040 --> 00:10:51.399 A에다가 빼기를 붙이면 벡터의 방향이 뒤집혀지죠 194 00:10:51.399 --> 00:10:53.549 즉 여기서 알 수 있는 것 195 00:10:53.549 --> 00:10:57.200 음수, 마이너스가 곱해지잖아요? 196 00:10:57.200 --> 00:10:59.160 -1이 곱해지면 어떻게 되느냐? 197 00:10:59.160 --> 00:11:01.660 바로 벡터의 방향을 바꿀 수 있다는 것 198 00:11:01.660 --> 00:11:03.279 아실 수 있겠죠? 199 00:11:03.279 --> 00:11:05.986 그러면 A의 벡터가 이쪽을 가리키고 있고 200 00:11:05.986 --> 00:11:07.720 B의 벡터가 이렇게 가리키고 있어요 201 00:11:07.720 --> 00:11:09.870 그러면 앞에, 위에 더하기에서처럼 202 00:11:09.870 --> 00:11:12.612 어떻게 될 수 있어요? 벡터는 마지막에? 203 00:11:12.612 --> 00:11:15.600 최종 벡터는 이렇게 될 수 있죠 204 00:11:15.600 --> 00:11:21.650 즉 B - A는 어떻게 구해지느냐? 205 00:11:21.650 --> 00:11:23.279 이렇게 구해진다는 거예요 206 00:11:23.279 --> 00:11:25.760 이런 거는 그러면 어떻게 알 수 있어요? 207 00:11:25.760 --> 00:11:31.200 즉 A가 마치 B로 가고 싶은 거죠 208 00:11:31.200 --> 00:11:35.200 그래서 벡터의 빼기는 이렇게 볼 수가 있습니다 209 00:11:35.200 --> 00:11:37.040 어떤 식으로 활용이 되느냐? 210 00:11:37.040 --> 00:11:42.262 여기에 내가 있고요, 이쪽에 타겟이 있습니다 211 00:11:44.559 --> 00:11:50.152 그래서 내가 타겟 방향으로 이렇게 가고 싶어요 212 00:11:50.152 --> 00:11:52.281 타겟 방향으로 이렇게 가고 싶어요 213 00:11:52.281 --> 00:11:57.200 그럼 이 벡터를 우리가 구하려는 게 우리의 목적이에요 214 00:11:57.200 --> 00:12:00.480 이때 어떻게 하냐면, 내가 어디로 가고 싶다고요? 215 00:12:00.480 --> 00:12:02.397 타겟 방향으로 가고 싶다고요 216 00:12:05.040 --> 00:12:07.391 이 벡터를 우리가 방향이라고 놓을게요 217 00:12:10.480 --> 00:12:14.079 그러면 이 Direction, 이 벡터는 어떻게 구하냐면 218 00:12:14.079 --> 00:12:16.979 바로 Target - Me 219 00:12:16.979 --> 00:12:19.429 이렇게 해서 내가 타겟으로 가고 싶을 때는 220 00:12:19.429 --> 00:12:20.959 이렇게 구하시면 됩니다 221 00:12:20.959 --> 00:12:23.159 Target - Me 하면 222 00:12:23.159 --> 00:12:26.509 나에서 타겟으로 향하는, 목적지로 향하는 223 00:12:26.509 --> 00:12:27.790 벡터를 구할 수 있다는 얘기에요 224 00:12:29.686 --> 00:12:31.920 됐죠? 이렇게 구할 수가 있습니다 225 00:12:31.920 --> 00:12:34.320 여기서 한 가지만 더 알아볼까요? 226 00:12:34.320 --> 00:12:36.799 얘를 제가 그래프로 한번 그려볼게요 227 00:12:36.799 --> 00:12:40.299 자 이렇게 이렇게 228 00:12:40.299 --> 00:12:42.799 직교좌표계로 이렇게 놓도록 하겠습니다 229 00:12:42.799 --> 00:12:45.043 여기 X축이 있죠? 여기 Y축이 있습니다 230 00:12:46.360 --> 00:12:49.519 그렇죠? 이렇게 되어 있어요 231 00:12:49.519 --> 00:12:53.027 보기 편하게 이쪽으로 좀 옮겨 놓을까요? 232 00:12:55.839 --> 00:12:59.839 그러면, 보시면 233 00:12:59.839 --> 00:13:05.359 내가 여기에 있고, 타겟이 이 지점에 있어요 234 00:13:05.359 --> 00:13:09.440 두 개를 위치를 이렇게 보시면 어때요? 235 00:13:09.440 --> 00:13:14.190 여기에서 이만큼까지, 여기까지 236 00:13:14.190 --> 00:13:16.640 x1이라고 놓도록 하죠 237 00:13:16.640 --> 00:13:20.239 여기는 x고, 여기는 x1이라고 놓을게요 238 00:13:20.239 --> 00:13:23.389 그러면 이만큼은 239 00:13:23.389 --> 00:13:27.119 이 지점, 여기는 Y1이라고 놓도록 하죠 240 00:13:27.119 --> 00:13:31.519 즉 이 벡터를 나한테 만약에 더해줬다고 칠게요 241 00:13:31.519 --> 00:13:33.869 나의 위치가 만약 이 지점이라면 242 00:13:33.869 --> 00:13:35.919 나의 위치에다가 이 벡터를 더해주면 243 00:13:35.919 --> 00:13:38.720 나는 최종적으로 어느 위치에 가있다고요? 244 00:13:38.720 --> 00:13:41.200 타겟 위치에 가있다고 245 00:13:41.200 --> 00:13:43.983 그럼 내가 여기 서있는데 246 00:13:43.983 --> 00:13:49.433 이 서 있는 캐릭터가 저쪽으로 이동했을 때 247 00:13:49.433 --> 00:13:50.640 이 벡터를 그냥 더해버리면 248 00:13:50.640 --> 00:13:53.839 얘는 순간이동처럼 움직이게 되겠죠? 249 00:13:53.839 --> 00:13:56.559 이것은 저희가 원하는 형태의 움직임이 아닐 거예요 250 00:13:56.559 --> 00:13:58.000 저희는 어떻게 하고 싶어요? 251 00:13:58.000 --> 00:14:02.399 이렇게 내가 가진 속도대로 이렇게 가고 싶은 거예요 252 00:14:02.399 --> 00:14:04.320 그쪽 방향으로 253 00:14:04.320 --> 00:14:08.216 그러면 이 벡터가 254 00:14:08.216 --> 00:14:11.279 크기와 방향으로 이루어져 있다고 말씀드렸잖아요 255 00:14:11.279 --> 00:14:13.929 그러면 이 크기 부분이 필요한 게 아니라 256 00:14:13.929 --> 00:14:18.160 저는 단순하게 이쪽 방향만 있으면 257 00:14:18.160 --> 00:14:20.210 이 방향으로 이 캐릭터를 258 00:14:20.210 --> 00:14:24.559 단순하게 이동시키기만 할 거잖아요 이 방향으로 259 00:14:24.559 --> 00:14:26.799 그러면, 자 보세요 260 00:14:26.799 --> 00:14:32.160 크기와 방향으로 이루어져 있다고 했죠 261 00:14:32.160 --> 00:14:34.720 제가 여기에 곱하기를 써놨습니다 262 00:14:34.720 --> 00:14:37.760 그때 나는 방향만 필요해요 263 00:14:37.760 --> 00:14:41.200 그래서 나의 이동 속도가 있을 거 아니에요? 264 00:14:41.200 --> 00:14:43.839 나의 속도를 여기다 곱해 볼게요 265 00:14:43.839 --> 00:14:46.539 그랬을 때 이 벡터의 크기가 266 00:14:46.539 --> 00:14:49.426 단순하게 어떻게? 이렇게 되는 게 아니라 267 00:14:52.000 --> 00:14:53.559 이렇게 됐으면 좋겠죠 268 00:14:53.559 --> 00:14:57.720 그래서 나의 속도로 이만큼씩 이동했으면 좋겠는 거예요 269 00:14:57.720 --> 00:15:02.370 그러면 우리가 벡터의 빼기를 이용해서 나온 이 벡터가 270 00:15:02.370 --> 00:15:04.689 몇이 되면 나의 속도 271 00:15:04.689 --> 00:15:07.479 여기 나예요 272 00:15:07.479 --> 00:15:09.779 나의 속도와 방향만 남게 될까요? 273 00:15:09.779 --> 00:15:11.512 이 크기가 몇이 되면? 274 00:15:11.512 --> 00:15:13.880 바로 1이면 되겠죠 275 00:15:13.880 --> 00:15:18.120 그래서 이 Target - Me에서 나온 얘네를 276 00:15:18.120 --> 00:15:20.748 이 벡터의 크기를, 이 디렉션의 크기를 277 00:15:20.748 --> 00:15:23.098 1로 만들어주는 이 행위를 우리는 278 00:15:23.098 --> 00:15:26.960 벡터의 정규화라고 하고요 279 00:15:26.960 --> 00:15:30.325 정규화라고 하고, 영어로는 Normalize라고 합니다 280 00:15:31.870 --> 00:15:34.119 이렇게 얘기하는 거예요 281 00:15:34.119 --> 00:15:37.969 얘는 바로 내가 벡터의 빼기를 이용해서 구한 282 00:15:37.969 --> 00:15:39.559 이 벡터를 가지고 283 00:15:39.559 --> 00:15:42.039 나의 속도로 이동하고 싶을 때 하는 행동 284 00:15:42.039 --> 00:15:45.280 이때 벡터의 정규화 이렇게 사용합니다 285 00:15:45.280 --> 00:15:50.159 그러면 여러분들이 게임을 만들 거예요 286 00:15:50.159 --> 00:15:52.679 MMORPG 게임 같은 걸 한다고 치죠 287 00:15:52.679 --> 00:15:57.280 마우스 포인터로 이쪽을 클릭했습니다 288 00:15:57.280 --> 00:15:59.320 이렇게 이쪽을 클릭했어요 289 00:15:59.320 --> 00:16:01.970 그럼 캐릭터가 이쪽에 서 있다가 290 00:16:01.970 --> 00:16:03.599 이 방향으로 이동해야겠죠 291 00:16:03.599 --> 00:16:06.239 그러면 어떻게 하면 돼요? 292 00:16:06.239 --> 00:16:11.080 나의 위치, 마우스가 클릭한 타겟의 위치가 구해지겠죠 293 00:16:11.080 --> 00:16:15.119 바로 Target - Me 하면 이 벡터가 구해지게 될 거예요 294 00:16:15.119 --> 00:16:18.280 그럼 내가 어떻게? 이 방향으로 이동하겠죠 295 00:16:18.280 --> 00:16:20.039 MMORPG 같은 거에서 296 00:16:20.039 --> 00:16:21.828 그러면 이 벡터를 그대로 더해주는 게 아니라 297 00:16:21.828 --> 00:16:24.531 어떻게 된다고요? 얘를 Normalize해서 298 00:16:24.531 --> 00:16:27.239 이런 벡터로 만들어 줘야 돼요 299 00:16:27.239 --> 00:16:30.320 즉 이렇게 정규화된 벡터로 만들어 줘서 300 00:16:30.320 --> 00:16:32.970 그 방향으로 이동을 하면 301 00:16:32.970 --> 00:16:34.719 나의 속도로 이동할 수 있게 됩니다 302 00:16:34.719 --> 00:16:36.960 이걸 Normalize라고 하는 거예요 303 00:16:36.960 --> 00:16:39.060 그래서 벡터는 크게 304 00:16:39.060 --> 00:16:42.760 더하기, 빼기, 내적, 외적이 있다고 했는데 305 00:16:42.760 --> 00:16:45.410 이번에 저희가 알아본 건 더하기하고 306 00:16:45.410 --> 00:16:48.520 빼기까지만 알아봤습니다 307 00:16:48.520 --> 00:16:56.559 자 그러면 앞에서 했었던 이 문장에서 308 00:16:56.559 --> 00:16:59.359 플레이어가 오른쪽으로 가는 이 부분에서 309 00:16:59.359 --> 00:17:01.280 여기 Right라고 되어 있는 부분 있잖아요? 310 00:17:01.280 --> 00:17:02.930 바로 얘는 벡터니까 311 00:17:02.930 --> 00:17:05.644 벡터의 오른쪽이라는 방향을 갖고 있는 거예요 312 00:17:08.080 --> 00:17:11.520 크기는 몇일까요? 1인 거예요 313 00:17:11.520 --> 00:17:14.159 뒤에 있는 5는 뭘까요? 314 00:17:14.159 --> 00:17:16.599 바로 나의 이동 속도가 되겠죠 315 00:17:16.599 --> 00:17:19.149 뒤에 있는 애는, 뒤에서 다시 한번 얘기하겠지만 316 00:17:19.149 --> 00:17:23.520 등속운동에서 사용하게 되는 시간일 뿐이에요 317 00:17:23.520 --> 00:17:25.479 등속운동에서 사용하는 시간 318 00:17:25.479 --> 00:17:26.520 그러면 어때요? 319 00:17:26.520 --> 00:17:31.280 이만큼이 바로 내가 만들어낸 벡터라는 얘기겠죠 320 00:17:31.280 --> 00:17:33.931 그리고 뒤에 있는 것은 시간이 곱해진 거예요 321 00:17:33.931 --> 00:17:37.911 등속운동 공식 이해 및 플레이어 이동 제작 322 00:17:38.919 --> 00:17:42.219 그러면 다음으로 등속운동 공식에 대해서 323 00:17:42.219 --> 00:17:45.039 한번 알아보도록 하겠습니다 324 00:17:45.039 --> 00:17:50.400 보시면 여기에 앞단에 먼저 325 00:17:50.400 --> 00:17:54.000 뉴턴의 운동역학에 대한 내용이에요 326 00:17:54.000 --> 00:17:58.280 이 첫번째 부분이 P = P0 + vt 327 00:17:58.280 --> 00:18:00.799 v = v0 + at 328 00:18:00.799 --> 00:18:03.320 세번째가 F = ma 329 00:18:03.320 --> 00:18:04.440 이렇게 되어있죠 330 00:18:04.440 --> 00:18:06.479 마지막에 있는 F = ma 331 00:18:06.479 --> 00:18:09.840 여러분들의 DNA에 아마 박혀 있을 거예요 332 00:18:09.840 --> 00:18:11.039 F는? 하면 어떻게? 333 00:18:11.039 --> 00:18:14.430 여러분들이 어디에 쓰이는지 모르겠지만, ma? 334 00:18:14.430 --> 00:18:18.400 이렇게 나오게 되는 부분이 바로 F = ma 부분이에요 335 00:18:18.400 --> 00:18:21.400 그래서 어떤 물체가 역학적으로 336 00:18:21.400 --> 00:18:24.661 운동역학에 의해서 이동하거나 이렇게 될 때 337 00:18:24.661 --> 00:18:28.039 이 세가지의 공식들을 이용하는 거예요 338 00:18:28.039 --> 00:18:30.919 그래서 유니티에 탑재되어 있는 내부 안에서의 물리엔진도 339 00:18:30.919 --> 00:18:32.669 바로 이 부분의 공식을 이용해서 340 00:18:32.669 --> 00:18:37.440 물체들이 이동하는 부분이 구현되어 있습니다 341 00:18:37.440 --> 00:18:40.400 이 중에서 첫번째가 바로 등속운동 공식이고요 342 00:18:40.400 --> 00:18:43.559 여기에 사람이 하나 있다고 칠게요 343 00:18:43.559 --> 00:18:47.400 뒤에서 여러분들이 밀었어요 344 00:18:47.400 --> 00:18:50.799 쿵 하고 밀었습니다, 푹 하고 밀었어요 345 00:18:50.799 --> 00:18:54.760 그러면 이때 이 사람은 어떻게 될까요? 346 00:18:54.760 --> 00:18:56.760 이 사람이 여기 있을 때 뒤에서 탕 밀으면 347 00:18:56.760 --> 00:19:02.520 얘는 이쪽으로 이렇게 밀려나겠죠 348 00:19:02.520 --> 00:19:03.840 뭐 당연한 거죠 349 00:19:03.840 --> 00:19:06.760 이때 이렇게 물체가 이동하는 이 형태가 350 00:19:06.760 --> 00:19:10.119 바로 이 공식에 의해서 만들어지는 거예요 351 00:19:10.119 --> 00:19:16.559 먼저 이 사람이 가만히 있었던 현재의 위치를 352 00:19:16.559 --> 00:19:18.239 P0이라고 넣도록 할게요 353 00:19:18.239 --> 00:19:19.080 현재 위치에요 354 00:19:19.080 --> 00:19:20.440 포지션 355 00:19:20.440 --> 00:19:23.520 그다음에 얘가 미래의 나의 위치입니다 356 00:19:23.520 --> 00:19:27.443 얘를 P라고 놓도록 할게요 357 00:19:27.443 --> 00:19:29.095 그다음에 이 가운데 358 00:19:29.095 --> 00:19:31.520 사용자가 뒤에서 밀었을 때 발생한 이 방향이 있죠 359 00:19:31.520 --> 00:19:32.960 얘를 화살표가 나왔죠 360 00:19:32.960 --> 00:19:34.400 이걸 우리가 뭐라고 한다고요? 361 00:19:34.400 --> 00:19:35.320 벡터라고 한다고요 362 00:19:35.320 --> 00:19:38.359 이거는 속도, Velocity의 V라고 넣도록 할게요 363 00:19:38.359 --> 00:19:39.919 Velocity, V 364 00:19:39.919 --> 00:19:42.640 얘는 벡터 365 00:19:42.640 --> 00:19:45.754 그러면 이 사람이 순간 이동하는 게 아니라 366 00:19:45.754 --> 00:19:50.152 시간에 따라서 점점 이동을 해서 이렇게 가겠죠 367 00:19:50.152 --> 00:19:52.840 그래서 뒤에 T가 붙어 있어요 368 00:19:52.840 --> 00:19:57.719 그래서 이들은 시간에 따라서 이동하게 되어 있어요 369 00:19:57.719 --> 00:20:00.799 그러면 이거를 다시 한번 보도록 할게요 370 00:20:00.799 --> 00:20:04.000 뒤에서 쿵 밀었습니다 371 00:20:04.000 --> 00:20:04.760 밀었죠? 372 00:20:04.760 --> 00:20:08.589 얘를 밀면 힘이 작용을 합니다 373 00:20:08.589 --> 00:20:10.479 힘이 작용을 해요 374 00:20:10.479 --> 00:20:12.719 앞에 있는 얘는 등속 운동이라고 하고요 375 00:20:12.719 --> 00:20:14.880 뒤에 있는 얘는 등가속 운동이라고 하고 376 00:20:14.880 --> 00:20:15.799 밑에 있는 거 377 00:20:15.799 --> 00:20:18.719 마지막으로 이렇게 힘은 F = ma 378 00:20:18.719 --> 00:20:20.960 이거까지 들어가는 거예요 379 00:20:20.960 --> 00:20:24.559 자 여기에 있는 A가 뭐냐면 380 00:20:24.559 --> 00:20:27.919 이 부위는 현재 위치에 영향을 주게 되는 381 00:20:27.919 --> 00:20:28.760 바로 속도고요 382 00:20:28.760 --> 00:20:32.200 Velocity, 속도고요 383 00:20:32.200 --> 00:20:35.594 a는 속도에 영향을 주는 가속도라고 해요 384 00:20:39.039 --> 00:20:39.679 됐죠? 385 00:20:39.679 --> 00:20:41.119 여기 있는 m은 질량이에요 386 00:20:41.119 --> 00:20:43.719 물체의 질량 387 00:20:43.719 --> 00:20:49.799 즉 질량을 여기서 1이라고 넣도록 합시다 388 00:20:49.799 --> 00:20:52.359 그러면 F는 곧 뭐가 되죠? 389 00:20:52.359 --> 00:20:54.539 a가 되죠? 390 00:20:54.539 --> 00:20:57.080 뒤에서 제가 힘을 줘서 밀었어요 391 00:20:57.080 --> 00:20:58.919 그러면 뭐가 발생해요? 392 00:20:58.919 --> 00:21:01.435 a가 만들어지죠 393 00:21:01.435 --> 00:21:02.799 a가 만들어져요 394 00:21:02.799 --> 00:21:05.280 a는 어디에다 영향을 주죠? 395 00:21:05.280 --> 00:21:08.039 현재 속도에 더해져서 396 00:21:08.039 --> 00:21:10.679 v0도 현재 속도예요 397 00:21:10.679 --> 00:21:15.323 v0, 현재 속도에 영향을 줘서 새로운 속도를 만들어내죠 398 00:21:17.679 --> 00:21:19.440 새로운 속도가 만들어지고 399 00:21:19.440 --> 00:21:21.799 자 v가 변했어요 400 00:21:21.799 --> 00:21:23.599 이 부위가 만들어졌죠 401 00:21:23.599 --> 00:21:26.730 그러면 v는 어디에 영향을 주죠 보니까? 402 00:21:26.730 --> 00:21:29.080 현재의 위치에 더해져서 403 00:21:29.080 --> 00:21:31.559 미래의 위치에 변화를 주네요 404 00:21:31.559 --> 00:21:35.885 그래서 뒤에서 이렇게 밀면 힘이 생기고요 405 00:21:35.885 --> 00:21:39.119 힘은 곧 가속도가 만들어진다는 얘기에요 406 00:21:39.119 --> 00:21:43.440 그러면 이 부위에 영향을 줘서 새로운 v가 만들어지고요 407 00:21:43.440 --> 00:21:47.320 그러면 플레이어 P0가 P로 이동하게 되는 408 00:21:47.320 --> 00:21:49.119 변하게 되는 이 구조를 만들어내는 게 409 00:21:49.119 --> 00:21:53.310 바로 등속운동 공식이라고 볼 수 있겠습니다 410 00:21:53.310 --> 00:21:57.359 그러면 우리가 만들어내는 모든 게임 411 00:21:57.359 --> 00:21:59.400 혹은 어떤 실감 콘텐츠 412 00:21:59.400 --> 00:22:01.960 이런 모든 것들은 다 뭐예요? 413 00:22:01.960 --> 00:22:04.119 가상 공간에서 일어나는 거죠 414 00:22:04.119 --> 00:22:06.559 가상 공간에서 우리가 시뮬레이션 하는 거예요 415 00:22:06.559 --> 00:22:08.919 그렇게 하기 위해서는 바로 이 역학 416 00:22:08.919 --> 00:22:13.239 운동역학에 대한 부분을 이해할 수밖에 없어요, 왜? 417 00:22:13.239 --> 00:22:15.487 게임도 결국에는 이 역학 쪽을 418 00:22:15.487 --> 00:22:18.840 현실하고 똑같이, 비슷하게 만들어내는 거잖아요 419 00:22:18.840 --> 00:22:21.440 그래서 이 운동역학을 우리가 가져다가 420 00:22:21.440 --> 00:22:23.000 게임에서 사용을 해야 됩니다 421 00:22:23.000 --> 00:22:24.960 거기에서 중요한 게 앞에서 배운 422 00:22:24.960 --> 00:22:27.960 바로 벡터라는 부분이에요 423 00:22:27.960 --> 00:22:31.050 그러면 여기서 조금 더 내용을 보면 424 00:22:34.030 --> 00:22:36.719 여기에서 보이는 P0은 425 00:22:36.719 --> 00:22:40.191 어느 플레이어의 단순한 위치일 뿐입니다 426 00:22:40.191 --> 00:22:43.039 위치고요 427 00:22:43.039 --> 00:22:44.679 P도 위치일 뿐이죠 428 00:22:44.679 --> 00:22:48.119 여기에서 t는 스칼라 값, 시간이에요 429 00:22:48.119 --> 00:22:51.680 여기에서 v는 바로 이 화살표를 뜻하죠 430 00:22:51.680 --> 00:22:54.359 그래서 머리에다가 이렇게 431 00:22:54.359 --> 00:22:58.960 벡터를 그려주는 거예요, 화살표를 이렇게 432 00:22:58.960 --> 00:23:00.039 얘는 뭐라고요? 433 00:23:00.039 --> 00:23:02.080 화살표, 벡터라는 표시에요 434 00:23:02.080 --> 00:23:05.640 a도 바로 가속도, 중력 가속도라고 하죠 435 00:23:05.640 --> 00:23:07.200 아래로 화살표가 작용하는 436 00:23:07.200 --> 00:23:09.880 그래서 얘도 화살표 437 00:23:09.880 --> 00:23:12.880 F도 화살표, a도 화살표 438 00:23:12.880 --> 00:23:14.760 여기 있는 m은 질량이라서 숫자 1뿐이에요 439 00:23:14.760 --> 00:23:16.359 스칼라 값 440 00:23:16.359 --> 00:23:18.200 이렇게 표시할 수가 있겠습니다 441 00:23:18.200 --> 00:23:20.679 이게 등속 운동 공식이에요 442 00:23:20.679 --> 00:23:23.829 이걸 이용해서 우리 플레이어의 이동이 443 00:23:23.829 --> 00:23:26.919 만들어지게 되겠습니다 444 00:23:26.919 --> 00:23:28.760 그러면 이것을 이용해서 445 00:23:28.760 --> 00:23:33.280 플레이어의 이동을 제작해 보도록 할게요 446 00:23:33.280 --> 00:23:34.680 코드에서 보시면 447 00:23:34.680 --> 00:23:37.520 이 부분 자체가 448 00:23:37.520 --> 00:23:40.959 이만큼, 이 부분에 있는 이만큼이 449 00:23:40.959 --> 00:23:44.079 바로 v가 되는 거예요 450 00:23:44.079 --> 00:23:46.280 왜? P는 뭐라고요? 451 00:23:46.280 --> 00:23:49.040 P0 + vt 라고요 452 00:23:49.040 --> 00:23:51.440 여기에서 얘가 이렇게 벡터 453 00:23:51.440 --> 00:23:57.119 그러면 v는 크기와 방향을 가지고 있는 벡터죠 454 00:23:57.119 --> 00:24:01.560 그래서 V는 방향 × 크기 해서 v가 만들어진 거예요 455 00:24:01.560 --> 00:24:05.959 여기 뒤에 있는 t는 바로 deltaTime이라고 얘기하는 거예요 456 00:24:05.959 --> 00:24:07.959 앞에서 이 tranform.Translate 457 00:24:07.959 --> 00:24:11.959 얘는 내부적으로 이 공식을 구현해 주는 게 458 00:24:11.959 --> 00:24:15.927 바로 이 트랜슬레이트의 내부 함수의 기능이겠죠 459 00:24:18.719 --> 00:24:21.319 그럼 여기 뒤에 있는 이 deltaTime은 460 00:24:21.319 --> 00:24:23.359 바로 t를 뜻한다고 되어있는데 461 00:24:23.359 --> 00:24:26.880 그럼 이 델타타임은 어떤 시간인가 462 00:24:26.880 --> 00:24:28.421 를 잠깐 알아보도록 하겠습니다 463 00:24:31.599 --> 00:24:35.119 델타타임에 대해서 조금 더 알아보도록 할게요 464 00:24:35.119 --> 00:24:37.880 보시면 이 앞의 것과 465 00:24:37.880 --> 00:24:39.959 그다음에 아래에 있는 얘네를 보면 466 00:24:39.959 --> 00:24:43.079 얘는 새로운 PC 입니다 467 00:24:43.079 --> 00:24:44.920 새로운 컴퓨터를 열어보면서 새로 산 거예요 468 00:24:44.920 --> 00:24:47.160 아주 최신 그래픽 사양과 469 00:24:47.160 --> 00:24:49.119 메모리와 하드디스크 이 모든 것들을 470 00:24:49.119 --> 00:24:51.359 빵빵하게 해서 샀어요 471 00:24:51.359 --> 00:24:53.119 여기 밑에 있는 거는 472 00:24:53.119 --> 00:24:56.680 옛날 한 5년 정도 된 PC 라고 볼 수가 있습니다 473 00:24:56.680 --> 00:24:59.119 사용이 그때는 나쁘지 않았었는데 474 00:24:59.119 --> 00:25:03.479 5년 정도 지나니까 아주 느려졌어요 475 00:25:03.479 --> 00:25:06.880 위에 있는 이 점선 이 그래프 있잖아요 476 00:25:06.880 --> 00:25:08.719 이 그래프는 뭐냐면 477 00:25:08.719 --> 00:25:12.839 이거는 새로운 PC가 1초 동안에 수행할 수 있는 478 00:25:12.839 --> 00:25:13.880 횟수인 거예요 479 00:25:13.880 --> 00:25:18.680 그래서 여기가 1초라고 보고요 480 00:25:18.680 --> 00:25:22.160 새로운 PC는 1초 동안에 어떻게 수행을 할 수 있느냐 481 00:25:22.160 --> 00:25:24.160 이 물체가 이동한다고 봤을 때 482 00:25:24.160 --> 00:25:28.239 얘는 총 하나, 둘, 셋, 네 번을 이동할 수가 있어요 483 00:25:28.239 --> 00:25:30.928 4칸을 수행할 수 있다는 거예요, 1초 동안에 484 00:25:30.928 --> 00:25:34.599 밑에는 두 번을 수행할 수가 있죠 485 00:25:34.599 --> 00:25:35.319 이해 되셨나요? 486 00:25:35.319 --> 00:25:37.479 이렇게 두 번을 수행할 수 있고 487 00:25:37.479 --> 00:25:41.160 이때 이 캐릭터가 한 번 움직일 때마다 488 00:25:41.160 --> 00:25:44.119 1m씩 이동이 가능하다고 보시죠 489 00:25:44.119 --> 00:25:46.886 그러면 위에 있는 새로운 PC는 490 00:25:46.886 --> 00:25:48.319 네 번을 이동하니까 491 00:25:48.319 --> 00:25:50.160 한 번 이동할 때마다 1m 492 00:25:50.160 --> 00:25:54.719 즉 1초 후에는 얘는 첫 번째 새로운 PC에서는 493 00:25:54.719 --> 00:25:56.599 몇 m를 이동할 수 있죠? 494 00:25:56.599 --> 00:25:59.040 4m, 그렇죠? 495 00:25:59.040 --> 00:26:02.040 그럼 이 아래에 있는 옛날 5년 된 PC는 496 00:26:02.040 --> 00:26:03.280 두 번을 움직일 수 있죠 497 00:26:03.280 --> 00:26:05.040 얘도 마찬가지로 한 번 움직일 때마다 498 00:26:05.040 --> 00:26:07.439 똑같이 1m 움직일 수 있는 거예요 499 00:26:07.439 --> 00:26:12.479 그러면 얘는 총 1초 후에는 2m 움직이겠네요 500 00:26:12.479 --> 00:26:15.680 이렇게 되면 어때요? 501 00:26:15.680 --> 00:26:18.640 얘는 새로운 PC니까 1초에 4m씩 이동할 수 있고 502 00:26:18.640 --> 00:26:20.839 얘는 2m씩 이동할 수 있고 503 00:26:20.839 --> 00:26:22.880 여러분들이 게임을 할 때 504 00:26:22.880 --> 00:26:25.959 위에 있는 PC는 정말 빠르게 이동해서 505 00:26:25.959 --> 00:26:27.119 움직일 수 있어요 506 00:26:27.119 --> 00:26:29.880 즉 5년 된 PC와 새로운 PC가 게임을 하면 507 00:26:29.880 --> 00:26:33.479 첫 번째, 새로운 PC가 무조건 이기게 되는 구조죠 508 00:26:33.479 --> 00:26:35.359 이러면 너무 불공평해서 509 00:26:35.359 --> 00:26:38.119 사용자들이 게임을 안 하게 될 거예요 510 00:26:38.119 --> 00:26:42.770 우수수 사용자들이 빠져나가는 소리가 들리시나요 511 00:26:42.770 --> 00:26:45.520 이렇게 하면 공평하지 않기 때문에 512 00:26:45.520 --> 00:26:47.880 룰이 너무 불공정해요 513 00:26:47.880 --> 00:26:50.560 그래서 어떻게 하면 이들을 1초 후에 514 00:26:50.560 --> 00:26:53.880 같은 위치에 도착할 수 있게끔 맞춰 줄까 515 00:26:53.880 --> 00:26:56.400 이게 굉장히 중요한 포인트라고 볼 수 있겠습니다 516 00:26:56.400 --> 00:26:58.280 그러면 4m, 2m가 아니라 517 00:26:58.280 --> 00:27:02.640 어떻게 1초 후에 같은 속도로 이동을 해서 518 00:27:02.640 --> 00:27:04.880 최종 같은 목적지에 도착하게 할까 519 00:27:04.880 --> 00:27:07.731 이 부분이 바로 Delta Time의 핵심이에요 520 00:27:09.810 --> 00:27:11.839 이 앞에 Delta라고 붙은 거 있죠 521 00:27:11.839 --> 00:27:15.160 이 델타는 변위한 거예요, 변한 거예요 522 00:27:15.160 --> 00:27:16.920 변위 시간이란 얘기에요 523 00:27:16.920 --> 00:27:19.079 뭐가 변한 거냐? 시간이 변했다는 얘기죠 524 00:27:19.079 --> 00:27:20.199 어떻게 변한 거냐 525 00:27:20.199 --> 00:27:24.119 바로 여기에서 첫째 프레임에서 526 00:27:24.119 --> 00:27:25.920 이 프레임이 끝나는 동안 527 00:27:25.920 --> 00:27:29.079 이때 델타, 얼마큼 걸렸니? 528 00:27:29.079 --> 00:27:32.359 이게 바로 델타타임이라고 보시면 되겠어요 529 00:27:32.359 --> 00:27:35.079 보시면 전체가 1초라고 보면 530 00:27:35.079 --> 00:27:36.520 총 4번을 수행할 때 531 00:27:36.520 --> 00:27:38.920 각각의 프레임 간, 이 한 칸, 한 칸들을 532 00:27:38.920 --> 00:27:41.959 우리가 프레임이라고 얘기합니다 533 00:27:41.959 --> 00:27:44.880 여러분들이 어렸을 때 이런 장난 해보셨나요? 534 00:27:44.880 --> 00:27:47.280 책이 이렇게 있어요 535 00:27:47.280 --> 00:27:50.683 책이 있으면 여기다가 그림을 하나 그리는 거예요 536 00:27:50.683 --> 00:27:53.239 뒤에다가도 어떻게? 537 00:27:53.239 --> 00:27:55.959 뒤에다가도 이런 그림을 그리는 거예요 538 00:27:55.959 --> 00:27:57.880 달리는 그림, 그래놓고 539 00:27:57.880 --> 00:28:00.239 책들을 매 페이지에 이렇게 쭈르륵 그려 놓은 다음에 540 00:28:00.239 --> 00:28:04.319 책을 저희가 빠르게 샥 넘겨볼게요 541 00:28:04.319 --> 00:28:06.079 타르륵 넘겨보면 어때요? 542 00:28:06.079 --> 00:28:09.280 마치 얘가 달리는 것 같은 애니메이션을 543 00:28:09.280 --> 00:28:10.119 만들어 낼 수 있겠죠 544 00:28:10.119 --> 00:28:12.439 이런 장난들 한번 해보셨을 거예요 545 00:28:12.439 --> 00:28:14.880 이 각각의 한 장, 한 장들 있죠 546 00:28:14.880 --> 00:28:16.640 이 한 장, 한 장을 우리가 뭐라고 부르냐 547 00:28:16.640 --> 00:28:18.560 바로 프레임이라고 합니다 548 00:28:18.560 --> 00:28:22.119 어디에서는 틱이라고도 얘기하고요 549 00:28:22.119 --> 00:28:25.839 유니티에서 바로 이 한 장, 한 장들을 프레임이라고 해요 550 00:28:25.839 --> 00:28:29.439 보통 애니메이션 분야나 영화 분야에서 551 00:28:29.439 --> 00:28:31.719 부드럽게 우리가 이것들을 볼 수 있게 하기 위해서 552 00:28:31.719 --> 00:28:35.439 이 몇 프레임을, 1초에 몇 프레임을 제작을 하냐면 553 00:28:35.439 --> 00:28:37.439 이렇게 한 장, 한 장 그려 놓는 거요 554 00:28:37.439 --> 00:28:40.704 이것들을 24 프레임 정도 제작을 합니다, 초당 555 00:28:40.704 --> 00:28:43.839 그래서 얘를 초당 프레임 레이트라고 해서 556 00:28:43.839 --> 00:28:47.941 frame per second라고 해서 fps라고 얘기해요 557 00:28:50.119 --> 00:28:52.445 first person shooting이 아닙니다 558 00:28:52.445 --> 00:28:53.959 그렇죠 frame per second라서 559 00:28:53.959 --> 00:28:57.199 24 프레임이 초당 만들어지는 거예요 560 00:28:57.199 --> 00:29:00.119 이것들은 보통 우리가 애니메이션 분야들 있죠 561 00:29:00.119 --> 00:29:03.920 여러분들이 극장에서 영화 볼 때 애니메이션 영화들은 562 00:29:03.920 --> 00:29:06.920 보통 24 프레임 정도 사용하게 되는 거예요 563 00:29:06.920 --> 00:29:08.220 그럼 게임에서는 564 00:29:08.220 --> 00:29:12.520 보통 30 프레임에서 60 프레임 이 정도 사용하고요 565 00:29:12.520 --> 00:29:15.470 VR 같은 형태의 콘텐츠들은 566 00:29:15.470 --> 00:29:17.959 모바일에서는 최소 60 프레임 이상이고요 567 00:29:17.959 --> 00:29:22.040 PC에서는 90 프레임 이상 사용합니다, PC에서는 568 00:29:22.040 --> 00:29:25.000 왜? 사용자들이 고개를 확확 돌리거나 눈을 돌렸을 때 569 00:29:25.000 --> 00:29:27.119 어지럼증을 느끼지 않게 하기 위해서 570 00:29:27.119 --> 00:29:28.719 이 정도 초당 프레임 레이트 571 00:29:28.719 --> 00:29:32.119 fps를 사용하게 되는 거예요 572 00:29:32.119 --> 00:29:37.359 자 이때 이 deltaTime이 굉장히 중요하게 작동을 합니다 573 00:29:37.359 --> 00:29:39.959 얘가 얼만큼 짧게 걸리느냐가 574 00:29:39.959 --> 00:29:44.512 초당 프레임 레이트를 잡아내는 데 도움이 되겠죠 575 00:29:44.512 --> 00:29:48.400 그렇다면 여기에서 델타타임의 활용도는 576 00:29:48.400 --> 00:29:51.079 등속운동 공식에서 어떻게 사용되느냐 577 00:29:51.079 --> 00:29:54.520 보시면 얘는 1m씩 이동을 할 수 있죠 578 00:29:54.520 --> 00:30:00.881 근데 각각의 이 구간에 걸린 시간은 0.25초 579 00:30:00.881 --> 00:30:04.131 전체 1초니까 4분의 1로 나누면 0.25초가 되죠 580 00:30:04.131 --> 00:30:08.750 그래서 우리가 이동할 때 걸리는 거리는 581 00:30:08.750 --> 00:30:12.100 스페이스 S라고 놓을까요 그냥? S라고 놓고요 582 00:30:12.100 --> 00:30:16.059 그다음에 얘를 거리에서, 시간이니까 델타타임 583 00:30:16.059 --> 00:30:18.043 × D라고 놓도록 할게요 584 00:30:20.679 --> 00:30:26.720 이랬을 때 최종 이 위치가 나오는 거예요 585 00:30:26.720 --> 00:30:32.875 그러면, S × 거리 × 시간이 있었죠 586 00:30:32.875 --> 00:30:36.399 거리 × 시간 t, 이 두 가지를 했을 때 볼까요? 587 00:30:36.399 --> 00:30:37.849 1m 이동합니다 588 00:30:37.849 --> 00:30:40.899 시간, 델타타임을 곱해 볼게요 589 00:30:40.899 --> 00:30:43.959 그럼 몇이 나와요? 0.25초 590 00:30:43.959 --> 00:30:45.859 그러면 값이 몇이죠? 591 00:30:45.859 --> 00:30:50.009 0.25m 이동한 게 최종 이동 거리죠 592 00:30:50.009 --> 00:30:52.639 즉, 이 구간을 이동할 때 몇 m 이동했다고요? 593 00:30:52.639 --> 00:30:54.239 0.25m 594 00:30:54.239 --> 00:30:57.839 이 뒤에도 0.25m, 0.25m, 0.25m 595 00:30:57.839 --> 00:31:03.159 다 더하면 최종 얘는 1m 이동하게 되죠 596 00:31:03.159 --> 00:31:06.109 밑에도 마찬가지죠, 얘는 느린 핏이지만 597 00:31:06.109 --> 00:31:10.239 얘가 구간당 0.5초나 델타타임에 걸린대요 598 00:31:10.239 --> 00:31:12.889 이때는 1m 이동하는데 0.5초가 걸렸는데 599 00:31:12.889 --> 00:31:17.760 두 개를 곱해보면 이 구간을 이동하면 몇 m 이동하죠? 600 00:31:17.760 --> 00:31:21.160 0.5m, 얘도 0.5m 601 00:31:21.160 --> 00:31:24.839 두 가지를 더하면 얘는 몇 m 이동했어요? 1m 602 00:31:24.839 --> 00:31:28.289 즉, 아까는 얘는 4m, 얘는 2m였는데 603 00:31:28.289 --> 00:31:30.439 두 개가 같아 졌죠 604 00:31:30.439 --> 00:31:34.320 그래서 델타타임은 이렇게 사용이 되는 거예요 605 00:31:34.320 --> 00:31:36.520 그래서 등속운동 공식에서도 606 00:31:36.520 --> 00:31:40.640 P = P0 + vt 이렇게 해서 만들어졌지만 607 00:31:40.640 --> 00:31:44.234 P = P0 + vt, 이때 뒤에 있는 t가 바로 608 00:31:44.234 --> 00:31:47.200 그 이동한 순간 시간이에요 609 00:31:47.200 --> 00:31:51.307 그 시간 때문에 코드에서도 deltaTime을 곱해줬지만 610 00:31:51.307 --> 00:31:54.320 얘는 반드시 동기화 처리를 위해서 611 00:31:54.320 --> 00:31:57.920 Time.deltaTime은 반드시 곱해 주셔야 돼요 612 00:31:57.920 --> 00:32:01.239 얘는 단순하게 이동해서만 사용되는 건 아니겠죠? 613 00:32:01.239 --> 00:32:04.839 여러분들이 회전을 한 형태를 한번 보도록 할게요 614 00:32:04.839 --> 00:32:06.289 캐릭터가 하나 여기 있고요 615 00:32:06.289 --> 00:32:08.559 이렇게 둘이 이렇게 있다고 칠게요 616 00:32:08.559 --> 00:32:12.434 각자 이쪽을 바라보고 있습니다 617 00:32:12.434 --> 00:32:14.760 여기에 뿅망치가 하나 있다고 볼게요 618 00:32:14.760 --> 00:32:20.373 뿅망치가 이렇게 하나, 이렇게 있습니다 619 00:32:20.373 --> 00:32:24.423 둘 다 시작!하면 회전을 싹 하는 거예요 620 00:32:24.423 --> 00:32:27.760 회전을 싹 해서 얘를 망치를 잡아서 때리는 거예요 621 00:32:27.760 --> 00:32:31.260 얘는 새로운 PC, 얘는 옛날 PC 622 00:32:31.260 --> 00:32:33.040 얘가 더 빨리 회전할 수 있겠죠? 623 00:32:33.040 --> 00:32:37.190 슉! 회전해서 뿅망치를 잡아서 꽝! 때리면 어때요? 624 00:32:37.190 --> 00:32:39.559 무조건 새로운 PC가 이기겠죠? 625 00:32:39.559 --> 00:32:41.859 그래서 회전을 처리할 때도 반드시 626 00:32:41.859 --> 00:32:45.359 deltaTime을 곱해 주셔야 돼요 627 00:32:45.359 --> 00:32:48.018 자, 이번에는 이런 경우를 한번 볼까요? 628 00:32:50.640 --> 00:32:53.490 여기다가 알약을 하나 이렇게 놓을게요 629 00:32:53.490 --> 00:32:55.475 알약을 하나 이렇게 놓도록 하겠습니다 630 00:32:57.666 --> 00:33:05.003 시작!하면 서로 이 알약을 하나씩 먹을 수 있어요 631 00:33:05.003 --> 00:33:07.716 하나씩 먹을 수 있어요, 시작!하면 632 00:33:07.716 --> 00:33:11.559 시작!했을 때 얘도 먹을 수 있고 얘도 먹을 수 있어요 633 00:33:11.559 --> 00:33:15.600 그때 얘는 확대를 하는 알약이에요 634 00:33:15.600 --> 00:33:19.920 얘는 새로운 PC, New PC고요, 얘는 Old PC예요 635 00:33:19.920 --> 00:33:22.570 얘는 이거 먹고 확대를 할 건데 어때요? 636 00:33:22.570 --> 00:33:24.187 빠르게 확대가 되죠? 637 00:33:24.187 --> 00:33:27.037 1초에 4번이고 얘는 2번 확대할 수 있으니까 638 00:33:27.037 --> 00:33:28.559 얘는 4번 확대할 거예요 639 00:33:28.559 --> 00:33:30.709 그래서 얘는 어떻게? 붕붕붕! 640 00:33:30.709 --> 00:33:35.599 그래서 이만큼 커진 다음에 발로 밟아서 꽝! 641 00:33:35.599 --> 00:33:38.239 그럼 얘가 무조건 이기는 게임이겠죠? 642 00:33:38.239 --> 00:33:41.289 즉, 회전할 때도 반드시 뭐를 곱해줘야 돼요? 643 00:33:41.289 --> 00:33:43.280 deltaTime을 곱해 줘야 됩니다 644 00:33:43.280 --> 00:33:46.030 즉, 이 transform 컴포넌트에서 사용하는 645 00:33:46.030 --> 00:33:49.080 포지션, 로테이션, 그다음에 스케일 646 00:33:49.080 --> 00:33:52.630 이 세 가지 값들을 변경하려고 할 때 647 00:33:52.630 --> 00:33:56.230 반드시 deltaTime을 곱해 주셔야 648 00:33:56.230 --> 00:33:58.065 동기화 처리를 할 수가 있겠습니다 649 00:34:01.842 --> 00:34:06.640 이렇게 하면 우리가 델타타임까지 알아봤습니다 650 00:34:06.640 --> 00:34:11.015 이어서 이제 사용자 이동 코드로 651 00:34:11.015 --> 00:34:12.919 이 transform.Translate를 652 00:34:12.919 --> 00:34:15.019 우리가 방금 배워놓은 653 00:34:15.019 --> 00:34:17.039 등속운동 공식으로 바꿔보도록 할게요 654 00:34:17.039 --> 00:34:19.689 유니티에서 제공해주는 이게 아니라 655 00:34:19.689 --> 00:34:22.689 등속운동 공식으로 직접 물리작업을 해서 656 00:34:22.689 --> 00:34:25.039 역학을 구현해 보도록 하겠습니다 657 00:34:25.039 --> 00:34:26.205 이동 공식은 어떻게 된다고요? 658 00:34:26.205 --> 00:34:30.960 P = P0 + vt 이렇게 된다고요 659 00:34:30.960 --> 00:34:33.460 그럼 우리가 필요한 건 먼저 P0이 필요하겠네요 660 00:34:33.460 --> 00:34:36.522 P0는 바로 플레이어의 현재 위치가 될 거예요 661 00:34:40.287 --> 00:34:42.821 그래서 먼저 P0을 만들어 볼까요? 662 00:34:42.821 --> 00:34:47.871 Vector3, 얘는 앞에 자료형이고요 663 00:34:47.871 --> 00:34:50.471 유니티에서 제공하는 x, y, z 664 00:34:50.471 --> 00:34:53.512 세 가지 요소들을 가지고 사용할 수 있게 하는 거예요 665 00:34:53.512 --> 00:34:55.185 그래서 뒤에 3이 붙었죠? 666 00:34:55.187 --> 00:34:58.850 2D에서는 Vector2 667 00:34:58.850 --> 00:35:01.750 숫자가 하나일 때는? 그냥 float 사용하는 거예요 668 00:35:01.750 --> 00:35:05.360 저희는 3D라서 Vector3 이렇게 놓도록 하겠습니다 669 00:35:05.360 --> 00:35:08.195 P0로 하고 놓고요 670 00:35:08.195 --> 00:35:10.645 얘는 현재 플레이어의 위치니까 671 00:35:10.645 --> 00:35:13.745 이 PlayerMove가 사용하고 있는 672 00:35:13.745 --> 00:35:15.000 게임 오브젝트가 있죠 673 00:35:15.000 --> 00:35:18.000 이 플레이어의 위치는 누가 갖고 있어요? 674 00:35:18.000 --> 00:35:19.116 transform이 갖고 있죠 675 00:35:19.116 --> 00:35:21.569 얘 포지션 값을 가져오면 바로 676 00:35:21.569 --> 00:35:24.360 얘의 현재 위치 값을 가져올 수가 있어요 677 00:35:24.360 --> 00:35:26.236 어떻게 쓰느냐? 이렇게 쓰시면 됩니다 678 00:35:26.236 --> 00:35:28.686 transform.position 679 00:35:28.686 --> 00:35:33.279 이렇게 쓰면 바로 P0가 만들어져요 680 00:35:33.279 --> 00:35:37.779 바로 현재 나의 위치를 P0에 담는 거죠 681 00:35:37.779 --> 00:35:40.729 그다음에 있는거 vt 이게 필요하죠? 682 00:35:40.729 --> 00:35:45.383 그래서 Vector3에 vt를 해보면 683 00:35:45.383 --> 00:35:51.906 v는 어떻게 된다고요? 바로 이만큼이 v가 되겠죠 684 00:35:51.906 --> 00:35:53.424 이만큼이 v예요 685 00:35:55.639 --> 00:35:58.489 이 뒤에 있는 얘는 방향이고 얘는 크기 686 00:35:58.489 --> 00:36:01.739 그래서 크기 × 방향에서 이만큼이 v죠 687 00:36:01.739 --> 00:36:03.919 그다음에 t는 deltaTime이죠 688 00:36:03.919 --> 00:36:10.279 그래서 얘까지 뒤에다 곱해주면 이게 vt가 되는 거예요 689 00:36:10.279 --> 00:36:14.026 그럼 마지막 P = P0 + vt를 만들어 보죠 690 00:36:14.026 --> 00:36:20.000 P = P0 + vt 691 00:36:20.000 --> 00:36:22.900 이렇게 되는 거예요 그러면 이 공식대로 최종 만들어졌죠 692 00:36:22.900 --> 00:36:25.700 이렇게 값을 구했으니까 693 00:36:25.700 --> 00:36:28.919 최종 현재 나의 위치에다가 갱신이 돼야 될 거예요 694 00:36:28.919 --> 00:36:32.269 그래서 transform.position 695 00:36:32.269 --> 00:36:33.419 나의 현재 위치에다가 696 00:36:33.419 --> 00:36:35.619 뭐를 넣어 주면 돼요? P를 넣어주면 697 00:36:35.619 --> 00:36:37.760 이게 값이 갱신이 되겠죠 698 00:36:37.760 --> 00:36:42.720 이 부분은 이제 필요가 없으니까 지워주시면 되겠습니다 699 00:36:42.720 --> 00:36:48.670 이렇게 하면 현재 플레이어의 위치를 바꾸게 되는 700 00:36:48.670 --> 00:36:51.599 등속운동 공식을 이용해서 만들어내는 거예요 701 00:36:51.599 --> 00:36:53.787 똑같이 바뀌어졌는지 한번 볼까요? 702 00:36:56.228 --> 00:37:00.117 플레이 버튼을 눌러보면 사용자는 오른쪽으로 계속 이동하죠 703 00:37:02.000 --> 00:37:03.064 이렇게 됐습니다 704 00:37:03.064 --> 00:37:06.811 사용자 입력에 따른 이동 구현 705 00:37:07.336 --> 00:37:10.436 그러면 이번에는 사용자 입력에 따른 이동을 706 00:37:10.436 --> 00:37:11.687 구현해 보도록 할게요 707 00:37:14.857 --> 00:37:18.357 사용자 입력은 사용자의 입력에 따라서 708 00:37:18.357 --> 00:37:21.775 방향을 구할 수 있는 이것을 만들어내죠 709 00:37:21.775 --> 00:37:23.625 사용자의 방향을 구할 수 있게 해줘요 710 00:37:23.625 --> 00:37:25.325 여기서의 방향은 뭐죠? 711 00:37:25.325 --> 00:37:28.160 이 부분이 사용자의 방향일 거예요 712 00:37:28.160 --> 00:37:29.810 특히나 얘는 크기니까 713 00:37:29.810 --> 00:37:32.759 이 부분이 방향으로 한정될 수 있어요 714 00:37:32.759 --> 00:37:35.736 여기에서 저희가 조금 더 알아봐야 될 부분들 715 00:37:38.119 --> 00:37:39.969 Vector3.right는 716 00:37:39.969 --> 00:37:42.319 결과적으로 이 Vector3라는 부분은 717 00:37:42.319 --> 00:37:46.769 x, y, z 이 3가지 성분을 가지고 718 00:37:46.769 --> 00:37:49.440 방향을 만들어낸다는 거예요 719 00:37:49.440 --> 00:37:53.383 유니티에서는 x가 오른쪽을 뜻하고요 720 00:37:53.383 --> 00:38:00.000 y는 위를 뜻합니다, z는 바로 앞을 뜻해요 721 00:38:00.000 --> 00:38:01.313 영어로 하면 722 00:38:03.559 --> 00:38:07.009 요거 x 방향은 right 라고 할 수 있고요 723 00:38:07.009 --> 00:38:08.737 얘는 up이라고 할 수 있고 724 00:38:08.737 --> 00:38:10.156 얘는 forward 라고 합니다 725 00:38:11.720 --> 00:38:15.180 forward 이렇게 됐을 때 726 00:38:16.647 --> 00:38:20.597 x, y, z에 각각의 값이 어떻게 들어가냐 727 00:38:20.597 --> 00:38:23.279 Vector3.right는 이 3가지 성분의 값이 들어가야 돼요 728 00:38:23.279 --> 00:38:27.179 즉 x가 오른쪽이니까 얘한테 값이 1 들어가고요 729 00:38:27.179 --> 00:38:30.360 y는 0, z 도 0 이렇게 들어가게 되는 거예요 730 00:38:30.360 --> 00:38:34.110 값이 없어야지 오른쪽 방향으로 갈 테니까 731 00:38:34.110 --> 00:38:35.800 얘의 크기는 1 입니다 732 00:38:35.800 --> 00:38:37.900 크기는 어떻게 구하냐면요 이렇게 구해요 733 00:38:37.900 --> 00:38:44.039 √(x^2 + y^2 + z^2) 이런 식으로 구하게 되는 거예요 734 00:38:44.039 --> 00:38:47.379 얘가 1이니까 나머지 0이고, 루트 1은 1이죠 735 00:38:47.379 --> 00:38:49.594 그러니까 크기는 1이 되는 거예요 736 00:38:52.479 --> 00:38:54.629 이렇게 됩니다 그러면 여러분들 737 00:38:54.629 --> 00:38:58.240 right 말고 up도 있겠네요 up도 있을 거예요 738 00:38:58.240 --> 00:39:00.190 up은 그럼 어떻게 될까요? 739 00:39:00.190 --> 00:39:03.921 이 형태로라면 y 축에만 값이 들어가면 되는 것 같아요 740 00:39:03.921 --> 00:39:07.821 즉 x에는 0이고 y에는 1 741 00:39:07.821 --> 00:39:09.471 forward일 땐? 742 00:39:09.471 --> 00:39:13.160 y에 0이고 z에는 1 이렇게 되겠죠 743 00:39:13.160 --> 00:39:16.399 아까 방향이 바뀔 때는 무엇을 곱하면 된다고요? 744 00:39:16.399 --> 00:39:21.519 -1를 곱하면 벡터가 뒤집어진다고 얘기했어요 745 00:39:21.519 --> 00:39:25.019 즉 그래서 만약에 뒤로 가겠다고 하면 746 00:39:25.019 --> 00:39:27.720 벡터의 뒤로 가겠다고 하면 얘는 앞이죠 747 00:39:27.720 --> 00:39:30.440 -1를 곱해 주시면 돼요 748 00:39:30.440 --> 00:39:34.690 왼쪽은 x에 -1를 곱해 주면 되겠죠 749 00:39:34.690 --> 00:39:37.239 × -1을 해주시면 된다는 얘기에요 750 00:39:37.239 --> 00:39:41.039 이렇게 각 성분별로 곱해지니까 이렇게 751 00:39:41.039 --> 00:39:44.000 0 × -1은 0이잖아요 752 00:39:44.000 --> 00:39:50.440 그래서 아래로 가는 것도 이렇게 하시면 되겠습니다 753 00:39:50.440 --> 00:39:53.290 그래서 × -1을 하면 벡터가 뒤집힌다 754 00:39:53.290 --> 00:39:54.910 이 내용을 알아두시면 되겠어요 755 00:39:56.920 --> 00:39:59.220 그러면 사용자의 입력을 받아서 756 00:39:59.220 --> 00:40:02.170 플레이어가 상하좌우로 이동하게 하는 내용을 757 00:40:02.170 --> 00:40:04.040 한번 구현을 해보도록 할게요 758 00:40:04.040 --> 00:40:08.090 그러면 먼저 방향을 여기다가 만들어내기 위해서 759 00:40:08.090 --> 00:40:10.467 사용자의 입력을 한번 받아 봅시다 760 00:40:15.299 --> 00:40:22.094 사용자의 입력을 받아서 방향을 만들고 싶다 761 00:40:25.119 --> 00:40:27.119 그럼 사용자의 입력을 어떻게 받냐면 762 00:40:27.119 --> 00:40:31.239 Input이라는 클래스를 이용해서 사용자의 입력을 받아요 763 00:40:31.239 --> 00:40:34.962 그러면 클래스 1을 한번 머릿속에 그려보세요 764 00:40:34.962 --> 00:40:36.600 그럼 . 하면 어떻게 된다고요? 765 00:40:36.600 --> 00:40:38.700 속성으로 기능에 들어가는 거죠 766 00:40:38.700 --> 00:40:41.150 우린 여기에서 기능에 들어갈 거예요 767 00:40:41.150 --> 00:40:44.640 GetAxis라는 기능에 들어갈 겁니다 768 00:40:44.640 --> 00:40:46.640 GetAxis 하면 사용자의 769 00:40:46.640 --> 00:40:49.079 계속 누르고 있는 입력들을 받아올 수 있어요 770 00:40:49.079 --> 00:40:51.579 여기에 우리는 좌우 입력인 771 00:40:51.579 --> 00:40:56.304 Horizontal 입력을 받아오도록 하겠습니다 772 00:40:57.880 --> 00:41:01.912 얘를 사용자가 아무 키도 누르고 있지 않으면 773 00:41:01.912 --> 00:41:04.760 이 GetAxis라는 애는 값을 0을 넘겨줘요 774 00:41:04.760 --> 00:41:10.410 근데 A키나 혹은 화살표 왼쪽 키를 누르면 775 00:41:10.410 --> 00:41:13.079 얘가 -1 값을 넘겨주고요 776 00:41:13.079 --> 00:41:18.429 점차 0부터 -0.1, -0.2 이렇게 주르륵 바뀌어서 777 00:41:18.429 --> 00:41:21.479 -1까지의 값을 넘겨주게 돼요 778 00:41:21.479 --> 00:41:25.079 오른쪽 키를 누르면 +1 값을 넘겨주게 됩니다 779 00:41:25.079 --> 00:41:26.129 얘를 받아서 780 00:41:26.129 --> 00:41:29.200 이 벡터의 방향을 만드는 데 사용하도록 할게요 781 00:41:29.200 --> 00:41:33.750 얘를 그릇인 float h라는 좌우 입력에 대한 782 00:41:33.750 --> 00:41:38.054 Horizontal 입력에 대한 값으로 담아둘게요 783 00:41:38.054 --> 00:41:40.679 그럼 이 Horizontal 값은 어디에 있느냐면 784 00:41:40.679 --> 00:41:47.129 유니티 와 보시면 Edit 메뉴에서 밑으로 쭉 내리면 785 00:41:47.129 --> 00:41:49.961 Project Settings라는 게 있어요 786 00:41:49.961 --> 00:41:54.959 얘를 들어가서 보면 Input Manager가 있죠 787 00:41:54.959 --> 00:41:57.566 Input Manager에 Axes라는 부분이 있는데 788 00:41:57.566 --> 00:42:01.665 얘를 열어보시면 여기에 Horizontal이라는 게 있습니다 789 00:42:01.665 --> 00:42:03.715 이 밑에 보면 Vertical, Fire1 790 00:42:03.715 --> 00:42:08.959 이렇게 미리 유니티에서 입력을 맵핑해 놓은 791 00:42:08.959 --> 00:42:10.839 이런 값들을 볼 수 있을 거예요 792 00:42:10.839 --> 00:42:13.920 Horizontal을 열어보면 이름은 Horizontal인데 793 00:42:13.920 --> 00:42:19.799 여기에 Negative Button, left라고 되어 있고요 794 00:42:19.799 --> 00:42:23.040 그다음에 Positive Button은 right라고 되어 있습니다 795 00:42:23.040 --> 00:42:26.279 즉 화살표키의 왼쪽키, 오른쪽키를 뜻하는 거예요 796 00:42:26.279 --> 00:42:28.239 음수, 양수를 뜻하는 거고 797 00:42:28.239 --> 00:42:33.289 Alt키, 다른 대체할 수 있는 Negative 버튼은 798 00:42:33.289 --> 00:42:34.720 a키, d키 이렇게 799 00:42:34.720 --> 00:42:38.170 즉 그래서 왼쪽키, 오른쪽키, a키, d키를 눌렀을 때 800 00:42:38.170 --> 00:42:40.480 반응하는 게 바로 Horizontal이고요 801 00:42:40.480 --> 00:42:44.679 이 값은 -1에서 1 사이의 값을 넘겨주게 됩니다 802 00:42:44.679 --> 00:42:46.322 여기에 정의가 되어 있는 거예요 803 00:42:46.322 --> 00:42:48.440 이렇게 정의가 되어 있고 804 00:42:48.440 --> 00:42:51.090 Vertical은 up, down이 되어 있고 805 00:42:51.090 --> 00:42:53.119 s, w 이렇게 들어가 있죠 806 00:42:53.119 --> 00:42:55.160 fire1은 뭐가 들어가 있을까요? 807 00:42:55.160 --> 00:42:58.310 left ctrl키 혹은 마우스 왼쪽 버튼 808 00:42:58.310 --> 00:43:00.239 0번은 마우스 왼쪽 버튼이에요 809 00:43:00.239 --> 00:43:03.239 이런 식으로 값들이 정의가 되어 있습니다 810 00:43:03.239 --> 00:43:05.589 여기에 정의되어 있는 값을 우리는 여기다 넣어서 811 00:43:05.589 --> 00:43:07.572 작업하게 되는 거예요 812 00:43:07.572 --> 00:43:13.279 이 값을 이용해서 처리해보는 값을 할 거예요 813 00:43:13.279 --> 00:43:15.799 그럼 방향을 먼저 이 값을 814 00:43:15.799 --> 00:43:20.000 얘가 아니라 여기에다가 넣는 값으로 바꿔보도록 할게요 815 00:43:20.000 --> 00:43:26.640 그래서 우리는 Vector3에 dir을 넣도록 하고요 816 00:43:26.640 --> 00:43:31.119 얘는 right죠 817 00:43:31.119 --> 00:43:32.520 오른쪽 값이에요 818 00:43:32.520 --> 00:43:37.343 이렇게 하면 이 dir는 오른쪽이라는 게 들어가 있고 819 00:43:37.343 --> 00:43:40.799 right 대신에 이렇게만 해놓으면 어떻게 돼요? 820 00:43:40.799 --> 00:43:43.919 오른쪽 방향으로 움직인다 똑같은 값이 나오겠죠 821 00:43:43.919 --> 00:43:46.919 그때 우리가 여기서 사용자의 입력 값을 822 00:43:46.919 --> 00:43:49.440 얘한테 적용하게 하고 싶으면 823 00:43:49.440 --> 00:43:54.039 여기다가 스칼라 값인 h를 곱해 준다고 보죠 824 00:43:54.039 --> 00:43:56.479 그럼 내부적으로 어떤 일이 생기죠? 825 00:43:56.479 --> 00:44:00.719 right는 1, 0, 0인데 826 00:44:00.719 --> 00:44:03.280 여기다가 h가 만약에 -1이에요 827 00:44:03.280 --> 00:44:05.599 왼쪽 키를 눌러서 이렇게 되면 828 00:44:05.599 --> 00:44:08.119 이렇게 이렇게 각각의 성분이 곱해지겠죠 829 00:44:08.119 --> 00:44:09.559 그러면 어떻게 돼요? 830 00:44:09.559 --> 00:44:12.200 -1, 0, 0이 돼서 왼쪽이 될 거예요 831 00:44:12.200 --> 00:44:15.760 오른쪽을 누르면 +1이 돼서 그냥 1, 0, 0이 될 거고 832 00:44:15.760 --> 00:44:17.080 오른쪽으로 가겠죠 833 00:44:17.080 --> 00:44:19.760 아무것도 안 누르면 얘는 0 값이 들어오거든요 834 00:44:19.760 --> 00:44:23.919 그러니까 방향은 0이 돼서 아무것도 안 움직이겠죠 835 00:44:23.919 --> 00:44:27.320 0 × 5는 다 0이죠, 그렇죠? 그렇게 되니까 836 00:44:27.320 --> 00:44:30.520 그래서 얘를 h를 여기다 곱해 주면 837 00:44:30.520 --> 00:44:33.080 바로 우리가 방향을 설정할 수가 있습니다 838 00:44:33.080 --> 00:44:36.280 이렇게 놓고 플레이를 한번 해보도록 할까요? 839 00:44:36.280 --> 00:44:39.280 플레이 840 00:44:39.280 --> 00:44:41.640 키보드의 좌우 키를 눌러볼까요? 841 00:44:41.640 --> 00:44:44.340 그러면 캐릭터가, 플레이어가 842 00:44:44.340 --> 00:44:47.320 좌우로 이렇게 이동하는 것을 확인할 수가 있습니다 843 00:44:47.320 --> 00:44:50.960 됐죠? 그럼 상하 입력은 어떻게 할까요? 844 00:44:50.960 --> 00:44:54.080 여러분들이, 아까 제가 말씀드렸던 것처럼 845 00:44:54.080 --> 00:44:56.919 Input Manager에서 이 값이 뭐였죠? 846 00:44:56.919 --> 00:44:59.719 Vertical이었죠, 하나 더 만들어 볼게요 847 00:44:59.719 --> 00:45:04.320 v라고 놓고요 이번엔 얘를 Vertical 이렇게 놓습니다 848 00:45:04.320 --> 00:45:07.559 대소문자 다 구분하셔야 돼요 849 00:45:07.559 --> 00:45:10.719 그러면 사용자의 입력은 이렇게 만들어 놓는데 850 00:45:10.719 --> 00:45:12.919 어? Vertical 하나를 더 하려면 851 00:45:12.919 --> 00:45:15.599 방향을 하나 더 만들어서 이동시켜야 되나? 852 00:45:15.599 --> 00:45:16.719 그럴 필요가 없죠 853 00:45:16.719 --> 00:45:19.640 벡터의 더하기를 사용하면 돼요 854 00:45:19.640 --> 00:45:23.590 어떻게? 오른쪽 방향과 위로 가는 855 00:45:23.590 --> 00:45:27.440 이 두 개의 벡터를 더하면 어떻게 된다고요? 856 00:45:27.440 --> 00:45:30.039 얘를 여기다가 놓을 수 있다고 했죠 857 00:45:30.039 --> 00:45:34.551 그래서 이 벡터가 만들어지는 거잖아요? 858 00:45:34.551 --> 00:45:37.440 그래서 두 개의 벡터를 더해버리면 되겠습니다 859 00:45:37.440 --> 00:45:45.080 + Vector3.up * v 이렇게 하시면 860 00:45:45.080 --> 00:45:50.359 -1 값이 들어올 때는 아래로 들어갈 거고요 벡터가 861 00:45:50.359 --> 00:45:52.309 얘는 0, 1, 0 이니까 862 00:45:52.309 --> 00:45:55.799 그다음에 +1일 때는 그냥 위로 될 거고 863 00:45:55.799 --> 00:45:58.999 그러면 물체를 이동시키는 이 공식을 864 00:45:58.999 --> 00:46:00.599 어떻게 바꿀 수 있냐면 865 00:46:00.599 --> 00:46:02.743 이렇게 만들 수가 있어요 866 00:46:11.280 --> 00:46:16.472 방향을 구한다가 되는 거고요 867 00:46:16.472 --> 00:46:17.919 여기까지 방향을 구하는 거고 868 00:46:17.919 --> 00:46:20.892 이 밑에 있는 내용은 뭐예요? 869 00:46:20.892 --> 00:46:22.242 이동시킨다 870 00:46:22.242 --> 00:46:27.840 이렇게 문장을 구별해서 사용할 수가 있겠습니다 871 00:46:27.840 --> 00:46:29.540 그러면 이동시킨다는 872 00:46:29.540 --> 00:46:32.159 항상 이동시킨다는 단어로 끝나는 거죠 873 00:46:32.159 --> 00:46:34.609 방향을 바꾸거나 여러가지 작업을 하고 싶을 때는 874 00:46:34.609 --> 00:46:37.159 여기에서 코드만 바꾸게 되면 되겠습니다 875 00:46:37.159 --> 00:46:38.759 함수를 만든다고 해도 876 00:46:38.759 --> 00:46:44.080 이 부분의 함수만 바꿔서 만들어내면 되겠죠 877 00:46:44.080 --> 00:46:47.400 이렇게 해서 사용자의 상하좌우 이동하는 것까지 해봤어요 878 00:46:47.400 --> 00:46:49.814 테스트를 한번 해볼까요? 플레이 879 00:46:51.919 --> 00:46:56.869 그러면 사용자가 왼쪽, 오른쪽, 상하좌우 키를 눌렀을 때 880 00:46:56.869 --> 00:46:59.393 움직이는 것을 확인할 수가 있겠습니다 881 00:47:02.520 --> 00:47:05.320 그럼 계속해서 이 부분을 882 00:47:05.320 --> 00:47:07.760 조금 더 우리가 자세히 알아볼게요 883 00:47:07.760 --> 00:47:12.239 벡터의 라이트는 어떻게 볼 수 있다고요? 884 00:47:12.239 --> 00:47:15.789 벡터의 라이트는 이렇게 볼 수 있다고요 885 00:47:15.789 --> 00:47:17.760 (1, 0, 0) 886 00:47:17.760 --> 00:47:20.746 h까지 곱하면 어떻게 되죠? 887 00:47:20.746 --> 00:47:23.880 (h, 0, 0) 이렇게 될 거예요 888 00:47:23.880 --> 00:47:25.530 자 더하기 할게요 889 00:47:25.530 --> 00:47:27.880 벡터의 up × v는 이렇게 볼 수 있겠네요 890 00:47:27.880 --> 00:47:31.359 (0, v, 0), 자 2개를 더해봅시다 891 00:47:31.359 --> 00:47:36.000 그럼 최종 값이 어떻게 나오죠? (h, v, 0) 892 00:47:36.000 --> 00:47:39.900 즉 각각의 성분에다가, 이렇게 x, y, z에다가 893 00:47:39.900 --> 00:47:43.612 얘를 이렇게 넣어줘도 되겠네요? 894 00:47:43.612 --> 00:47:47.359 그래서 우리 코드를 이렇게도 수정할 수가 있을 거예요 895 00:47:47.359 --> 00:47:48.687 이렇게 되어 있는 부분을 896 00:47:50.960 --> 00:47:56.085 new Vector3에서 (h, v, 0) 897 00:47:56.085 --> 00:48:00.960 이렇게 놓으셔도 내용은 똑같이 되는 거죠 898 00:48:00.960 --> 00:48:04.035 저장하고 가서 또 플레이를 해볼까요 899 00:48:06.599 --> 00:48:10.960 상하좌우 이동했을 때 똑같이 구현될 수가 있죠 900 00:48:10.960 --> 00:48:15.280 그래서 벡터에 더하기를 해서 최종 결과물을 뽑고요 901 00:48:15.280 --> 00:48:18.380 그 결과물들은 어떻게 벡터에 이런 식으로 들어가도 902 00:48:18.380 --> 00:48:20.320 내용은 똑같을 수가 있겠습니다 903 00:48:20.320 --> 00:48:22.370 그럼 벡터에 더하기는 필요가 없는 건가요? 904 00:48:22.370 --> 00:48:24.080 이렇게 얘기하실 수도 있겠죠 905 00:48:24.080 --> 00:48:26.346 아니에요 벡터에 더하기는 얘기했던 것처럼 906 00:48:26.346 --> 00:48:29.440 모든 힘의 합을 구현하기 때문에 반드시 필요합니다 907 00:48:29.440 --> 00:48:32.840 이건 사용자의 입력을 받아서 하나의 값으로 줄였을 때 908 00:48:32.840 --> 00:48:35.320 이렇게도 사용할 수 있다는 것을 보여드릴 거예요 909 00:48:35.320 --> 00:48:37.320 여러분들이 공부하시다가 910 00:48:37.320 --> 00:48:39.870 유튜브나 구글 이런 데서 찾으실 때 911 00:48:39.870 --> 00:48:43.239 그때 코드가 단순하게 이런 식으로만 나올 수도 있거든요 912 00:48:43.239 --> 00:48:47.289 얘네는 궁극적으로 실제로는 벡터에 더하기가 근간이다 913 00:48:47.289 --> 00:48:49.792 이 내용을 알아주셨으면 되겠습니다 914 00:48:51.049 --> 00:48:54.280 이번 단원에서 학습한 내용을 정리하도록 하겠습니다 915 00:48:54.280 --> 00:48:57.239 첫 번째로 벡터에 대해 알아봤습니다 916 00:48:57.239 --> 00:49:00.239 벡터는 크기와 방향으로 이루어져 있고 917 00:49:00.239 --> 00:49:04.919 더하기, 빼기, 내적, 외적의 연산을 수행할 수 있습니다 918 00:49:04.919 --> 00:49:08.840 두 번째로 등속운동 공식에 대해 학습했습니다 919 00:49:08.840 --> 00:49:11.190 물체 이동을 위한 등속운동 공식인 920 00:49:11.190 --> 00:49:14.039 P = P0 + vt에 대해 알아봤습니다 921 00:49:14.039 --> 00:49:17.280 플레이어의 이동을 제작했습니다 922 00:49:17.280 --> 00:49:20.919 등속운동 공식을 바탕으로 플레이어를 이동시켰습니다 923 00:49:20.919 --> 00:49:25.359 그리고 델타타임의 의미와 쓰임새에 대해 학습했습니다 924 00:49:25.359 --> 00:49:29.080 사용자 입력에 따른 이동을 구현했습니다 925 00:49:29.080 --> 00:49:32.116 인프 클래스를 이용해 사용자의 입력을 가져오고 926 00:49:32.116 --> 00:49:35.216 사용자의 입력을 바탕으로 상하좌우 방향을 구해 927 00:49:35.216 --> 00:49:37.137 플레이어의 이동을 적용했습니다 928 00:49:37.581 --> 00:49:41.031 Vector의 이해 Vector Vector는 크기와 방향을 가짐 더하기, 빼기, 곱하기(내적, 외적)이 가능함 벡터의 더하기로 모든 힘의 합을 표현할 수 있음 929 00:49:41.031 --> 00:49:44.472 Direction=B-A (A가 B로 가고자 하는 방향을 찾는 수식) 930 00:49:44.472 --> 00:49:47.972 등속운동 공식 이해 및 플레이어 이동 제작 등속운동 물체를 이동하기 위한 물리 법칙으로 이동, 속도, 힘에 관한 공식을 사용함 P=P0+vt / v=v0+at / F=ma 931 00:49:47.972 --> 00:49:51.481 델타 타임(DeltaTime) 이전 프레임과 현재 프레임 사이의 시간 PC 사양과 상관없이 초당 이동 거리를 같도록 맞추는 것이 중요함 932 00:49:51.481 --> 00:49:52.723 사용자 입력에 따른 이동 구현 사용자 입력 처리 키보드의 좌우키, A, D키의 입력 대응을 위한 코드 작성 933 00:49:52.723 --> 00:49:53.985 [Edit - Project Settings - Input Manager]의 속성에 등록되어 있는 Horizontal, Vertical을 활용해 상하좌우 입력에 대응하는 코드 작성 934 00:49:53.985 --> 00:49:55.188 방향 만들기 '사용자 입력에 따라 방향 만들어서 이동한다'는 내용 구현 935 00:49:55.188 --> 00:49:56.386 사용자 입력에서 받은 값을 방향 만들기에 사용 (Vector3 dir=Vector3.right*h+Vector3.up*v) 936 00:49:56.386 --> 00:49:57.371 (h, 0, 0)+(0, v, 0)=(h, v, 0)을 이용해 스크립트를 new Vector3(h, v, 0)로 변경