1 00:00:05.712 --> 00:00:09.854 게임 심화편 프로토타입3 2 00:00:09.854 --> 00:00:12.111 GCC 사관학교 3 00:00:27.346 --> 00:00:28.495 안녕하세요 4 00:00:28.495 --> 00:00:32.006 슈팅게임 제작 강의를 맡게 된 이영호입니다 5 00:00:32.006 --> 00:00:36.458 이번 단원에서는 프로토타입 3번째에 대해 학습하겠습니다 6 00:00:36.458 --> 00:00:39.576 학습 내용으로는 총알 이동 제작 7 00:00:39.576 --> 00:00:41.149 총알 발사 제작 8 00:00:41.149 --> 00:00:43.302 적 이동 제작에 대해 학습해 보겠습니다 9 00:00:43.688 --> 00:00:47.578 총알 이동 제작 10 00:00:48.373 --> 00:00:51.650 그럼 총알 이동 제작을 해보도록 하겠습니다 11 00:00:51.650 --> 00:00:54.636 먼저 총알을 생성하고 그다음에 이 총알들이 12 00:00:54.636 --> 00:00:58.042 날아가는 형태를 구현해보도록 할게요 13 00:00:58.042 --> 00:00:59.891 유니티로 와서 먼저 14 00:00:59.891 --> 00:01:02.000 총알 게임 오브젝트를 만들어 보도록 하죠 15 00:01:02.000 --> 00:01:04.574 하이어라키에서 + 누르고 16 00:01:04.574 --> 00:01:08.000 3D Object에 Cube를 눌러주도록 하겠습니다 17 00:01:08.000 --> 00:01:10.782 이름은 Bullet으로 넣도록 할게요 18 00:01:10.782 --> 00:01:13.178 Bullet 넣도록 하고요 19 00:01:13.178 --> 00:01:15.802 위치는 Transform에서 Reset 눌러주도록 하겠습니다 20 00:01:19.000 --> 00:01:20.000 여기에 있는데 21 00:01:20.000 --> 00:01:23.000 크기는 저는 적당하게 플레이어보다는 작게 22 00:01:23.000 --> 00:01:24.941 이렇게 작업을 해놓죠 23 00:01:27.366 --> 00:01:28.812 이정도로 넣도록 하겠습니다 24 00:01:31.337 --> 00:01:34.198 그리고 이 총알이 실제로 이동을 해야되니까 25 00:01:34.198 --> 00:01:36.238 스크립트를 하나 만들어 볼게요 26 00:01:37.574 --> 00:01:41.267 Project 창에 Scripts 폴더에다가 27 00:01:41.267 --> 00:01:44.000 + 눌러서 C# Script 28 00:01:44.000 --> 00:01:46.618 이름은 Bullet이라고 넣도록 할게요 29 00:01:50.924 --> 00:01:53.485 이렇게 Bullet 스크립트가 만들어지면 30 00:01:53.485 --> 00:01:55.851 Bullet 게임 오브젝트한테 드래그 앤 드롭으로 31 00:01:55.851 --> 00:01:56.782 이렇게 넣어주도록 하시죠 32 00:01:59.000 --> 00:02:03.881 여기에서 이 총알이 해야 될 역할들은 33 00:02:03.881 --> 00:02:06.169 이제 스크립트에서 정의를 해보도록 할게요 34 00:02:08.327 --> 00:02:10.653 이 총알이 무엇을 하고 싶으냐 35 00:02:10.653 --> 00:02:16.099 얘는 위로 계속 이동하게 할 거예요 36 00:02:16.099 --> 00:02:18.000 이게 총알이 하는 역할이고요 37 00:02:18.000 --> 00:02:20.000 그렇다면 이 총알은 38 00:02:20.000 --> 00:02:22.000 이 총알이라는 클래스 자체는 39 00:02:22.000 --> 00:02:24.119 속성 혹은 기능으로 이루어져 있는데 40 00:02:24.119 --> 00:02:26.584 이 문장을 수행하기 위해서 41 00:02:26.584 --> 00:02:30.000 어떤 속성들이 필요할까요? 42 00:02:30.000 --> 00:02:32.050 기획자한테 계속해서 결국엔 물어봐야 되는 43 00:02:32.050 --> 00:02:33.604 내용들이 필요합니다 44 00:02:33.604 --> 00:02:37.188 여기 이 문장에서 이걸 구현하려고 하다보니까 45 00:02:37.188 --> 00:02:38.733 어떤 정보들이 필요해요 46 00:02:38.733 --> 00:02:42.812 그게 바로 필요한 속성으로 얘기할 수 있고요 47 00:02:42.812 --> 00:02:47.643 바로 이때 이동속도라는 이 부분이 필요할 수 있어요 48 00:02:47.643 --> 00:02:49.000 이동속도를 알려줘야 49 00:02:49.000 --> 00:02:52.406 우리가 기획자의 의도에 맞게끔 움직일 수 있겠죠 50 00:02:52.406 --> 00:02:55.832 그리고 우리가 이동속도를 설정해 놨는데 51 00:02:55.832 --> 00:02:57.732 이 부분을 기획자가 직접 52 00:02:57.732 --> 00:02:59.545 수정할 수 있게 해놓으면 좋을 것 같아요 53 00:03:02.000 --> 00:03:04.000 자 그래서 이동속도는 54 00:03:04.000 --> 00:03:10.475 이 부분에다가 public float speed 해서 55 00:03:10.475 --> 00:03:12.653 10이라고 넣도록 할게요 56 00:03:12.653 --> 00:03:15.624 플레이어는 속도 5로 움직였거든요? 57 00:03:15.624 --> 00:03:17.515 PlayerMove에 가서 보면 58 00:03:17.515 --> 00:03:19.792 지금 속도 5로 움직이고 있죠 59 00:03:19.792 --> 00:03:21.392 그런데 Bullet은 어떻게? 60 00:03:21.392 --> 00:03:23.188 10으로 움직이도록 처리를 해볼게요 61 00:03:25.713 --> 00:03:31.643 그리고 얘는 위로 계속 이동하고 싶다고 했으니까 62 00:03:31.643 --> 00:03:34.703 이 부분을 어느 곳에다가 63 00:03:34.703 --> 00:03:36.604 Start 혹은 Update 둘 중에 하나에다가 64 00:03:36.604 --> 00:03:39.832 우리는 구현을 해놓아야 되거든요 65 00:03:39.832 --> 00:03:41.703 이 내용은 계속 이동해야 되니까 66 00:03:41.703 --> 00:03:43.377 Update에다가 넣어 줘야 될 거예요 67 00:03:47.485 --> 00:03:51.000 그럼 이 문장을 조금 더 세밀하게 68 00:03:51.000 --> 00:03:52.604 잘게 쪼개 보도록 하겠습니다 69 00:03:52.604 --> 00:03:56.129 이 문장이 궁극적으로 하고 싶은 부분은 뭘까요? 70 00:03:56.129 --> 00:04:00.198 이동하고 싶은 거죠 71 00:04:00.198 --> 00:04:02.337 이동하려면 뭔가가 필요해요 72 00:04:02.337 --> 00:04:06.594 그게 바로 뭐냐면 방향이 필요하죠 73 00:04:06.594 --> 00:04:08.000 즉 방향을 구해야 74 00:04:08.000 --> 00:04:10.000 그 방향으로 이동할 수가 있게 되는 거예요 75 00:04:10.000 --> 00:04:11.445 우선순위를 보면 76 00:04:11.445 --> 00:04:15.198 이렇게 되어야 우선순위가 맞춰지겠죠 77 00:04:15.198 --> 00:04:19.049 방향을 먼저 구하고 그 방향으로 이동하는 것 78 00:04:19.049 --> 00:04:20.970 여기에서 방향은 79 00:04:20.970 --> 00:04:22.059 우리가 뭘로 볼 수 있냐면 80 00:04:22.059 --> 00:04:25.604 Vector3에 direction이라고 넣도록 할까요? 81 00:04:25.604 --> 00:04:27.366 dir 82 00:04:27.366 --> 00:04:31.802 얘는 Vector3에 Up 이렇게 되겠죠 83 00:04:36.000 --> 00:04:42.653 이동공식은 P=P0+vt 84 00:04:42.653 --> 00:04:43.742 이렇게 되어있죠 85 00:04:43.742 --> 00:04:47.356 그러면 이대로 한번 넣도록 하겠습니다 86 00:04:47.356 --> 00:04:52.000 앞에서 했던 것처럼 P0은 어떻게 된다고요? 87 00:04:52.000 --> 00:04:59.723 transform의 position이 바로 P0가 되고요 88 00:04:59.723 --> 00:05:05.643 그다음에 vt는 바로 dir 곱하기 89 00:05:05.643 --> 00:05:08.766 크기는 여기 우리가 속성으로 주어졌던 90 00:05:08.766 --> 00:05:11.554 Speed로 넣도록 하죠 91 00:05:11.554 --> 00:05:14.604 그다음에 * Time.deltaTime하면 92 00:05:14.604 --> 00:05:17.000 vt가 만들어진다고 했죠 93 00:05:17.000 --> 00:05:23.317 그리고 Vector3에 결국 P=P0+vt 94 00:05:23.317 --> 00:05:28.416 이 값을 최종적으로 transform의 position에다가 95 00:05:28.416 --> 00:05:31.000 넣어주면 내용이 완성되죠 96 00:05:31.000 --> 00:05:34.346 이렇게 일일 잘게 쪼개서 쓰셔도 되는데 97 00:05:34.346 --> 00:05:40.039 하나의 문장으로 쓰면 결국에는 얘는 P0 98 00:05:40.039 --> 00:05:46.000 그다음에 + vt, 이만큼으로 이렇게 써도 되겠네요 99 00:05:46.000 --> 00:05:50.208 이 문장을 하나로 이렇게 합쳐서 써도 똑같을 거예요 100 00:05:50.208 --> 00:05:56.000 이만큼이 P0이고 vt 이렇게 되겠죠 101 00:05:56.000 --> 00:05:59.980 그래서 이 문장과 이 문장은 다 같다는 거 보시면 되겠습니다 102 00:06:02.000 --> 00:06:05.455 저장을 하고 가서 확인을 해보도록 할까요? 103 00:06:05.455 --> 00:06:09.000 Bullet에는 이미 Bullet (Script)가 붙어져 있죠 104 00:06:09.000 --> 00:06:12.600 플레이 버튼을 누르면 이 Bullet 총알은 위로 105 00:06:12.600 --> 00:06:15.693 슝 올라가게 되겠죠 106 00:06:15.693 --> 00:06:19.000 여기에서 우리가 차별화해서 봐야 될 부분이 있어요 107 00:06:19.000 --> 00:06:22.465 Bullet에는 지금 현재 Speed가 노출이 되어 있어요 108 00:06:22.465 --> 00:06:25.733 Player에는 없죠 109 00:06:25.733 --> 00:06:29.733 즉 기획자가 자신만의 이런 수치들을 110 00:06:29.733 --> 00:06:31.841 계속해서 수정하고 싶다면 111 00:06:31.841 --> 00:06:36.267 Player 같은 경우에는 계속 프로그래머한테 112 00:06:36.267 --> 00:06:39.515 이 숫자를 계속 수정해 달라고 요청을 해야 돼요 113 00:06:39.515 --> 00:06:40.828 그럼 Player가 작업하다 말고 114 00:06:40.828 --> 00:06:43.000 이 숫자를 계속해서 수정해 줘야 되죠 115 00:06:43.000 --> 00:06:46.000 이거는 굉장히 안 좋은 방식인 거예요 116 00:06:46.000 --> 00:06:49.650 직접 기획자가 자신만의 컴포넌트를 117 00:06:49.650 --> 00:06:52.346 수정할 수 있게끔 해주는 게 좋을 것 같습니다 118 00:06:52.346 --> 00:07:01.148 그래서 이 숫자를 Player도 총알처럼 이렇게 119 00:07:01.148 --> 00:07:03.000 5 이렇게 해주고 120 00:07:03.000 --> 00:07:07.800 이 speed 값을 이렇게 사용할 수 있도록 하면 121 00:07:07.800 --> 00:07:09.861 좋을 것 같아요 어떻게 했어요? 122 00:07:09.861 --> 00:07:13.261 PlayerMove에 public float speed라는 123 00:07:13.261 --> 00:07:15.000 속성을 하나 추가했고요 124 00:07:15.000 --> 00:07:17.350 이 속성 값 speed 변수를 125 00:07:17.350 --> 00:07:21.000 vt에서 사용할 수 있도록 이렇게 처리해 놨어요 126 00:07:21.000 --> 00:07:25.554 그러면 우리가 저장을 하고 가서 보면 127 00:07:25.554 --> 00:07:30.723 Player의 speed 5라는 게 이렇게 노출이 되죠 128 00:07:30.723 --> 00:07:34.000 그래서 이 값을 우리가 변경할 수가 있게 되는 거예요 129 00:07:34.000 --> 00:07:38.455 이렇게 기획자가 얼마든지 편하게 수정할 수 있게 되겠죠 130 00:07:38.455 --> 00:07:42.129 프로그래머한테 부탁하지 않고도 131 00:07:42.129 --> 00:07:44.851 이렇게 하는 방법을 알려드렸습니다 132 00:07:44.851 --> 00:07:47.267 Bullet도 이렇게 노출이 되어있죠 133 00:07:47.267 --> 00:07:51.673 그래서 플레이하면 총알은 위로 올라가고 134 00:07:51.673 --> 00:07:54.208 Player는 speed에 맞게끔 움직이고 135 00:07:54.208 --> 00:07:56.000 이 부분이 동작이 됐습니다 136 00:07:56.525 --> 00:08:00.356 총알 발사 제작 137 00:08:00.792 --> 00:08:04.475 이번에는 총알 발사를 해보도록 하겠습니다 138 00:08:04.475 --> 00:08:07.247 총알을 여러분들 방아쇠를 당긴다고 하면 139 00:08:07.247 --> 00:08:11.733 이런 과정들이 발생하게 돼요 140 00:08:11.733 --> 00:08:16.624 보시면 여러분들이 이렇게 방아쇠를 당길 거잖아요 141 00:08:16.624 --> 00:08:20.000 그러면 두 가지 방식이 있습니다 142 00:08:20.000 --> 00:08:22.450 첫 번째는 이 화면에서 보시는 것처럼 143 00:08:22.450 --> 00:08:25.000 총알 공장에 전화를 할 거예요 144 00:08:25.000 --> 00:08:27.000 공장에 주문을 하는 거죠 145 00:08:27.000 --> 00:08:29.300 그래서 총알을 받아가지고 146 00:08:29.300 --> 00:08:32.000 그때 발사하는 방법이 있을 거예요 147 00:08:32.000 --> 00:08:36.030 두 번째는 실제로 총알은 이렇게 나오겠지만 148 00:08:36.030 --> 00:08:41.000 이 총알을 보더라도 탄창 안에 총알들이 잔뜩 들어있죠 149 00:08:41.000 --> 00:08:43.247 그래서 어떻게 당길 때마다 150 00:08:43.247 --> 00:08:45.835 탄창에서 총알을 가져와서 탕탕탕 151 00:08:45.835 --> 00:08:49.436 발사하게 되는 구조인 거예요 152 00:08:49.436 --> 00:08:56.386 두 번째는 탄창에서 총알을 발사하게 되는 구조인 거예요 153 00:08:56.386 --> 00:09:01.317 당연하게 우리는 탄창에서 총알을 발사하도록 하겠지만 154 00:09:01.317 --> 00:09:04.267 실제로 탄창에 있는 총알도 155 00:09:04.267 --> 00:09:07.782 여기 있는 총알 공장에서부터 생산을 해서 와야겠죠 156 00:09:07.782 --> 00:09:10.832 실제 실무에서도 공장에서 직접 157 00:09:10.832 --> 00:09:14.000 이렇게 총알을 만들어내는 이 구조를 사용합니다 158 00:09:14.000 --> 00:09:18.000 여기서는 실무라는 건 바로 게임 쪽에서 얘기하는 거예요 159 00:09:18.000 --> 00:09:21.614 여기서 우리는 공장에 관련된 내용을 좀 보도록 할 거고요 160 00:09:21.614 --> 00:09:24.402 뒤에서 나중에 바로 저 탄창에 총알을 넣는 작업도 161 00:09:24.402 --> 00:09:26.911 한번 해보게 될 거예요 162 00:09:26.911 --> 00:09:29.611 좀 무식하지만 우리는 방아쇠를 당길 때마다 163 00:09:29.611 --> 00:09:31.109 이렇게 할 겁니다 164 00:09:31.109 --> 00:09:35.436 방아쇠를 당기면 총알 공장에 전화를 할 거예요 165 00:09:35.436 --> 00:09:40.186 그러면 이때 이 공장이 지금 연기가 나고 있지만 166 00:09:40.186 --> 00:09:46.138 멈춰져 있어요, 이때 여기에 간이용 침대에서 167 00:09:46.138 --> 00:09:49.505 마침 잠을 자고 있는 김군이 있습니다 168 00:09:49.505 --> 00:09:51.000 김군이 여기 자고 있어요 169 00:09:51.000 --> 00:09:53.654 띠리링 띠리링 전화가 울려요 170 00:09:53.654 --> 00:09:57.267 그러면 김군이 자다 말고 벌떡 일어나야겠죠 171 00:09:57.267 --> 00:10:03.000 아이고! 해서 여보세요 하고 전화를 받습니다 172 00:10:03.000 --> 00:10:06.000 그랬더니 제가 급하게 다급하게 얘기하는 거예요 173 00:10:06.000 --> 00:10:08.158 김군이라고 할게요 174 00:10:08.158 --> 00:10:10.608 야 김군아 나 지금 방아쇠 당겼어 175 00:10:10.608 --> 00:10:13.673 그러니까 빨리 총알 하나 만들어줘 176 00:10:13.673 --> 00:10:16.173 그럼 김군이 네 알겠습니다 하고 177 00:10:16.173 --> 00:10:23.000 바로 레버를 내려가지고 공장을 가동시키죠 178 00:10:23.000 --> 00:10:25.850 그러면 공장이 가동되어 있지 않으니까 179 00:10:25.850 --> 00:10:30.346 처음에 컨베이어 벨트가 먼저 움직여야 될 거예요 180 00:10:30.346 --> 00:10:33.416 그리고 재료를 넣는 통이 있다고 치면 181 00:10:33.416 --> 00:10:35.916 이 통에 납도 넣고 화약도 넣고 해서 182 00:10:35.916 --> 00:10:38.000 김군이 열심히 작업하죠 183 00:10:38.000 --> 00:10:41.950 그러면 어떻게? 이 납을 깎고 184 00:10:41.950 --> 00:10:46.416 화약을 다 제조해서 총알이 하나 띵 나오는 거죠 185 00:10:46.416 --> 00:10:48.564 이런 총알이 하나 띵 나오는 거예요 186 00:10:48.564 --> 00:10:50.327 그럼 이 총알을 어떻게? 187 00:10:50.327 --> 00:10:54.366 여기다가, 탑차에다가 총알을 싣죠 188 00:10:54.366 --> 00:10:57.000 이렇게 탑차에다가 총알을 실었어요 189 00:10:57.000 --> 00:11:03.604 그러면 이 도로를 따라서 탑차를 타고 옵니다 190 00:11:03.604 --> 00:11:05.436 그럼 저한테 하나 총알을 주는 거죠 191 00:11:05.436 --> 00:11:09.000 그러면 저는 여기에서 총알을 탕! 하고 쏘는 거예요 192 00:11:09.000 --> 00:11:12.000 슝 날아가겠죠 193 00:11:12.000 --> 00:11:16.000 그런데 이렇게 한 발만 쏠게 아니라 탕탕탕 쏠게요 194 00:11:16.000 --> 00:11:18.000 그럼 어떻게 될까요? 195 00:11:18.000 --> 00:11:21.594 전화를 해야겠죠 김군을 깨워야겠죠 196 00:11:21.594 --> 00:11:24.844 김군아 총알 하나 만들어줘 탕탕탕 했으면 197 00:11:24.844 --> 00:11:27.653 김군아 김군아 김군아 해야겠죠 198 00:11:27.653 --> 00:11:29.303 그럼 그때마다 김군이 일어나서 199 00:11:29.303 --> 00:11:32.198 레버 내려가지고 공장 가동시키고 200 00:11:32.198 --> 00:11:34.614 납을 넣고 화약을 넣고 깎아가지고 201 00:11:34.614 --> 00:11:37.000 총알을 하나 만들어내면 탑차 타고 나한테 배달해주고 202 00:11:37.000 --> 00:11:39.000 또 김군아 김군아 했으니까 그때마다 203 00:11:39.000 --> 00:11:41.752 이 작업을 계속 반복해야 될 거예요 204 00:11:41.772 --> 00:11:45.336 혹시 여러분들이 여기에서 어떻게 205 00:11:45.336 --> 00:11:48.247 우리가 흔히 무식하게 따발총이라고 하는 형태로 206 00:11:48.247 --> 00:11:53.327 버스트로 넣고 두루루 쏜다고 하면 어떻게 될까요? 207 00:11:53.327 --> 00:11:55.317 김구루루루운아! 이렇게 되겠죠 208 00:11:55.317 --> 00:11:58.317 그러면 김군은 계속해서 빠른 speed로 209 00:11:58.317 --> 00:12:01.495 이 작업을 계속해서 수행하게 될 거예요 210 00:12:01.495 --> 00:12:04.762 이거는 굉장히 비효율적이겠죠 211 00:12:04.762 --> 00:12:06.129 비효율적이 될 거예요 212 00:12:06.129 --> 00:12:12.643 여러분들이 이 과정에서 어쨌든 총알을 하나 만들려면 213 00:12:12.643 --> 00:12:15.752 이것은 반드시 발생할 수밖에 없어요 214 00:12:15.752 --> 00:12:17.752 여러분들이 이 과정을 개선한다고 하면 215 00:12:17.752 --> 00:12:19.485 어느 부분을 개선을 하면 216 00:12:19.485 --> 00:12:23.396 빠르게 총알을 계속해서 쏠 수 있을까요? 217 00:12:23.396 --> 00:12:26.396 어떤 분들은 속으로 이렇게 생각할 수 있어요 218 00:12:26.396 --> 00:12:29.196 아 이거 도로를 좀 개선하면 되지 않을까요? 219 00:12:29.196 --> 00:12:30.119 이렇게 생각할 수 있어요 220 00:12:30.119 --> 00:12:33.772 그럼 배송이 빨라지니까 그것도 괜찮을 수 있어요 221 00:12:33.772 --> 00:12:36.822 그런데 이렇게도 생각할 수 있지 않을까요? 222 00:12:36.822 --> 00:12:38.445 총알 공장이잖아 223 00:12:38.445 --> 00:12:41.267 한 발만 생산하니까 이건 좀 낭비 아닌가요? 224 00:12:41.267 --> 00:12:44.967 그리고 이 공장이 멈춰있다가 가동되는데 225 00:12:44.967 --> 00:12:48.624 너무 과부하가 걸리게 돼요 226 00:12:48.624 --> 00:12:51.158 그러니까 아예 공장을 돌린 김에 227 00:12:51.158 --> 00:12:54.653 그때 천발 만발 한 번에 만들어버리면 228 00:12:54.653 --> 00:12:57.000 공장은 그런 거 만들 땐 정말 빠를 거 아니에요 229 00:12:57.000 --> 00:12:59.000 만들어버리면 어떻게? 230 00:12:59.000 --> 00:13:02.564 그때는 얘를 만발 싣고서 달려버리면 되잖아 231 00:13:02.564 --> 00:13:06.406 그럼 나는 받아서 더 이상 공장에 주문할 필요 없이 232 00:13:06.406 --> 00:13:08.495 얼마든지 총알을 쏘면 되겠죠 233 00:13:08.495 --> 00:13:15.000 즉 이 부분에다가 한 번에 요청을 해버리는 거예요 234 00:13:15.000 --> 00:13:17.000 이렇게 하는 것들을 우리는 배칭이라고 해요 235 00:13:17.000 --> 00:13:20.000 일괄 처리한다고 하는 거예요, 배칭 236 00:13:20.000 --> 00:13:25.000 현실에서도 그런 과정이 일어나겠죠, Batch라고 해요 237 00:13:25.000 --> 00:13:27.000 현실에서도 당연히 그런 것처럼 238 00:13:27.000 --> 00:13:29.218 이 컴퓨터 쪽에서도 어떤 처리를 할 때 239 00:13:29.218 --> 00:13:31.436 이 똑같은 과정이 일어납니다 240 00:13:31.436 --> 00:13:33.564 용어를 정리하면 241 00:13:33.564 --> 00:13:40.653 이 공장을 우리 컴퓨터 소프트웨어에서 어떻게 얘기하냐면 242 00:13:40.653 --> 00:13:42.763 컴퓨터 사이언스에서는 얘를 파일이라고 얘기할 수 있어요 243 00:13:45.495 --> 00:13:49.614 그리고 이렇게 이 공장 파일로부터 만들어진 총알을 244 00:13:49.614 --> 00:13:53.178 인스턴스라고 얘기합니다 245 00:13:53.178 --> 00:13:54.634 이렇게 총알이 만들어졌죠? 246 00:13:54.634 --> 00:13:57.337 인스턴스를 저를 이렇게 가져다 줘야겠죠 247 00:13:57.337 --> 00:13:59.000 이렇게 가져다 주는 요거 있죠 248 00:13:59.000 --> 00:14:03.713 이 통로, 이 통로를 우리는 스트림이라고 하는 거예요 249 00:14:03.713 --> 00:14:07.000 Stream, a입니다 250 00:14:07.000 --> 00:14:09.247 스트림이라고 하는 거예요 251 00:14:09.247 --> 00:14:12.005 그러면 내가 파일을 읽어서 스트림을 통해서 252 00:14:12.005 --> 00:14:13.168 인스턴스를 받으면 253 00:14:13.168 --> 00:14:16.000 그때서야 총알을 보내는 거죠 254 00:14:16.000 --> 00:14:19.000 우리가 여러분들이 이미지를 하나 탐색해서 255 00:14:19.000 --> 00:14:21.000 더블 클릭해서 연다고 치면 256 00:14:21.000 --> 00:14:24.000 어때요? 파일을 더블 클릭해서 257 00:14:24.000 --> 00:14:25.703 얘가 열어달라고 하는 거예요 258 00:14:25.703 --> 00:14:26.802 더블 클릭하는 작업이고요 259 00:14:26.802 --> 00:14:31.352 그럼 파일이 열리면 스트림을 통해서 260 00:14:31.352 --> 00:14:33.406 메모리 데이터가 넘어옵니다 261 00:14:33.406 --> 00:14:37.505 걔를 화면에 출력하기 위해서는 인스턴스가 필요해요 262 00:14:37.505 --> 00:14:41.000 걔를 가져다가 화면에 픽셀을 찍는 거예요 263 00:14:41.000 --> 00:14:43.000 그래서 화면에 보이게 되는 거죠 264 00:14:43.000 --> 00:14:48.000 이 총알이 바로 화면에 보이는 이미지라고 보시면 되겠습니다 265 00:14:48.000 --> 00:14:50.000 이렇게 일련의 과정인데 266 00:14:50.000 --> 00:14:54.228 바로 이 파일을 여는 작업이 결국에는 느리다는 얘기예요 267 00:14:54.228 --> 00:14:55.654 파일을 여는 작업이 268 00:14:55.654 --> 00:14:58.000 그러면 한 번 열었을 때 269 00:14:58.000 --> 00:15:00.000 그때 왕창 생성해버리면 되겠죠 270 00:15:00.000 --> 00:15:02.000 그것들을 배칭이라고 하고요 271 00:15:02.000 --> 00:15:06.356 혹은 우리 쪽에서는 뭐라고 얘기할 수 있느냐 272 00:15:06.356 --> 00:15:10.436 용어를 너네 인력풀이 어떻게 돼? 273 00:15:10.436 --> 00:15:12.186 여분이 남으면 좀 줄래? 빌려줄래? 274 00:15:12.186 --> 00:15:13.099 이런 얘기도 하잖아요 275 00:15:13.099 --> 00:15:15.000 인력풀이라고 하잖아요 276 00:15:15.000 --> 00:15:17.000 이때 풀이라는 용어를 씁니다 277 00:15:17.000 --> 00:15:19.455 우리는 이때 총알, 게임 오브젝트잖아요 278 00:15:19.455 --> 00:15:21.955 이 오브젝트를 여분이 있게끔 279 00:15:21.955 --> 00:15:24.119 생산하는 이 작업을 Pool이라고 하고 280 00:15:24.119 --> 00:15:26.495 앞에 Object를 붙이는 거예요 281 00:15:26.495 --> 00:15:31.000 그러면 이것을 Object Pool이라고 합니다 282 00:15:31.000 --> 00:15:33.198 즉 이 속도를 개선하기 위해서 283 00:15:33.198 --> 00:15:35.048 미리 총알을 여러 개 284 00:15:35.048 --> 00:15:37.000 오브젝트를 여러 개 미리 만들어 놓는 작업을 285 00:15:37.000 --> 00:15:39.386 오브젝트 풀이라고 하는 거고요 286 00:15:39.386 --> 00:15:43.663 이 파일을 여는 거는 똑같은 구조로 네트워크 서버 287 00:15:43.673 --> 00:15:47.713 즉 여러분들이 네이버나 카카오 여러 가지 웹사이트에 288 00:15:47.713 --> 00:15:49.742 구글 같은 사이트에 접속한다고 하죠 289 00:15:49.742 --> 00:15:51.426 포털 사이트에 접속한다고 할 때 290 00:15:51.426 --> 00:15:53.554 그때 접속한다고 할 때 291 00:15:53.554 --> 00:15:56.604 얘네들의 네트워크에 접속하는 292 00:15:56.604 --> 00:15:58.911 이 Connection이라는 게 일어납니다 293 00:15:58.911 --> 00:16:01.000 연결이 되는 거죠 사용자들이 294 00:16:01.000 --> 00:16:02.109 이것도 마찬가지예요 295 00:16:02.109 --> 00:16:05.792 내가 사용자가 웹사이트에 두드리는 거예요 296 00:16:05.792 --> 00:16:08.317 그럼 여기에 커넥션이 만들어지는 거예요 297 00:16:08.317 --> 00:16:11.594 이것도 똑같이 파일을 열어서 하는 이 작업하고 똑같습니다 298 00:16:11.594 --> 00:16:14.109 데이터를 주고 받고 네트워크에서 299 00:16:14.109 --> 00:16:18.198 이때도 그러면 계속해서 접속할 때마다 300 00:16:18.198 --> 00:16:20.445 이런 작업이 생기면 느려지겠네요 301 00:16:20.445 --> 00:16:24.376 사용자들이 100만명이 붙어버리면 굉장히 느려지겠네요 302 00:16:24.376 --> 00:16:25.950 천만명이 붙어버리면 303 00:16:25.950 --> 00:16:28.188 심지어 서버가 다운될 수도 있겠죠 304 00:16:28.188 --> 00:16:31.544 이때 느려지니까 305 00:16:31.544 --> 00:16:33.832 파일을 여는 작업이 굉장히 느린 작업이에요 306 00:16:33.832 --> 00:16:37.327 혹은 네트워크 커넥션을 여는 작업이 느린 작업이에요 307 00:16:37.327 --> 00:16:40.000 그래서 그럼 커넥션도 풀이 있으면 좋겠네요 308 00:16:40.000 --> 00:16:43.000 그래서 얘를 Connection Pool이라고 합니다 309 00:16:43.000 --> 00:16:46.703 이런 일련의 컴퓨터 사이언스 용어들이 있어요 310 00:16:46.703 --> 00:16:49.158 그래서 우리 총알을 발사할 때는 311 00:16:49.158 --> 00:16:51.108 1차적으로 프로토타입에서는 이렇게 312 00:16:51.108 --> 00:16:53.703 공장에서 직접 만들어내는 과정을 할 거고요 313 00:16:53.703 --> 00:16:56.327 나중에 베타 버전에서는 오브젝트 풀을 이용해서 314 00:16:56.327 --> 00:16:59.127 미리 이 부분을 속도 개선을 하는 작업으로 315 00:16:59.127 --> 00:17:00.525 들어가도록 하겠습니다 316 00:17:00.525 --> 00:17:03.275 먼저 공장에서 이 총알을 만들어내는 작업을 317 00:17:03.275 --> 00:17:05.445 해보도록 하겠습니다 318 00:17:05.445 --> 00:17:09.000 비주얼 스튜디오에서 Bullet 이 부분 있죠 319 00:17:09.000 --> 00:17:11.218 이 애는 이미 만들어진 총알이에요 320 00:17:11.218 --> 00:17:15.000 그렇다면 우리는 저 총알을 발사를 해야 될 거 아니에요 321 00:17:15.000 --> 00:17:18.000 그래서 발사는 Player가 발사를 하게 되겠죠 322 00:17:18.000 --> 00:17:20.416 방아쇠를 Player가 당기니까, 그래서 323 00:17:20.416 --> 00:17:23.772 여기에는 Player 이동에 대한 스크립트는 있으니까 324 00:17:23.772 --> 00:17:26.703 이제 발사에 대한 스크립트를 하나 만들어서 붙여볼게요 325 00:17:28.465 --> 00:17:31.416 Project 창에서 + 눌러서 C#에서 326 00:17:31.416 --> 00:17:35.327 이번에는 PlayerFire라고 넣도록 하겠습니다 327 00:17:39.000 --> 00:17:40.762 이렇게 PlayerFire가 만들어지고요 328 00:17:40.762 --> 00:17:43.436 얘를 우리 Player 게임 오브젝트에 329 00:17:43.436 --> 00:17:45.136 드래그 앤 드롭으로 이렇게 붙여주면 330 00:17:45.136 --> 00:17:48.673 PlayerFire 스크립트가 만들어지겠습니다 331 00:17:48.673 --> 00:17:50.485 더블 클릭해서 열어볼게요 332 00:17:55.594 --> 00:17:58.445 PlayerFire에서 하는 일은 이래요 333 00:17:58.445 --> 00:18:05.366 사용자가 발사 버튼을 누르면 총알을 만들고 싶다 334 00:18:05.366 --> 00:18:07.337 이 내용을 할 거예요 335 00:18:07.337 --> 00:18:12.000 그러면 여기에서 필요한 속성은 어떤 게 있을까요 336 00:18:12.000 --> 00:18:14.604 기획자가 알려줘야 될 것 337 00:18:14.604 --> 00:18:17.742 총알 공장도 여러 개가 있을 수 있을 거 아니에요 338 00:18:17.742 --> 00:18:20.317 총알을 만들 때는 총알 공장에서 만든다고 했잖아요 339 00:18:20.317 --> 00:18:22.792 그러면 이 총알은 여러 개의 총알 공장이 있을 때 340 00:18:22.792 --> 00:18:25.000 어느 총알 공장에서 만들어야 되는지 341 00:18:25.000 --> 00:18:27.426 바로 총알 공장의 주소가 필요할 것 같아요 342 00:18:27.426 --> 00:18:30.228 그래서 여기에 총알 공장이 필요하겠습니다 343 00:18:32.465 --> 00:18:37.792 그리고 만들어져야 될 총알이 만들어졌으면 344 00:18:37.792 --> 00:18:40.208 어디에다가 놓고 발사를 하게 될지 345 00:18:40.208 --> 00:18:43.000 손에서 총알을 발사할 수는 없을 거 아니에요 346 00:18:43.000 --> 00:18:46.000 날개 쪽에서 발사해야 될지 총구에서 발사해야 될지 347 00:18:46.000 --> 00:18:47.000 이런 부분이 필요할 거예요 348 00:18:47.000 --> 00:18:51.000 그래서 총구가 필요할 수 있겠습니다 349 00:18:51.000 --> 00:18:53.650 필요 속성으로 이 두 가지를 350 00:18:53.650 --> 00:18:56.149 클래스의 속성으로 추가해 보도록 할게요 351 00:18:58.109 --> 00:19:00.614 먼저 총알 공장을 해보죠 352 00:19:00.614 --> 00:19:06.218 총알 공장은 여기에 보시면 353 00:19:06.218 --> 00:19:09.139 이미 만들어져 있는 이 총알이 있습니다 354 00:19:09.139 --> 00:19:12.495 이 총알을 만들기 위한 총알 공장을 할 때는 355 00:19:12.495 --> 00:19:15.366 어떤 식으로 하느냐? 이렇게 만들 수가 있어요 356 00:19:15.366 --> 00:19:19.000 보시면 Assets에 폴더를 하나 더 만들게요 357 00:19:19.000 --> 00:19:21.000 + 누르고 Folder를 해서 358 00:19:21.000 --> 00:19:26.535 이번에는 Prefabs라고 놓도록 하겠습니다 359 00:19:26.535 --> 00:19:29.000 Prefabs라는 폴더를 하나 만들고 360 00:19:29.000 --> 00:19:31.673 여기에 이 총알 공장이 361 00:19:31.673 --> 00:19:34.495 총알 공장은 우리 쪽에서는 파일이라고 했죠 362 00:19:34.495 --> 00:19:38.000 이 총알이 파일이 되었으면 좋겠어요 363 00:19:38.000 --> 00:19:41.000 그러면 우리가 그때마다 이 파일을 열어서 364 00:19:41.000 --> 00:19:43.455 이 총알이라는 인스턴스를 만들면 될 테니까 365 00:19:43.455 --> 00:19:45.465 즉 개념상으로 보면 어때요? 366 00:19:45.465 --> 00:19:50.000 이 Hierarchy에 있는 애는 인스턴스라는 애예요 367 00:19:50.000 --> 00:19:52.650 Hierarchy scene에 올라가는 얘네들은 다 368 00:19:52.650 --> 00:19:53.802 인스턴스라고 부릅니다 369 00:19:53.802 --> 00:19:55.238 인스턴스예요 370 00:19:55.238 --> 00:19:58.317 이미 만들어져서 메모리 올라가 있는 애예요 371 00:19:58.317 --> 00:20:00.167 그런데 아직 저장 공간에 372 00:20:00.167 --> 00:20:02.119 하드디스크에 저장이 되어 있지 않아요 373 00:20:02.119 --> 00:20:05.168 하드디스크에 저장하는 공간은 바로 이 프로젝트 창이죠 374 00:20:05.168 --> 00:20:09.267 즉 우리는 하드디스크에 저장되는 애들을 파일이라고 하죠 375 00:20:09.267 --> 00:20:13.643 그래서 여기에 있는 이 인스턴스가 파일이 됐으면 좋겠어 376 00:20:13.643 --> 00:20:15.891 그럼 얘가 어디에 있으면 돼요? 377 00:20:15.891 --> 00:20:19.594 프로젝트 창에 있으면 파일이 되겠네요 378 00:20:19.594 --> 00:20:22.525 개념상으로 이런 것처럼 유니티에서도 이 개념을 379 00:20:22.525 --> 00:20:25.416 이 UX를 사용합니다 380 00:20:25.416 --> 00:20:28.436 Bullet을 잡아서 드래그 앤 드롭으로 381 00:20:28.436 --> 00:20:30.772 Prefabs 폴더로 넣으면 382 00:20:30.772 --> 00:20:35.752 이렇게 Bullet이라는 이름의 총알 Prefabs가 만들어져요 383 00:20:35.752 --> 00:20:36.970 얘는 파일이고요 384 00:20:36.970 --> 00:20:38.720 우리가 유니티에선 이런 애들을 385 00:20:38.720 --> 00:20:41.039 Prefabs이라고 지칭합니다 386 00:20:41.039 --> 00:20:43.239 게임 오브젝트가 파일이 된 것 387 00:20:43.239 --> 00:20:46.198 이것들을 뭐라고 불러요? 388 00:20:46.198 --> 00:20:48.792 Prefabs이라고 부릅니다 389 00:20:48.792 --> 00:20:51.901 그러면 여기에 있는 총알은 색상도 어때요 390 00:20:51.901 --> 00:20:55.198 파란색으로 변했죠 391 00:20:55.198 --> 00:20:56.832 파란색으로 변했어요 392 00:20:56.832 --> 00:20:59.931 이 총알을, 여기에다가 만들어졌으니까 393 00:20:59.931 --> 00:21:03.574 이제 이 총알은 사용자가 발사 버튼을 눌렀을 때만 394 00:21:03.574 --> 00:21:05.000 만들어지도록 처리할게요 395 00:21:05.000 --> 00:21:07.000 얘는 Delete 눌러서 지워도 돼요 396 00:21:07.000 --> 00:21:09.386 왜? 이미 파일로 되어 있으니까 397 00:21:09.386 --> 00:21:11.386 어? 다시 사용하고 싶으면요? 398 00:21:11.386 --> 00:21:13.465 드래그 앤 드롭 얼마든지 해서 399 00:21:13.465 --> 00:21:18.198 여기다 놓든 여기다 놓든 가져오실 수가 있어요 400 00:21:18.198 --> 00:21:21.257 총알을 얼마든지 우리가 원하는 곳에다가 401 00:21:21.257 --> 00:21:24.475 인스턴스로 이렇게 만들어낼 수가 있어요 402 00:21:24.475 --> 00:21:27.257 파일이 있다면 파일을 열면 되니까 계속 403 00:21:27.257 --> 00:21:30.327 그래서 여기에 총알을 얼마든지 만들어낼 수 있다 404 00:21:30.327 --> 00:21:32.416 근데 이것을 언제 만들어낼까요 405 00:21:32.416 --> 00:21:34.475 사용자가 발사 버튼을 눌렀을 때 406 00:21:34.475 --> 00:21:38.000 얘가 바로 총알 공장이 되는 거예요 407 00:21:38.000 --> 00:21:39.525 얘는 뭐예요? 408 00:21:39.525 --> 00:21:42.683 게임 오브젝트가 파일이 된 거죠 409 00:21:42.683 --> 00:21:43.871 에셋이 된 거예요 410 00:21:43.871 --> 00:21:47.148 그래서 저 총알 공장은 이렇게 선언할 수가 있습니다 411 00:21:47.148 --> 00:21:54.009 속성으로 public GameObject bulletFactory 412 00:21:54.009 --> 00:21:55.346 이렇게 놓으면 어때요? 413 00:21:55.346 --> 00:21:58.564 총알 공장을 받기 위한 거예요, 변수예요 414 00:21:58.564 --> 00:22:00.000 왜 게임 오브젝트인가요 415 00:22:00.000 --> 00:22:03.208 총알 공장, 우리가 만드는 프리패브는 뭐였어요 애초에? 416 00:22:03.208 --> 00:22:06.000 게임 오브젝트였죠 417 00:22:06.000 --> 00:22:08.450 Player에 보면 Player Fire에 418 00:22:08.450 --> 00:22:11.000 Bullet Factory가 나타나고 419 00:22:11.000 --> 00:22:12.750 이 Bullet을 드래그 앤 드롭으로 420 00:22:12.750 --> 00:22:15.000 이렇게 넣을 수가 있게 되는 거예요 421 00:22:15.000 --> 00:22:18.000 즉 총알 공장이 연결이 된 거예요 422 00:22:18.000 --> 00:22:20.832 이름을 유의해서 보셔야 돼요 423 00:22:20.832 --> 00:22:22.228 얘는 총알이 아니라 뭐예요? 424 00:22:22.228 --> 00:22:24.614 총알 공장인 거죠 425 00:22:24.614 --> 00:22:29.000 그다음에 총구는 어떻게 만들까요? 426 00:22:29.000 --> 00:22:34.396 여기에다가 public GameObject 427 00:22:34.396 --> 00:22:37.376 firePosition 이렇게 넣도록 하겠습니다 428 00:22:37.376 --> 00:22:40.000 그러면 총구를 만들어낸 거예요 429 00:22:40.000 --> 00:22:42.554 저희는 아직 총구가 없는데요? 430 00:22:42.554 --> 00:22:46.495 그렇죠, 총구를 한번 만들어 볼까요? 431 00:22:46.495 --> 00:22:49.237 보도록 하겠습니다, 총구는 이 Player에 432 00:22:49.237 --> 00:22:52.733 이 정도 위치쯤에 있으면 좋을 것 같아요 433 00:22:52.733 --> 00:22:54.583 만약에 나중에 날개가 달려 434 00:22:54.583 --> 00:22:57.663 그러면 2발이 나오게 하고 싶어요 435 00:22:57.663 --> 00:23:00.752 그러면 이 부분에다가 넣으면 되겠죠? 436 00:23:00.752 --> 00:23:03.663 여기에서 총알이 나가도록 437 00:23:03.663 --> 00:23:05.063 지금 현재 그게 없으니까 438 00:23:05.063 --> 00:23:06.841 이 부분 쯤에서 총알이 나가도록 439 00:23:06.841 --> 00:23:09.485 이렇게 처리를 해보도록 하겠습니다 440 00:23:09.485 --> 00:23:12.129 그래서 Player에 선택하고 441 00:23:12.129 --> 00:23:16.069 여기에서 +를 누르고 Create Empty 하면 442 00:23:16.069 --> 00:23:19.643 이렇게 같은 Hierarchy 구조에서 레벨로 올라가죠 443 00:23:19.643 --> 00:23:21.119 저희는 이렇게 드래그 앤 드롭으로 444 00:23:21.119 --> 00:23:24.515 Player한테 넣을 수도 있겠지만 이 방법도 있어요 445 00:23:24.515 --> 00:23:27.089 Player를 누르고 마우스 우 클릭을 하면 446 00:23:27.089 --> 00:23:30.139 여기에서도 Create Empty 447 00:23:30.139 --> 00:23:32.178 혹은 3D Object 이런 것들이 나타나요 448 00:23:32.178 --> 00:23:34.822 여기에서 Create Empty를 눌러볼까요 449 00:23:34.822 --> 00:23:39.267 그러면 Player의 자식으로 등록이 되죠 450 00:23:39.267 --> 00:23:42.208 위치는 0, 0에 등록이 되고요 451 00:23:42.208 --> 00:23:46.049 얘 이름은 FirePosition이라고 넣도록 하겠습니다 452 00:23:46.049 --> 00:23:47.396 총구로 453 00:23:49.921 --> 00:23:52.445 그러면 왜 Empty로 해놨느냐 454 00:23:52.445 --> 00:23:55.346 얘는 눈에 보일 필요가 없어서 이렇게 해놨어요 455 00:23:55.346 --> 00:23:59.356 눈에 보일 필요가 없었더니 Transform만 그대로 있죠 456 00:23:59.356 --> 00:24:05.515 위치하고 회전각과 크기만 조절할 수 있는 이것만 있어요 457 00:24:05.515 --> 00:24:09.346 저는 이 FirePosition을 잡아서 458 00:24:09.346 --> 00:24:11.366 이쯤에다가 이렇게 넣도록 하겠습니다 459 00:24:11.366 --> 00:24:15.693 그러면 이 부분에서 총알이 나가겠네요 460 00:24:15.693 --> 00:24:18.238 그래서 Player를 다시 선택해보면 461 00:24:18.238 --> 00:24:21.000 여기에 FirePosition을 넣도록 해놨잖아요? 462 00:24:21.000 --> 00:24:23.400 이 부분에 이 FirePosition을 463 00:24:23.400 --> 00:24:26.307 드래그 앤 드롭으로 넣어 주도록 하겠습니다 464 00:24:26.307 --> 00:24:29.634 그러면 FirePosition이 할당이 됐어요 465 00:24:29.634 --> 00:24:32.742 만약에 public이 없다면 어떻게 될까요? 466 00:24:32.742 --> 00:24:36.277 public이 없다면 467 00:24:36.277 --> 00:24:41.733 가서 보면 FirePosition은 없어졌죠 468 00:24:41.733 --> 00:24:42.633 왜 그러느냐? 469 00:24:42.633 --> 00:24:45.792 이 public만 외부에 노출이 될 수가 있어요 470 00:24:45.792 --> 00:24:48.802 그래서 얘를 public 이렇게 붙여주셔야 돼요 471 00:24:48.802 --> 00:24:51.123 만약에 아무것도 안 쓰면 기본적으로 472 00:24:51.123 --> 00:24:55.257 접근 제한자는 Private입니다 473 00:24:55.257 --> 00:25:00.931 그래서 bulletFactory, firePosition까지 노출하도록 했습니다 474 00:25:00.931 --> 00:25:05.331 그러면 이제 사용자가 발사 버튼을 눌렀을 때 475 00:25:05.331 --> 00:25:07.681 총알을 만들어낼 수 있도록 476 00:25:07.681 --> 00:25:09.440 이 부분을 구현해 보도록 할게요 477 00:25:09.440 --> 00:25:13.140 이런 문장들은 반드시 함수에 들어갈 수 있고요 478 00:25:13.140 --> 00:25:15.553 우리가 아는 함수는 지금 Start 아니면 Update 479 00:25:15.553 --> 00:25:17.400 이 둘 중에 하나밖에 없어요 480 00:25:17.400 --> 00:25:20.050 여러분들이 자체적으로 함수를 만든다고 해도 481 00:25:20.050 --> 00:25:21.400 그 함수의 호출은 반드시 482 00:25:21.400 --> 00:25:23.400 Start 아니면 Update를 넣어 주셔야 돼요 483 00:25:23.400 --> 00:25:26.450 그럼 저 문장은 어디에서 구현이 되어야 될까요? 484 00:25:26.450 --> 00:25:29.050 호출이 바로 Update에서 485 00:25:29.050 --> 00:25:34.200 Start에서 하면 태어날 때 한번 총알이 되겠죠 486 00:25:34.200 --> 00:25:37.200 그리고 심지어 발사 버튼을 누르지도 못할 수 있어요 487 00:25:37.200 --> 00:25:40.500 그러니까 살아가는 동안 사용자가 발사 버튼을 누르면 488 00:25:40.500 --> 00:25:42.600 그때마다 계속해서 총알을 만들어낼 수 있도록 489 00:25:42.600 --> 00:25:45.919 Update에다가 넣어 놓도록 하겠습니다 490 00:25:45.919 --> 00:25:48.219 이걸 하려면 궁극적으로 하고 싶은 건 491 00:25:48.219 --> 00:25:53.080 총알을 발사하고 싶은 거죠, 이거잖아요 492 00:25:53.080 --> 00:25:57.080 총알을 만들어 내는 거잖아요, 그렇죠? 493 00:25:57.080 --> 00:26:00.520 그렇다면 총알을 발사하려면 뭐가 필요하죠? 494 00:26:00.520 --> 00:26:04.703 총알이 있어야죠 495 00:26:04.703 --> 00:26:07.803 총알이 있어야 총알을 발사할 거 아니에요 496 00:26:07.803 --> 00:26:10.839 그리고 여기서 질문이 있어요 497 00:26:10.839 --> 00:26:14.991 총알을 갑자기 왜 만들까요? 이 문장대로 보면 498 00:26:14.991 --> 00:26:21.519 사용자가 발사 버튼을 눌렀으니까 499 00:26:21.519 --> 00:26:24.819 이 세 가지가 있기 때문에 500 00:26:24.819 --> 00:26:27.769 사용자가 발사 버튼을 눌러서 그래서 총알을 만들고 501 00:26:27.769 --> 00:26:29.911 그 총알이 발사가 되는 이 구조인거예요 502 00:26:29.911 --> 00:26:32.960 엄밀히 말하면 총알을 발사한다는 것은 503 00:26:32.960 --> 00:26:34.610 총알을 만들어 놓으면 저희는 위로 이미 504 00:26:34.610 --> 00:26:36.240 올라가도록 해놨잖아요 505 00:26:36.240 --> 00:26:38.800 총알은 어디에서 나갈지만 정하면 될 거예요 506 00:26:38.800 --> 00:26:45.560 그래서 총알은 위치를 이렇게 설정만 해주면 507 00:26:45.560 --> 00:26:47.520 총알을 만들어서 위치 설정을 해주면 508 00:26:47.520 --> 00:26:50.120 그 위치에서 나가게 되겠죠 509 00:26:50.120 --> 00:26:53.080 그래서 순서대로 보면 사용자가 발사 버튼을 눌러서 510 00:26:53.080 --> 00:26:56.280 총알을 만들고 총알의 위치를 설정하는 511 00:26:56.280 --> 00:27:00.680 이렇게 되는 게 가장 중요한 흐름이라고 512 00:27:00.680 --> 00:27:02.759 볼 수가 있겠습니다 513 00:27:02.759 --> 00:27:06.360 그럼 사용자의 발사 버튼을 눌렀다면 514 00:27:06.360 --> 00:27:08.959 이런 것들은 만약 사용자가 발사 버튼을 눌렀다면 515 00:27:08.959 --> 00:27:10.320 이렇게 볼 수 있겠죠 516 00:27:10.320 --> 00:27:14.870 그때 사용하는 이 C# 언어에서의 문법은 517 00:27:14.870 --> 00:27:17.560 if라는 애를 사용합니다 518 00:27:17.560 --> 00:27:20.520 if 사용자의 입력은 다 어떤 게 처리하냐면 519 00:27:20.520 --> 00:27:23.439 Input이라는 클래스가 처리한다고 얘기했어요 520 00:27:23.439 --> 00:27:26.641 이제 . 하면 속성 혹은 기능 중에 521 00:27:26.641 --> 00:27:28.966 우리가 사용할 것은 함수 522 00:27:28.966 --> 00:27:32.891 기능 GetButtonDown 하면 523 00:27:32.891 --> 00:27:34.599 버튼을 눌렀다는 거예요 524 00:27:34.599 --> 00:27:35.959 그럼 눌렀다가 뗀 것도 있겠네요? 525 00:27:35.959 --> 00:27:38.665 그러면 ButtonUp도 있고요 526 00:27:38.665 --> 00:27:42.639 여기 보시면 Down은 누른 것, Up은 뗀 것 527 00:27:42.639 --> 00:27:44.289 그럼 계속 누르고 있는 건? 528 00:27:44.289 --> 00:27:46.720 GetButton 하고 있는 거죠 529 00:27:46.720 --> 00:27:49.470 얘는 GetButton을 계속해서 누르고 있을 때 530 00:27:49.470 --> 00:27:51.120 GetButton을 사용합니다 531 00:27:51.120 --> 00:27:53.639 저희는 딱 누르는 그 순간을 사용할 것이기 때문에 532 00:27:53.639 --> 00:27:56.559 GetButtonDown을 사용하도록 할게요 533 00:27:56.559 --> 00:28:00.239 여기에서 Fire1 하면 마우스 왼쪽 버튼 534 00:28:00.239 --> 00:28:04.680 혹은 왼쪽 Ctrl 버튼을 클릭했을 때에요 535 00:28:04.680 --> 00:28:09.380 이때 아래 있는 이 내용들이 구현이 되도록 536 00:28:09.380 --> 00:28:12.599 처리하면 되겠습니다 537 00:28:12.599 --> 00:28:16.149 Fire1은 유니티의 Edit 메뉴의 538 00:28:16.149 --> 00:28:17.680 Project Settings에 보면은 539 00:28:17.680 --> 00:28:20.959 Input Manager가 있죠 540 00:28:20.959 --> 00:28:23.400 Project Settings에 Input Manager가 있습니다 541 00:28:23.400 --> 00:28:26.464 여기에 Fire1이 이렇게 설정이 되어 있어요 542 00:28:29.959 --> 00:28:33.559 그래서 먼저 사용자가 발사 버튼을 눌렀다는 건 543 00:28:33.559 --> 00:28:34.639 이 부분이 될 거고요 544 00:28:34.639 --> 00:28:37.720 이게 참이면 버튼을 누른 거니까 545 00:28:37.720 --> 00:28:40.679 총알을 만들면 돼요 546 00:28:40.679 --> 00:28:43.759 총알을 만드는 건 유니티에서 어떻게 하느냐 547 00:28:43.759 --> 00:28:46.809 Instantiate, 김군아 총알 공장에서 548 00:28:46.809 --> 00:28:48.839 총알 하나 만들어줘 하는 내용에 549 00:28:48.839 --> 00:28:51.320 그리고 나한테 가져다 줘, 여기까지가 다 뭐냐면 550 00:28:51.320 --> 00:28:55.000 바로 Instantiate라는 팩토리 메소드라고 합니다 551 00:28:55.000 --> 00:28:55.950 팩토리 함수 552 00:28:55.950 --> 00:29:00.759 이 안에서 자동으로 다 만들어주는 역할까지 해줍니다 553 00:29:00.759 --> 00:29:02.440 그리고 나한테 가져다 주는 것까지 554 00:29:02.440 --> 00:29:05.440 이게 바로 총알 공장에서 총알을 만드는 거예요 555 00:29:05.440 --> 00:29:08.399 Instantiate, 여기에 총알 공장을 넣어주면 돼요 556 00:29:08.399 --> 00:29:12.759 bulletFactory, 총알 공장을 넣어주면 557 00:29:12.759 --> 00:29:15.240 그렇게 해서 총알을 하나 만들어주고 558 00:29:15.240 --> 00:29:16.520 그냥 게임 오브젝트 있죠? 559 00:29:16.520 --> 00:29:19.199 이런 게임 오브젝트들 아무거나 넣어주면 560 00:29:19.199 --> 00:29:22.158 걔를 클론 복제해서도 만들어줍니다 561 00:29:24.039 --> 00:29:25.440 얘는 함수일 뿐이에요 562 00:29:25.440 --> 00:29:27.279 나한테 이렇게 하나를 만들어줬다면 563 00:29:27.279 --> 00:29:29.720 저는 위치 설정하고 이런 작업들을 할 때 564 00:29:29.720 --> 00:29:32.080 변수에다가 담아서 쓰면 되겠어요 565 00:29:32.080 --> 00:29:38.119 GameObject bullet 이렇게 하면 되겠습니다 566 00:29:38.119 --> 00:29:41.000 여기에서 있는 얘는 총알 공장이고 567 00:29:41.000 --> 00:29:42.119 얘는 뭐에요? 568 00:29:42.119 --> 00:29:47.399 얘는 파일이고 얘는 인스턴스라고 부르는 거죠 569 00:29:47.399 --> 00:29:50.000 여기서부터 나온 인스턴스를 여기에 담아놨으니까 570 00:29:50.000 --> 00:29:52.000 이게 인스턴스라고 보시면 됩니다 571 00:29:52.000 --> 00:29:54.100 이 변수 자체를 572 00:29:54.100 --> 00:29:56.679 총알의 위치는 그럼 어떻게 설정하느냐 573 00:29:56.679 --> 00:30:01.079 bullet. 하면 네가 가지고 있는 속성 혹은 기능 중에 574 00:30:01.079 --> 00:30:02.520 원을 그리면 되죠? 575 00:30:02.520 --> 00:30:04.520 여기에 위치는 누가 갖고 있어요 576 00:30:04.520 --> 00:30:06.919 transform이 갖고 있죠, 게임 오브젝트에 577 00:30:06.919 --> 00:30:10.320 그리고 transform. 하면 또 속성 혹은 기능 중에 578 00:30:10.320 --> 00:30:13.639 위치는 뭐예요? position이죠 579 00:30:13.639 --> 00:30:16.199 이 총알의 위치는 어디로 설정할 거냐 580 00:30:16.199 --> 00:30:18.600 우리가 여기에 담았던 이 총구의 위치 581 00:30:18.600 --> 00:30:21.720 이 부분이 바로 이 총구, firePosition이죠 582 00:30:21.720 --> 00:30:26.775 얘를 .transform.position 583 00:30:26.775 --> 00:30:31.902 이렇게 하면 총구의 위치로 할당이 되는 거예요 584 00:30:31.902 --> 00:30:36.119 됐죠? 저장을 하고요 585 00:30:36.119 --> 00:30:38.883 가서 플레이 버튼을 눌러보도록 하겠습니다 586 00:30:44.091 --> 00:30:47.160 그러면 탕탕탕탕 총알이 나가게 되죠 587 00:30:47.160 --> 00:30:49.359 이동하면서 쏴도 나가게 될 거예요 588 00:30:49.359 --> 00:30:52.241 보시면 어때요? 총구의 위치에 따라서 589 00:30:52.241 --> 00:30:54.000 그 위치에서 나가는 것을 볼 수 있죠 590 00:30:54.000 --> 00:30:55.559 제가 여기다 놔볼까요? 591 00:30:55.559 --> 00:30:58.279 탕탕탕탕 그러면 저 위치에서 나가죠 592 00:30:58.279 --> 00:31:00.359 신기하게도 제가 플레이 버튼을 꺼볼게요 593 00:31:00.359 --> 00:31:02.799 그럼 이 총구의 위치가 여기 있는데 어디로 가 있을까요? 594 00:31:02.799 --> 00:31:05.399 끄면 다시 원래대로 돌아가 있죠 595 00:31:05.399 --> 00:31:06.999 플레이 버튼을 눌렀을 때 596 00:31:06.999 --> 00:31:08.920 우리가 어떤 값들을 수정하거나 하면 597 00:31:08.920 --> 00:31:10.320 반영이 되지 않는 거예요 598 00:31:10.320 --> 00:31:13.959 왜? 이것들이 저장되는 건 파일에 저장이 되는 거지 599 00:31:13.959 --> 00:31:15.109 이 플레이 버튼이 있을 때는 600 00:31:15.109 --> 00:31:17.160 파일에 저장이 되는 건 아닌 거예요 601 00:31:17.160 --> 00:31:20.560 그래서 이거는 일시적으로 602 00:31:20.560 --> 00:31:23.600 플레이하는 동안에만 존재하는 거예요, 데이터가 603 00:31:23.600 --> 00:31:26.959 그러면 이렇게 저장되는 이것들이 저장이 되게 하고 싶으면 604 00:31:26.959 --> 00:31:29.640 나중에 저장이라는 개념까지 배우셔야 돼요 605 00:31:29.640 --> 00:31:32.453 그것들은 베타 버전에서 작업을 해보도록 하겠습니다 606 00:31:34.760 --> 00:31:36.925 이렇게 해서 총알을 발사하는 것 까지 해봤습니다 607 00:31:37.575 --> 00:31:41.367 적 이동 제작 608 00:31:41.880 --> 00:31:46.119 그러면 이번에는 적 이동 제작을 해보도록 하겠습니다 609 00:31:46.119 --> 00:31:48.239 먼저 적을 이동하려면 적이 있어야겠죠? 610 00:31:48.239 --> 00:31:52.000 그래서 먼저 적부터 만들어 보도록 하겠습니다 611 00:31:52.000 --> 00:31:58.079 Hierarchy에서 + 누르고 3D Object의 Cube 612 00:31:58.079 --> 00:32:00.839 이름은 Enemy라고 할게요 613 00:32:00.839 --> 00:32:03.600 여러분들이 눈치 채셨는지는 모르겠지만 614 00:32:03.600 --> 00:32:08.519 계속 같은 과정으로 플레이어부터 총알, 적까지 나올 동안 615 00:32:08.519 --> 00:32:09.880 같은 내용으로 하고 있습니다 616 00:32:09.880 --> 00:32:11.679 제일 먼저 뭘 해요? 617 00:32:11.679 --> 00:32:14.320 게임 오브젝트를 하나 만들죠 618 00:32:14.320 --> 00:32:16.399 하이어라키에서 큐브를 하나 만들고요 619 00:32:16.399 --> 00:32:20.720 그다음에 스크립트를 만들고, 스크립트를 할당하고 620 00:32:20.720 --> 00:32:22.320 그다음에 코딩을 하고 621 00:32:22.320 --> 00:32:25.480 이 흐름으로 계속해서 컨텐츠를 만들어가는 거예요 622 00:32:25.480 --> 00:32:29.279 유니티로 컨텐츠를 만들 때 가장 어려운 부분이 623 00:32:29.279 --> 00:32:30.880 다 기능별로는 학습할 수 있어요 624 00:32:30.880 --> 00:32:33.760 하지만 어떻게 시작해서 컨텐츠를 만들어 갈까에 대한 625 00:32:33.760 --> 00:32:35.160 어려움이 있을 수 있거든요 626 00:32:35.160 --> 00:32:36.760 그런 부분 어떻게 한다고요? 627 00:32:36.760 --> 00:32:38.279 이렇게 따라 하시면 되겠습니다 628 00:32:38.279 --> 00:32:39.320 먼저 어떻게 한다고요? 629 00:32:39.320 --> 00:32:42.959 게임 오브젝트를 하나 만들고, 큐브를 만들고 630 00:32:42.959 --> 00:32:46.399 걔에다가 스크립트를 만들어서 할당을 하고 631 00:32:46.399 --> 00:32:48.749 물론 스크립트는 컨트롤이 필요한 632 00:32:48.749 --> 00:32:51.480 게임 오브젝트한테만 할당하는 거예요 633 00:32:51.480 --> 00:32:54.440 이 흐름으로 계속해서 등장인물 형태로 계속해서 634 00:32:54.440 --> 00:32:57.440 만들어 나가시면 되겠습니다 635 00:32:57.440 --> 00:32:59.200 이렇게 Enemy가 만들어졌으니까 636 00:32:59.200 --> 00:33:01.720 얘한테 스크립트도 할당을 해볼 거예요 637 00:33:01.720 --> 00:33:05.679 그 전에 먼저 트랜스폼의 위치를 0, 0, 0으로 놓고 638 00:33:05.679 --> 00:33:08.079 저는 위에다가 이렇게 놓도록 할게요 639 00:33:08.079 --> 00:33:09.729 그래서 얘가 밑으로 슉 떨어지는 640 00:33:09.729 --> 00:33:12.440 에너미를 만들어 보려고 해요 641 00:33:12.440 --> 00:33:17.399 Enemy의 Scripts에 642 00:33:17.399 --> 00:33:23.160 C# Script에서 이름은 643 00:33:23.160 --> 00:33:28.480 Enemy라고 넣도록 할게요, 이렇게 644 00:33:28.480 --> 00:33:30.799 그러면 Enemy가 만들어지고 645 00:33:30.799 --> 00:33:32.959 이 Enemy 게임 오브젝트에다가 646 00:33:32.959 --> 00:33:36.640 얘를 드래그 앤 드롭으로 넣어 주도록 하겠습니다 647 00:33:36.640 --> 00:33:39.559 이제 스크립트를 편집을 해볼게요 648 00:33:39.559 --> 00:33:41.079 Enemy 스크립트 여기 있죠? 649 00:33:41.079 --> 00:33:42.160 여기를 클릭하셔도 되고 650 00:33:42.160 --> 00:33:44.248 여기를 더블 클릭해서 열어주셔도 됩니다 651 00:33:48.030 --> 00:33:52.254 이렇게 Enemy를 편집할 수 있는 652 00:33:52.254 --> 00:33:54.959 비주얼 스튜디오가 열리면요 653 00:33:54.959 --> 00:33:56.160 여기서 하고 싶은 건 654 00:33:56.160 --> 00:33:59.679 얘는 총알은 계속 위로 올라갔다면 655 00:33:59.679 --> 00:34:04.359 에너미는 아래로 계속 이동하고 싶다 656 00:34:04.359 --> 00:34:06.589 여기에서도 필요한 속성은 뭘까요? 657 00:34:09.440 --> 00:34:12.399 바로 이동 속도가 되겠습니다 658 00:34:12.399 --> 00:34:15.760 그래서 public float speed 659 00:34:15.760 --> 00:34:18.483 얘는 Player와 같은 속도로 맞춰 놓도록 하겠습니다 660 00:34:21.928 --> 00:34:25.320 그리고 아래로 계속 이동하고 싶은 이 내용은 661 00:34:25.320 --> 00:34:26.720 바로 계속 이동을 해야 되니까 662 00:34:26.720 --> 00:34:29.880 Update에서 들어가게 될 거고 663 00:34:29.880 --> 00:34:34.079 똑같죠? 방향을 구하고 그 방향으로 이동하는 형태 664 00:34:34.079 --> 00:34:41.720 그래서 얘는 Vector3에 665 00:34:41.720 --> 00:34:43.720 dir을 놓고, 방향은 뭐예요? 666 00:34:43.720 --> 00:34:48.799 Vector3에 Down 하시면 아래로라는 게 되고요 667 00:34:48.799 --> 00:34:49.839 그 다음 이동하고 싶다 668 00:34:49.839 --> 00:34:53.320 P=P0+vt 한 번에 쓸 수 있다고 했죠 669 00:34:53.320 --> 00:34:59.927 transform의 position은 어떻게 돼요? 670 00:34:59.927 --> 00:35:06.199 transform.position = dir * speed * Time.deltaTime 671 00:35:06.199 --> 00:35:08.599 이렇게 하셔도 되겠지만 이거는 어때요? 672 00:35:08.599 --> 00:35:11.880 현재의 위치를 단순하게 갱신하는 거죠 673 00:35:11.880 --> 00:35:14.030 P=vt일 뿐이에요 674 00:35:14.030 --> 00:35:17.630 얘가 정상적으로 활동하려면 P=P0+니까 675 00:35:17.630 --> 00:35:22.305 이렇게 하시면 되겠죠, 얘한테 이렇게 676 00:35:22.305 --> 00:35:25.055 그러면 어때요? P0+vt 677 00:35:25.055 --> 00:35:28.799 근데 얘도 언어다보니까 말 줄임이 됩니다 678 00:35:28.799 --> 00:35:31.099 선생님을 쌤 이렇게 하는 것처럼 679 00:35:31.099 --> 00:35:33.749 음식물 쓰레기를 음쓰, 이렇게 줄여서 하죠 680 00:35:33.749 --> 00:35:38.039 얘도 줄여서 쓸 수가 있어요 이렇게 681 00:35:38.039 --> 00:35:43.558 이렇게 하면 P=P0+vt 이렇게 된 거예요 682 00:35:43.558 --> 00:35:47.158 마찬가지로 우리 Bullet에서도 가서 보면 683 00:35:47.158 --> 00:35:49.358 똑같이 이렇게 되어 있죠 684 00:35:49.358 --> 00:35:51.840 이 부분을 줄일 수가 있겠네요 685 00:35:51.840 --> 00:35:55.948 Bullet에서도 += 이렇게 쓸 수가 있겠죠 686 00:35:58.200 --> 00:36:02.050 마찬가지로, 맞죠? 그래서 에너미나 총알이나 687 00:36:02.050 --> 00:36:05.900 P=P0+vt에서 transform은 더하기를 688 00:36:05.900 --> 00:36:08.360 이렇게 하시면 되겠습니다 689 00:36:08.360 --> 00:36:09.447 저장하고요 690 00:36:14.477 --> 00:36:21.096 봐 볼게요, 플레이 버튼 누르면 아래로 내려오는 691 00:36:21.096 --> 00:36:24.951 에너미를 만들 수가 있습니다 692 00:36:24.951 --> 00:36:29.201 이렇게 아는 아래로 내려오는 에너미를 만들 수 있고요 693 00:36:29.201 --> 00:36:32.051 벡터를 조금 더 활용을 해 가지고 694 00:36:32.051 --> 00:36:35.687 이 에너미가 플레이어 쪽으로 이동하도록 하는 코드도 695 00:36:35.687 --> 00:36:38.487 작성을 해보도록 할게요 696 00:36:38.487 --> 00:36:41.751 벡터의 빼기를 이용하면 되겠죠? 697 00:36:41.751 --> 00:36:46.635 그래서 이번에 하고 싶은건 아래로 가 아니라 추가로 698 00:36:50.839 --> 00:36:52.391 타겟 쪽으로 699 00:36:55.400 --> 00:37:00.500 타겟 쪽으로 계속 이동하고 싶다 700 00:37:00.500 --> 00:37:03.480 그러면 필요 속성의 이동속도 말고도 또 뭐가 필요하죠? 701 00:37:03.480 --> 00:37:06.146 바로 타겟이 필요한 거예요 702 00:37:08.199 --> 00:37:11.899 이 타겟은 public 703 00:37:11.899 --> 00:37:15.049 타겟은 월드상에 있는 플레이어죠 704 00:37:15.049 --> 00:37:18.679 얘는 자료형이 게임 오브젝트 705 00:37:18.679 --> 00:37:22.055 그래서 여기다가 GameObject라고 넣어 주도록 하겠습니다 706 00:37:24.399 --> 00:37:28.449 자 public GameObject 다음에 target 707 00:37:28.449 --> 00:37:31.960 이렇게 넣으면 되겠죠, 근데 궁극적으로 필요한 건 708 00:37:31.960 --> 00:37:35.510 게임 오브젝트가 아니라 이 타겟의 위치가 필요한 거잖아요 709 00:37:35.510 --> 00:37:37.410 위치를 갖고 있는 애는 누구죠? 710 00:37:37.410 --> 00:37:39.110 게임 오브젝트의 위치를 갖고 있는 애는 711 00:37:39.110 --> 00:37:41.360 바로 Transform이죠 712 00:37:41.360 --> 00:37:45.320 우리는 그러면 이 플레이어의 다리만 알고 있으면 돼 713 00:37:45.320 --> 00:37:46.568 다리가 어딘지만, 그렇죠? 714 00:37:49.597 --> 00:37:52.780 여기에 강사 이영호가 있습니다 715 00:37:52.780 --> 00:37:56.720 강사 이영호가 있는데, 이영호 전체를 알 게 아니라 716 00:37:56.720 --> 00:37:59.770 다리의 지금 현재 위치가 어딘지만 알면 717 00:37:59.770 --> 00:38:01.920 다리만 내가 모니터링 하고 있으면 718 00:38:01.920 --> 00:38:03.800 얘 위치를 갖고 올 수 있는 거잖아요 719 00:38:03.800 --> 00:38:07.900 그래서 이 Transform이라는 컴포넌트만 알고 있으면 돼요 720 00:38:07.900 --> 00:38:11.479 그래서 이 부분에 GameObject를 해도 되지만 721 00:38:11.479 --> 00:38:13.779 Transform 이렇게 놔도 되겠습니다 722 00:38:13.779 --> 00:38:15.879 바로 이 Enemy의 Transform을 723 00:38:15.879 --> 00:38:17.417 나는 기억하고 있으면 되니까 724 00:38:20.023 --> 00:38:22.573 그러면 이렇게 저장을 해놓고 725 00:38:22.573 --> 00:38:25.639 Enemy에 가서 보면 타겟이 노출이 되죠 726 00:38:25.639 --> 00:38:27.555 여기 transform이 있는데 727 00:38:27.555 --> 00:38:29.405 여기에서 중요한 개념을 하나 보시겠습니다 728 00:38:29.405 --> 00:38:32.153 여기에 있는 플레이어는 게임 오브젝트입니다 729 00:38:32.153 --> 00:38:35.453 게임 오브젝트를 에너미가 따라다니고 싶은 거예요 730 00:38:35.453 --> 00:38:37.303 근데 명확하게 얘기하면 731 00:38:37.303 --> 00:38:39.320 Player에 있는 이 Transform이 732 00:38:39.320 --> 00:38:41.770 Enemy한테 들어가줘야 돼요 733 00:38:41.770 --> 00:38:43.770 그런데 이렇게 넣어도 됩니다 734 00:38:43.770 --> 00:38:46.170 제가 플레이어를 잡아서 게임 오브젝트를 잡아서 735 00:38:46.170 --> 00:38:47.839 이 타겟에다가 넣어 주면 736 00:38:47.839 --> 00:38:49.289 얘는 Transform을 원하는데 737 00:38:49.289 --> 00:38:51.139 Player라는 게임 오브젝트를 넣어 줬어요 738 00:38:51.139 --> 00:38:54.039 그러면 자동으로 Player의 Transform이 739 00:38:54.039 --> 00:38:55.419 이렇게 할당이 되죠 740 00:38:55.419 --> 00:38:57.869 유니티가 이렇게 User Experience 741 00:38:57.869 --> 00:39:00.818 사용자 경험이 굉장히 훌륭합니다 742 00:39:00.818 --> 00:39:06.398 플레이어 트랜스폼을 자동으로 할당해주는 부분까지 됩니다 743 00:39:06.398 --> 00:39:09.760 이렇게 해서 Enemy한테 타겟까지 설정을 해줬고요 744 00:39:09.760 --> 00:39:12.880 그러면 타겟 쪽으로 계속 이동을 하고 싶다고 했으니까 745 00:39:12.880 --> 00:39:17.499 여기에는 플레이어가 들어가 있을 거예요 746 00:39:17.499 --> 00:39:19.899 그러면 이 타겟 쪽으로 가기 위한 747 00:39:19.899 --> 00:39:21.559 방향을 한번 구해 보도록 할게요 748 00:39:21.559 --> 00:39:25.294 아래로가 아니라 이제는 타겟이죠 749 00:39:28.660 --> 00:39:33.400 이때 우리는 타겟 쪽으로 방향을 어떻게 구한다고요? 750 00:39:33.400 --> 00:39:39.480 Target-Me, 타겟에 있는 속성 중에 position이죠 751 00:39:39.480 --> 00:39:41.160 바로 위치가 필요한 거예요 752 00:39:41.160 --> 00:39:42.910 -Me, 나의 위치는 753 00:39:42.910 --> 00:39:45.279 transform.position 이렇게 쓰시면 돼요 754 00:39:45.279 --> 00:39:48.829 그러면 Target-Me 해서 755 00:39:48.829 --> 00:39:51.229 내가 타겟 쪽으로 이렇게 향하는 756 00:39:51.229 --> 00:39:53.759 이 벡터를 구해낼 수가 있는 거예요 757 00:39:53.759 --> 00:39:58.680 그런데 이것을 길을 전체를 그냥 다 쓰면 안 된다고 했죠 758 00:39:58.680 --> 00:40:03.269 어떻게? 이 벡터의 크기는 이렇게 만들어 놓고 759 00:40:03.269 --> 00:40:04.669 나의 속도로 이동하게 760 00:40:04.669 --> 00:40:07.400 이렇게 벡터의 크기를 그래서 1로 만들어 주는 행위를 761 00:40:07.400 --> 00:40:09.400 Normalize 한다고 했어요 762 00:40:09.400 --> 00:40:12.950 그래서 디렉션을, 이 방향을 763 00:40:12.950 --> 00:40:17.040 dir을 Normalize 이렇게 함수를 호출해주면 764 00:40:17.040 --> 00:40:19.968 이렇게 구해놓은 이 디렉션의 크기가 어떻게 된다고요? 765 00:40:19.968 --> 00:40:21.246 1로 만들어 주게 돼요 766 00:40:23.867 --> 00:40:27.559 이렇게 하면 그 방향으로 이동한다는 변화가 없죠 767 00:40:27.559 --> 00:40:31.519 이렇게 저장을 하고 다시 가서 보도록 할게요 768 00:40:31.519 --> 00:40:33.080 플레이 버튼을 눌러볼까요? 769 00:40:33.080 --> 00:40:36.830 그러면 에너미는 제가 움직일 때 770 00:40:36.830 --> 00:40:40.160 계속해서 저를 따라오죠 771 00:40:40.160 --> 00:40:44.060 보이나요? 이렇게 계속해서 플레이어를 따라다니는 772 00:40:44.060 --> 00:40:45.994 에너미를 만들 수가 있습니다 773 00:40:48.954 --> 00:40:51.804 그러면 이렇게 계속해서 따라다니지만 774 00:40:51.804 --> 00:40:53.854 저는 태어날 때 한 번만 따라다니게 775 00:40:53.854 --> 00:40:55.639 이렇게 바꿔보도록 할게요 776 00:40:55.639 --> 00:40:57.439 태어날 때 한 번만 777 00:41:01.765 --> 00:41:07.415 태어날 때 한 번 방향을 구하고 778 00:41:07.415 --> 00:41:12.014 그리로 계속 이동하고 싶다 779 00:41:12.014 --> 00:41:14.759 그 방향으로 계속 이동하고 싶다는 거예요 780 00:41:14.759 --> 00:41:16.859 타겟 쪽으로 계속 이동하는 게 아니라 781 00:41:16.859 --> 00:41:18.399 그러면 어떻게 될까요? 782 00:41:18.399 --> 00:41:20.839 태어날 때 한 번 방향을 구해야겠죠 783 00:41:20.839 --> 00:41:23.240 바로 살아가면서 계속 구하는 게 아니라 784 00:41:23.240 --> 00:41:25.320 어떻게 구하자고요? 785 00:41:25.320 --> 00:41:27.759 태어날 때가 바로 Start니까 이쪽에서 하자고 786 00:41:27.759 --> 00:41:32.199 그런데 여기에 있는 dir을 여기에서는 사용할 수가 없죠 787 00:41:32.199 --> 00:41:34.606 이렇게 이 Start에 있는 이런 변수를 788 00:41:34.606 --> 00:41:37.124 우리가 지역 변수라고 하죠 789 00:41:37.124 --> 00:41:40.374 Update에서는 다른 함수에 있는 이 지역 변수를 790 00:41:40.374 --> 00:41:42.559 접근할 수가 없습니다 791 00:41:42.559 --> 00:41:45.000 그러면 어디에다가 넣어야지 접근할 수 있을까요? 792 00:41:45.000 --> 00:41:48.550 바로 속성으로 전역으로 등록을 해놔야지 793 00:41:48.550 --> 00:41:49.679 사용할 수가 있어요 794 00:41:49.679 --> 00:41:52.529 그래서 여기 있는 Vector의 dir은 795 00:41:52.529 --> 00:41:56.639 여기에다가, 속성 부분에다가 이렇게 놔주도록 하고요 796 00:41:56.639 --> 00:42:00.189 얘네들은 여기에서 등록해 놓은 797 00:42:00.189 --> 00:42:02.440 이 dir을 사용하도록 이렇게 처리할게요 798 00:42:02.440 --> 00:42:05.520 그러면 얘는 불이 들어와 있죠? 799 00:42:05.520 --> 00:42:07.520 다 같은 애들이 되는 거예요 800 00:42:07.520 --> 00:42:12.600 그래서 태어날 때 한 번 방향을 구하고 801 00:42:12.600 --> 00:42:17.360 그리고 그 방향으로 계속 이동하고 싶다가 되는 거죠 802 00:42:17.360 --> 00:42:19.223 얘는 태어날 때 방향을 구하는 거죠 803 00:42:25.599 --> 00:42:28.505 계속 이동하고 싶다 이렇게 되겠죠 804 00:42:30.960 --> 00:42:34.160 저장을 하고 태어날 때 한 번 구하고 805 00:42:34.160 --> 00:42:36.960 그 방향으로 계속 이동하고 싶다 이렇게 구했으면 806 00:42:36.960 --> 00:42:38.399 가서 해 볼게요 807 00:42:38.399 --> 00:42:41.759 그러면 저는 옆에다가 티가 나게 이렇게 놓도록 하겠습니다 808 00:42:41.759 --> 00:42:44.338 플레이 버튼을 누르면 제가 피해도 809 00:42:44.338 --> 00:42:46.743 얘는 처음에 구한 그 방향으로 810 00:42:46.743 --> 00:42:48.692 계속 이렇게 이동을 하게 되겠네요 811 00:42:52.559 --> 00:42:57.279 이렇게 Enemy가 만들어졌습니다 812 00:42:57.279 --> 00:42:59.279 Enemy가 이렇게 만들어졌다면 813 00:42:59.279 --> 00:43:01.160 어떤 녀석은 아래로 내려오고 814 00:43:01.160 --> 00:43:03.610 어떤 녀석은 타겟 쪽으로 가고 815 00:43:03.610 --> 00:43:05.399 이런 부분이 좀 필요할 수 있어요 816 00:43:05.399 --> 00:43:08.599 그래서 랜덤으로 설정되게 817 00:43:08.599 --> 00:43:11.440 이렇게 구현을 해 보도록 하겠습니다 818 00:43:11.440 --> 00:43:17.390 그래서 랜덤으로 30%의 확률로 819 00:43:17.390 --> 00:43:19.480 어떤 녀석은 타겟 쪽으로 가고 820 00:43:19.480 --> 00:43:23.200 어떤 녀석은 그냥 아래로 내려가고 이렇게 하도록 할게요 821 00:43:23.200 --> 00:43:26.250 그러면 무조건 다 타겟 쪽으로 이동을 하면 822 00:43:26.250 --> 00:43:28.168 다 어려울 거 아니에요, 플레이어 입장에서는 823 00:43:28.168 --> 00:43:32.720 그러니까 이런 식의 변동치를 주도록 하겠습니다 824 00:43:32.720 --> 00:43:35.520 그럼 태어날 때 이 방향을 구할 때 825 00:43:35.520 --> 00:43:37.880 내용이 들어가게 될 거예요 826 00:43:37.880 --> 00:43:39.330 어떻게 할 거냐? 827 00:43:39.330 --> 00:43:49.399 30%의 확률로 타겟 쪽으로 방향을 구하고 828 00:43:49.399 --> 00:43:51.109 그렇지 않으면, 30% 밖이면 829 00:43:51.109 --> 00:43:59.497 그렇지 않으면 그냥 아래로 방향을 설정하자 830 00:43:59.497 --> 00:44:02.822 이렇게 넣도록 하겠습니다 831 00:44:02.822 --> 00:44:05.839 그러면 30%의 확률이라는 건 이렇게 구할 수 있어요 832 00:44:05.839 --> 00:44:08.000 먼저 그럼 확률을 구해야겠네요? 833 00:44:08.000 --> 00:44:18.499 확률은 먼저 int라고 넣도록 할게요 834 00:44:18.499 --> 00:44:20.440 percent라고 넣도록 하겠습니다 835 00:44:20.440 --> 00:44:26.599 얘는 Random에 보면 여기 Range라는 게 있어요 836 00:44:29.813 --> 00:44:31.263 RandomRange도 있지만 837 00:44:31.263 --> 00:44:32.799 여기에 사용되지 않음으로 되어 있습니다 838 00:44:32.799 --> 00:44:33.899 Range로 넣고요 839 00:44:33.899 --> 00:44:39.559 여기에 1부터 10까지 이렇게 넣도록 하죠 840 00:44:39.559 --> 00:44:44.600 그러면 이 Range에 보면 어떻게 되어 있어요? 841 00:44:44.600 --> 00:44:48.760 maxExclusive 이렇게 되어 있죠 842 00:44:48.760 --> 00:44:52.399 이 안에 들어가서 보면 이렇게 되어 있습니다 843 00:44:52.399 --> 00:44:57.000 int 이렇게 들어가서 작업이 되어 있어요 844 00:44:57.000 --> 00:45:03.320 그래서 우린 여기에다가 얘를 가져다가 사용하게 되겠습니다 845 00:45:03.320 --> 00:45:06.119 1부터 10까지 percent를 가져오고요 846 00:45:06.119 --> 00:45:11.359 그럼 얘가 30%의 확률이라는 건 어떻게 하면 돼요? 847 00:45:11.359 --> 00:45:14.110 3보다 작으면 될 거 아니에요? 그러면은 30%고 848 00:45:14.110 --> 00:45:16.600 3보다 크면? 다른 확률인거죠 849 00:45:16.600 --> 00:45:27.839 그래서 30%의 확률은 it(percent <= 3) 850 00:45:27.839 --> 00:45:30.320 3을 포함하는 거잖아요? 1,2,3 이니까 851 00:45:30.320 --> 00:45:33.440 그러면 어떻게 하자고요? 852 00:45:33.440 --> 00:45:37.540 타겟 방향으로 이렇게 853 00:45:37.540 --> 00:45:41.200 타겟 방향으로 구하자는 거죠 854 00:45:41.200 --> 00:45:44.006 이 부분이 바로 30%의 확률인 거예요 855 00:45:48.333 --> 00:45:51.799 그렇지 않으면 어떻게? 그냥 아래로 했으니까 856 00:45:51.799 --> 00:45:57.920 else 이렇게 해서 그냥 아래로 857 00:45:57.920 --> 00:46:04.820 그래서 dir = Vector3.down 858 00:46:04.820 --> 00:46:06.119 이렇게 하시면 되겠습니다 859 00:46:06.119 --> 00:46:10.978 저장하고 가서 보도록 할까요? 860 00:46:10.978 --> 00:46:14.228 플레이 버튼을 누르면 얘는 861 00:46:14.228 --> 00:46:18.328 30% 확률로 아래로 혹은 타겟 쪽으로 862 00:46:18.328 --> 00:46:21.239 이동하는 내용을 볼 수가 있겠습니다 863 00:46:21.239 --> 00:46:25.235 여기까지 해서 적의 이동까지 알아봤습니다 864 00:46:26.730 --> 00:46:30.000 이번 단원에서 학습한 내용을 정리하도록 하겠습니다 865 00:46:30.000 --> 00:46:31.400 첫 번째 학습 내용으로 866 00:46:31.400 --> 00:46:33.839 총알 이동 제작 내용을 구현했습니다 867 00:46:33.839 --> 00:46:37.389 Bullet 게임 오브젝트를 생성하고 C# 스크립트를 만들어 868 00:46:37.389 --> 00:46:40.559 위로 이동하도록 코드를 작성했습니다 869 00:46:40.559 --> 00:46:44.239 두 번째로 총알을 발사하는 내용을 구현했습니다 870 00:46:44.239 --> 00:46:46.289 Bullet Prefabs를 만들고 871 00:46:46.289 --> 00:46:47.789 Player Fire 스크립트를 이용해 872 00:46:47.789 --> 00:46:50.439 사용자가 발사 버튼을 누를 때 873 00:46:50.439 --> 00:46:53.239 총알이 발사되도록 구현했습니다 874 00:46:53.239 --> 00:46:56.359 마지막으로 적 이동 제작 내용을 학습했습니다 875 00:46:56.359 --> 00:46:57.909 에너미 객체를 생성하고 876 00:46:57.909 --> 00:47:01.868 아래로 이동하는 스크립트를 작성했습니다 877 00:47:01.868 --> 00:47:03.792 여기까지 수고 많으셨습니다 878 00:47:04.905 --> 00:47:05.746 총알 이동 제작 Bullet 생성 및 위치 설정 879 00:47:05.746 --> 00:47:06.605 하이어라키에서 [+] - [3D Object] - [Cube] 생성 후 Bullet으로 이름 변경 Bullet의 Transform에서 총알의 위치와 크기 변경 880 00:47:06.605 --> 00:47:07.355 Bullet 스크립트 생성 및 할당 프로젝트 창에서 [Scripts] - [+] - [C# Script] 생성 후 Bullet으로 이름 변경 881 00:47:07.355 --> 00:47:08.186 Bullet 스크립트를 Bullet 게임 오브젝트의 컴포넌트로 드래그 앤 드롭 882 00:47:08.186 --> 00:47:08.986 Bullet 이동 스크립트 구현 유니티 에디터 상에 노출되도록 접근제한자를 public으로 하여 speed 변수 생성 883 00:47:08.986 --> 00:47:09.825 계속 호출되도록 Update 함수에 구현부 추가 위로 가는 up 방향을 구한 후 이동 공식 P = P0 + vt를 이용하여 이동 부분 구현 884 00:47:09.825 --> 00:47:10.775 총알 발사 제작 PlayerFire 스크립트 생성 및 할당 프로젝트창에서 [+] - [C# Script] 생성 후 PlayerFire로 이름 변경 885 00:47:10.775 --> 00:47:11.575 PlayerFire 스크립트를 Player 게임 오브젝트의 컴포넌트로 드래그 앤 드롭 Bullet Prefabs 제작 및 할당 886 00:47:11.575 --> 00:47:12.375 프로젝트창에서 폴더 생성 후 Prefabs로 이름 변경 하이어라키의 Bullet 객체를 프로젝트창의 Prefabs 폴더로 드래그 앤 드롭 887 00:47:12.375 --> 00:47:13.325 씬에서 Bullet 제거 후 PlayerFire의 Bullet Factory 속성에 Bullet Prefabs 할당 총구 제작 및 속성 할당 888 00:47:13.325 --> 00:47:14.125 Player 객체를 선택하고 마우스 우클릭 후 Create Empty 선택해 자식으로 등록된 빈 게임 오브젝트 이름을 FirePosition으로 변경 889 00:47:14.125 --> 00:47:14.963 FirePosition 객체를 Player의 PlayerFire 스크립트에 할당 890 00:47:14.963 --> 00:47:16.213 총알 발사 입력 처리 발사 버튼을 누를 때마다 총알을 생산해야 하므로 Update 함수에 입력 891 00:47:16.213 --> 00:47:17.413 버튼을 누를 때 True가 발생하는 GetButtonDown 함수 사용 마우스 왼쪽이나 왼쪽 Ctrl 버튼 클릭 시 입력처리는 'Fire1' 892 00:47:17.413 --> 00:47:18.613 Instantiate 함수의 인자로 bulletFactory 입력 시 총알을 하나 생성함 893 00:47:18.613 --> 00:47:19.853 만들어진 bullet 객체에 속성으로 선언한 firePosition 총구의 위치를 할당 894 00:47:19.853 --> 00:47:21.553 적 이동 제작 Enemy 객체 생성 및 스크립트 할당 하이어라키에서 [+] - [3D Object] - [Cube] 생성 후 Enemy로 이름 변경 895 00:47:21.553 --> 00:47:23.103 프로젝트창에서 [Scripts 폴더] - [+] - [C# Script] 생성 후 Enemy로 이름 변경 Enemy 스크립트를 Enemy 게임 오브젝트의 컴포넌트로 드래그 앤 드롭 896 00:47:23.103 --> 00:47:24.648 이동 코드 작성 이동속도 속성 선언 후 방향을 구하고 이동공식으로 코드 구현