1 00:00:24.725 --> 00:00:27.325 안녕하세요 이영훈입니다 2 00:00:27.325 --> 00:00:29.525 TPS 게임 제작 과정은 3 00:00:29.525 --> 00:00:34.075 프로토타입, 알파, 베타의 순서로 진행이 되는데요 4 00:00:34.375 --> 00:00:38.580 C 기반의 TPS 게임 제작에서는 5 00:00:38.580 --> 00:00:40.880 언리얼 엔진의 주요 시스템인 6 00:00:40.880 --> 00:00:43.919 스켈레탈 메시 애니메이션 시스템과 7 00:00:43.919 --> 00:00:47.025 내비게이션 시스템 등에 대해 알아보며 8 00:00:47.325 --> 00:00:51.425 AI를 제어하기 위해 유한 상태 기계를 활용한 9 00:00:51.425 --> 00:00:54.425 설계 기법에 대한 이해가 필요합니다 10 00:00:54.425 --> 00:00:56.725 그래서 이번 단원에서는 11 00:00:56.725 --> 00:01:03.119 C 기반의 프로젝트 생성과 TPS 플레이어를 생성하고 12 00:01:03.119 --> 00:01:08.175 3인칭 카메라와 외관을 적용하는 방법에 대해 학습하겠습니다 13 00:01:08.175 --> 00:01:11.325 또한 캐릭터 클래스에 대해 이해하고 14 00:01:11.325 --> 00:01:14.825 회전과 캐릭터 무브먼트 컴포넌트를 이용한 15 00:01:14.825 --> 00:01:17.125 이동에 대해 학습하겠습니다 16 00:01:17.125 --> 00:01:20.475 먼저 TPS 프로젝트를 생성하고 17 00:01:20.475 --> 00:01:23.275 플레이어 외관을 적용해 보겠습니다 18 00:01:23.275 --> 00:01:27.275 C 기반의 프로젝트와 TPS 플레이어 생성 19 00:01:27.879 --> 00:01:31.080 C 기반의 TPS 예제를 해 볼 건데요 20 00:01:31.080 --> 00:01:34.300 먼저 TPS가 뭔지 얘기를 해 볼게요 21 00:01:34.300 --> 00:01:38.850 FPS라는 게 있고 TPS라는 게 있습니다 22 00:01:40.199 --> 00:01:48.925 FPS는 First-Person Shooter의 약자고요 23 00:01:48.925 --> 00:01:54.025 그리고 TPS는 Third-Person Shooter입니다 24 00:01:54.575 --> 00:01:56.675 그래서 이건 1인칭이고요 25 00:01:56.675 --> 00:01:58.975 이거는 3인칭이다 이렇게 보시면 되고요 26 00:01:58.975 --> 00:02:01.575 보통은 이렇게 화면이 있으면 여기에 27 00:02:01.575 --> 00:02:06.075 캐릭터의 손만 보이면 1인칭 손만 이렇게 나온다 그러면 이거는 FPS라고 할 수 있고요 28 00:02:06.075 --> 00:02:10.525 그다음에 화면에 캐릭터 전신이 살짝 보인다 29 00:02:10.525 --> 00:02:14.000 뒤통수가 보인다 이러면 3인칭이라고 할 수 있습니다 30 00:02:14.000 --> 00:02:16.700 이거는 Third Person 31 00:02:16.700 --> 00:02:18.125 그래서 이번 예제는 32 00:02:18.125 --> 00:02:21.675 이렇게 Third-Person Shooter 예제를 해 보도록 할게요 33 00:02:23.399 --> 00:02:26.080 그러면 먼저 프로젝트를 만들어야겠죠 34 00:02:26.080 --> 00:02:28.880 언리얼 프로젝트 브라우저를 여시고 35 00:02:28.880 --> 00:02:32.660 그다음에 게임의 Blank 템플릿을 선택합니다 36 00:02:32.660 --> 00:02:36.270 그리고 여기 C 로 진행하도록 할게요 37 00:02:36.724 --> 00:02:41.839 이름은 Cpp니까 Cpp_를 접두어로 써주고요 38 00:02:41.839 --> 00:02:43.839 TPS라고 하겠습니다 39 00:02:59.279 --> 00:03:01.229 프로젝트가 만들어지면 제일 먼저 40 00:03:01.229 --> 00:03:03.160 우리가 할 일들을 하면 되겠죠 41 00:03:03.160 --> 00:03:08.600 일단 저는 레이아웃을 제가 원하는 형태로 바꾸고요 42 00:03:08.600 --> 00:03:13.974 그리고 먼저 레벨을 하나 만들어 주겠습니다 43 00:03:13.974 --> 00:03:17.080 여기서 File에서 New Level 44 00:03:17.080 --> 00:03:21.080 이번에는 TPS니까 땅이 있어야겠죠 바닥이 45 00:03:21.080 --> 00:03:25.630 그래서 이번엔 Basic으로 시작해 보도록 할게요 Create 합니다 46 00:03:29.770 --> 00:03:34.170 그리고 여기에 이제 게임 모드와 주인공을 만들어야겠죠 47 00:03:35.240 --> 00:03:39.374 이것은 C 로 제작해 보도록 할게요 48 00:03:39.374 --> 00:03:42.520 먼저 게임 모드를 만들겠습니다 49 00:03:42.520 --> 00:03:46.070 여기서 이렇게 하고 50 00:03:47.199 --> 00:03:52.880 이건 TPS니까 앞에 TPS라고 접두어를 적어주겠습니다 51 00:03:52.880 --> 00:03:56.230 Public을 클릭하고요 Create 합니다 52 00:04:02.224 --> 00:04:06.720 그러면 이렇게 잘 만들어진 걸 볼 수 있고요 53 00:04:06.720 --> 00:04:08.870 여기도 한번 로드를 해주시면 54 00:04:17.399 --> 00:04:20.559 파일이 잘 생성되어 있는 걸 확인할 수 있죠 55 00:04:20.559 --> 00:04:24.000 그리고 주인공도 만들어 볼게요 56 00:04:24.000 --> 00:04:29.224 Tools에서 Add C Class 여기에서 57 00:04:29.224 --> 00:04:32.359 이번에는 캐릭터를 만들겠습니다 58 00:04:32.359 --> 00:04:35.959 캐릭터는 Actor, Pawn, Character 이렇게 되어있죠 59 00:04:35.959 --> 00:04:37.600 Actor를 Pawn이 상속받고 60 00:04:37.600 --> 00:04:40.720 Pawn을 Character가 상속받는 구조입니다 61 00:04:40.720 --> 00:04:44.160 여기에서 Character를 선택하고 Next 한 다음에 62 00:04:44.160 --> 00:04:49.600 이거는 주인공이니까요 Player 63 00:04:49.600 --> 00:04:52.450 이건 너무 기니까 Player라고 하겠습니다 64 00:04:54.880 --> 00:04:58.219 Player라는 이름을 쓸 수가 없네요 그러면 65 00:04:59.674 --> 00:05:05.774 TPSPlayer 이렇게 작성해 줄게요 Create 합니다 66 00:05:13.920 --> 00:05:16.000 그러면 주인공도 만들어졌고요 67 00:05:16.000 --> 00:05:20.079 이것을 상속받은 블루프린트를 하나 만들도록 할게요 68 00:05:20.079 --> 00:05:23.799 이렇게 해서 블루프린트 클래스 만들어 주시고 69 00:05:23.799 --> 00:05:29.720 그럼 폴더가 있어야겠네요 여기다가 폴더를 만들 건데 70 00:05:29.720 --> 00:05:32.024 지금 여기서는 생성이 안되네요 71 00:05:32.024 --> 00:05:35.839 그러면 잠깐만요 폴더를 만들고 진행하시죠 72 00:05:35.839 --> 00:05:39.440 Content에 New Folder 73 00:05:40.440 --> 00:05:43.490 블루프린트라는 폴더를 하나 만들게요 74 00:05:45.160 --> 00:05:48.480 그리고 여기 현재 레벨도 저장을 해야 되니까 75 00:05:48.480 --> 00:05:53.624 Maps 폴더도 만들어 주겠습니다 76 00:05:53.624 --> 00:05:55.874 전부 한번 저장을 해주고요 77 00:05:55.874 --> 00:06:04.074 다시 돌아와서 주인공을 만들고요 블루프린트로 BP_ 78 00:06:07.519 --> 00:06:10.079 그리고 게임 모드도 만들어 주겠습니다 79 00:06:10.079 --> 00:06:12.559 이거는 우리가 저번에 다 했던 절차니까 80 00:06:12.559 --> 00:06:15.224 그대로 쭉 이어서 해 볼게요 81 00:06:16.824 --> 00:06:20.874 게임 모드도 블루프린트로 만드시고 82 00:06:21.399 --> 00:06:24.119 그다음에 현재 레벨도 저장을 해주도록 할게요 83 00:06:24.119 --> 00:06:29.619 Ctrl S 눌러서 맵에다가 게임 맵이라고 하겠습니다 84 00:06:32.789 --> 00:06:36.039 전부 다 만들었으니까 저장 한번 해주고요 85 00:06:37.079 --> 00:06:42.119 그리고 이것들을 Project Settings에서 지정해 줘야겠죠 86 00:06:42.119 --> 00:06:46.399 Maps & Modes에서 여기 Default Maps에 87 00:06:46.399 --> 00:06:50.119 전부 다 게임 맵을 이렇게 넣어주도록 할게요 88 00:06:50.119 --> 00:06:53.569 그리고 저는 이 Default Modes는 건드리지 않고요 89 00:06:59.924 --> 00:07:04.640 레벨의 월드 세팅 쪽에서 배정을 해주도록 하겠습니다 90 00:07:04.640 --> 00:07:06.490 이렇게 잡아서 넣어도 돼요 91 00:07:09.399 --> 00:07:14.159 그리고 여기에 기본 Pawn은 이것으로 교체해 주고요 92 00:07:14.959 --> 00:07:18.040 그럼 여기를 수정하면 이것도 저장을 해줘야겠죠 93 00:07:18.040 --> 00:07:21.679 이것도 컴파일하고 저장하기를 합니다 94 00:07:21.679 --> 00:07:24.224 이거 계속 눌러야 되니까 95 00:07:24.224 --> 00:07:28.920 Save on Compile - Always로 변경 96 00:07:28.920 --> 00:07:32.519 이렇게 하고 전체 저장도 한번 해줍니다 97 00:07:32.519 --> 00:07:37.459 이렇게 하고 실행하면 이제 주인공이 이곳에 태어나게 되겠죠 98 00:07:38.224 --> 00:07:42.720 현재 레벨에 기본적으로 플레이어 스타트도 있습니다 99 00:07:42.720 --> 00:07:44.760 여기에서 태어날 것 같아요 100 00:07:44.760 --> 00:07:49.960 그러면 이 주인공을 더블클릭해서 외형을 설정을 해줘야겠죠 101 00:07:50.760 --> 00:07:53.673 그런데 우리가 처음에 Blank로 만들었기 때문에 102 00:07:53.673 --> 00:07:58.073 아무것도 없습니다 그렇죠? 그래서 여기에서 103 00:07:58.073 --> 00:08:05.920 외형을 사용하기 위해 기존 템플릿의 데이터를 가져옴 104 00:08:05.920 --> 00:08:09.523 여기서 Add 버튼을 누른 다음에 상단에 보시면 105 00:08:09.523 --> 00:08:13.373 Add Feature라는 게 있습니다 이거를 클릭해 보시면 106 00:08:13.373 --> 00:08:15.600 기존에 있는 내용을 가지고 올 수가 있는데요 107 00:08:15.600 --> 00:08:19.399 여기서 우리는 Third Person 3인칭으로 사용할 것이기 때문에 108 00:08:19.399 --> 00:08:22.640 이것을 선택하고 Add to Project 하겠습니다 109 00:08:22.640 --> 00:08:27.073 블루프린트인 것을 가져올게요 우리가 이걸 가지고 110 00:08:27.073 --> 00:08:30.160 C 로 하면 이거 자체를 다 가져오기 때문에 111 00:08:30.160 --> 00:08:32.119 이걸로 가져오겠습니다 112 00:08:35.919 --> 00:08:38.119 그럼 여기에 복사가 된 것을 볼 수 있고요 113 00:08:38.119 --> 00:08:40.629 이거는 닫아 주시면 되겠습니다 114 00:08:41.873 --> 00:08:46.723 그러면 여기 있는 BP_Third Person 115 00:08:46.723 --> 00:08:49.280 이게 여기 자동으로 들어가 있죠 116 00:08:49.280 --> 00:08:51.679 이거를 사용할 건 아니고요 117 00:08:51.679 --> 00:08:53.359 우리가 만든 걸 쓸 거니까요 118 00:08:53.359 --> 00:08:55.719 여기서 블루프린트 폴더로 돌아와서 119 00:08:55.719 --> 00:08:59.373 여기 BP_TPS Player를 더블클릭해서 120 00:08:59.373 --> 00:09:01.719 여기다가 지정을 해주겠습니다 121 00:09:01.719 --> 00:09:06.159 여기 보면 Character를 상속받은 경우에는 122 00:09:06.159 --> 00:09:09.960 기본적으로 이렇게 4가지 컴포넌트가 붙어있는데요 123 00:09:09.960 --> 00:09:13.000 기본적으로 루트에 캡슐 컴포넌트가 붙어있고요 124 00:09:13.000 --> 00:09:16.280 그래서 이 캡슐 모양이 충돌체 역할을 하게 됩니다 125 00:09:16.280 --> 00:09:19.323 그리고 Arrow 이게 앞쪽이라는 의미를 가지는 126 00:09:19.323 --> 00:09:22.223 Arrow 컴포넌트가 있고 그다음에 127 00:09:22.223 --> 00:09:24.520 Skeletal Mesh Component가 있어요 128 00:09:24.520 --> 00:09:27.840 그래서 여기에는 뼈대를 가지고 있는 129 00:09:27.840 --> 00:09:31.673 그러한 Mesh를 넣어주면 됩니다 그리고 마지막에 130 00:09:31.673 --> 00:09:35.123 캐릭터 무브먼트라는 컴포넌트가 있는데요 바로 이것이 131 00:09:35.123 --> 00:09:42.359 캐릭터 무브먼트 : 실제 캐릭터를 조작할 때 움직임을 제어하기 위해 사용되는 컴포넌트 132 00:09:42.359 --> 00:09:47.073 그래서 보면 여기에 Walking이라든지 Falling, Jumping 133 00:09:47.073 --> 00:09:49.440 이런 것들이 이미 구현이 되어 있습니다 134 00:09:49.440 --> 00:09:51.880 그래서 우리는 이것을 사용해서 135 00:09:51.880 --> 00:09:56.359 움직이거나 점프를 하거나 이런 행위를 해 보도록 하겠습니다 136 00:09:56.359 --> 00:09:59.840 일단 외관을 먼저 설정해 줄게요 137 00:09:59.840 --> 00:10:02.240 Mesh를 선택하신 다음에 138 00:10:03.320 --> 00:10:08.039 여기 디테일에 보면 Mesh라는 카테고리가 있죠 139 00:10:08.039 --> 00:10:11.423 여기에서 Skeletal Mesh Asset에 None이라고 되어있는데 140 00:10:11.423 --> 00:10:18.960 이걸 펼쳐 보시면 여기에 사람 모양의 Mesh가 보입니다 141 00:10:18.960 --> 00:10:21.560 여기에서 저희가 사용할 것은 142 00:10:23.673 --> 00:10:24.919 Quinn을 사용해 볼까요? 143 00:10:24.919 --> 00:10:29.273 SKM_Quinn을 사용해 보도록 하겠습니다 144 00:10:29.273 --> 00:10:35.599 그러면 이렇게 넣으면 이 녀석의 중점이라고 하죠 145 00:10:35.599 --> 00:10:39.159 이 녀석의 원점, 중점 그것은 중앙 하단이 되겠습니다 146 00:10:39.159 --> 00:10:40.520 그래서 이렇게 나오는데 147 00:10:40.520 --> 00:10:43.640 우리는 이것을 좀 내리고 이렇게 회전도 시켜줘야겠죠 148 00:10:43.640 --> 00:10:47.090 얘가 지금 오른쪽을 보고 있으니까요 그래서 149 00:10:48.039 --> 00:10:52.573 Mesh에 보면 상단에 Transform이 있는데요 여기서 150 00:10:52.573 --> 00:10:56.400 Z를 -90으로 내려줍니다 왜 90이냐면 151 00:10:56.400 --> 00:10:59.440 기본적으로 이런 모델링의 크기는 152 00:10:59.440 --> 00:11:01.520 키가 180이 기준으로 되어있어요 153 00:11:01.520 --> 00:11:05.880 그래서 중앙에서 그다음 90cm를 아래로 내려주시면 154 00:11:05.880 --> 00:11:07.599 딱 여기에 맞게 됩니다 155 00:11:07.599 --> 00:11:12.359 그리고 Z축을 이렇게 회전시켜 줄 거예요 156 00:11:12.873 --> 00:11:15.719 이렇게 시계 방향이 증가하는 쪽이니까 157 00:11:15.719 --> 00:11:17.479 반대 방향으로 할 거니까 158 00:11:17.479 --> 00:11:19.479 반대 방향으로 90도 회전시켜 주겠습니다 159 00:11:19.479 --> 00:11:23.573 여기다가 -90도 이렇게 회전하면 되겠습니다 160 00:11:23.960 --> 00:11:28.460 이러면 이렇게 앞쪽을 바라보게 설정을 할 수가 있고요 161 00:11:33.573 --> 00:11:39.209 그러면 이렇게 처리를 하면 되는데 실제로 162 00:11:40.523 --> 00:11:43.719 주인공 캐릭터의 뒤에 카메라가 들어감 163 00:11:43.719 --> 00:11:46.923 우리가 2D 슈팅에서는 카메라를 이렇게 164 00:11:46.923 --> 00:11:49.923 레벨에 배치해서 사용을 했는데요 165 00:11:49.923 --> 00:11:54.599 TPS의 경우에는 주인공을 따라다녀야 되는 카메라잖아요 166 00:11:54.599 --> 00:11:57.159 그래서 여기다가 카메라를 배치합니다 167 00:11:57.159 --> 00:12:01.799 여기다 Add 버튼 누르고 카메라라고 해볼게요 168 00:12:01.799 --> 00:12:03.440 이렇게 카메라가 있죠 169 00:12:03.440 --> 00:12:06.190 카메라를 이렇게 넣어서 배치를 합니다 170 00:12:08.973 --> 00:12:13.440 일단은 블루프린트로 설정한 다음에 C 에서 작업 171 00:12:13.440 --> 00:12:16.320 그런데 카메라 같은 경우에는 172 00:12:16.320 --> 00:12:20.599 이거를 눈 위치에 이렇게 놓으면 FPS가 되는 거예요 173 00:12:20.599 --> 00:12:23.919 이렇게 하고 한번 실행을 해볼게요 174 00:12:23.919 --> 00:12:25.719 그러면 이렇게 되는 거죠 175 00:12:27.919 --> 00:12:31.673 F8을 누르면 카메라 시선을 바꿔 주변에서 볼 수 있음 176 00:12:31.673 --> 00:12:34.200 플레이어가 이렇게 서 있는 것을 볼 수 있고 177 00:12:34.200 --> 00:12:37.323 카메라 위치는 눈 위치에 있기 때문에 178 00:12:37.323 --> 00:12:39.520 다시 F8을 누르면 다시 들어갈 수 있죠 179 00:12:39.520 --> 00:12:41.920 이렇게 지정이 되는 겁니다 180 00:12:45.173 --> 00:12:49.173 3인칭 카메라와 외관 적용 방법 181 00:12:49.173 --> 00:12:52.973 다음은 3인칭 카메라를 설정해 보겠습니다 182 00:12:54.080 --> 00:12:57.239 그런데 그냥 카메라만 넣어도 됩니다 183 00:12:57.239 --> 00:13:00.622 근데 카메라만 넣었을 때 좀 문제가 있어요 어떤 게 있냐면 184 00:13:00.622 --> 00:13:04.822 지금 이거는 FPS니까 뒤로 이렇게 뺄 거예요 185 00:13:04.822 --> 00:13:08.622 이렇게 보면 뒤통수가 보이겠죠 186 00:13:09.679 --> 00:13:12.559 그러면 이렇게 보면 정면이 안 보이잖아요 187 00:13:12.559 --> 00:13:18.359 그래서 보통 TPS 게임들이 이렇게 하는 게임도 있고 188 00:13:18.359 --> 00:13:21.400 약간 측면에서 바라보게 하는 경우도 있습니다 189 00:13:21.400 --> 00:13:24.200 그래서 그런 것들을 처리하기 위해서는 190 00:13:24.200 --> 00:13:27.840 그냥 카메라 하나 가지고 하기에는 조금 어려움이 있어요 191 00:13:27.840 --> 00:13:34.022 그래서 이 카메라의 부모 위치에다가 192 00:13:34.022 --> 00:13:36.239 스프링 암이라는 거를 하나 넣을 거예요 193 00:13:36.239 --> 00:13:40.080 그래서 그 녀석을 이용해서 위치를 보정한다든지 194 00:13:40.080 --> 00:13:43.679 그리고 스프링 암의 재미있는 기능 중에 이런 것도 있습니다 195 00:13:43.679 --> 00:13:47.479 예를 들어서 그림으로 볼까요? 196 00:13:52.072 --> 00:13:55.000 이런 경우가 있어요 플레이어가 이렇게 있고요 197 00:13:55.000 --> 00:13:57.159 카메라가 이렇게 보고 있습니다 198 00:13:57.159 --> 00:14:01.522 그러면 여기 사이에 벽이 이렇게 있을 수 있잖아요 199 00:14:01.522 --> 00:14:03.640 그럼 이렇게 쳐다보면 벽이 보이겠죠 200 00:14:03.640 --> 00:14:06.722 그러면 문제가 되잖아요 이런 경우에 201 00:14:06.722 --> 00:14:08.872 우리가 스프링 암이라는 걸 넣으면 202 00:14:12.440 --> 00:14:16.822 스프링 암이라는 게 있는데 이 컴포넌트를 감싸주면 203 00:14:16.822 --> 00:14:20.022 스프링 암을 활용하여 카메라의 위치가 벽 너머로 이동함 자동으로 이쪽으로 이동합니다 카메라가 204 00:14:20.022 --> 00:14:23.000 이렇게 쳐다보게 바뀌어요 205 00:14:23.000 --> 00:14:25.479 그래서 그런 기능도 쓰려고 206 00:14:26.522 --> 00:14:29.719 컴포넌트를 한번 여기다가 붙여보도록 하겠습니다 207 00:14:29.719 --> 00:14:32.822 캡슐 컴포넌트를 선택하고 Add 버튼을 누른 다음에 208 00:14:32.822 --> 00:14:36.479 여기 Spring이라고 쓰겠습니다 209 00:14:36.479 --> 00:14:40.320 그러면 이렇게 스프링 암이라는 것이 나오는데 클릭하시고요 210 00:14:40.320 --> 00:14:43.159 그다음에 카메라를 여기다 이렇게 넣겠습니다 211 00:14:43.159 --> 00:14:45.559 이러한 하이라키 구조를 가져갈 거고요 212 00:14:45.559 --> 00:14:48.080 이렇게 하면 카메라가 뒤로 확 밀려져 있죠 213 00:14:48.080 --> 00:14:51.400 일단 카메라는 다시 원점으로 놓겠습니다 214 00:14:51.400 --> 00:14:56.520 그리고 보면 스프링 암이 이렇게 되어 있네요 215 00:14:56.520 --> 00:15:00.222 그래서 위로 좀 올릴게요 이렇게 216 00:15:00.222 --> 00:15:02.599 제가 지금 카메라를 조작하는 것이 아니라 217 00:15:02.599 --> 00:15:04.599 스프링 암을 움직이고 있습니다 218 00:15:04.599 --> 00:15:08.199 스프링 암을 약간 오른쪽으로 219 00:15:08.872 --> 00:15:19.922 뒤에서 봤을 때 오른쪽 방향으로 살짝 밀어보도록 하겠습니다 220 00:15:20.200 --> 00:15:22.119 40, 70 이 정도 할까요? 221 00:15:22.119 --> 00:15:26.419 이렇게 하고 보면 이런 식으로 보이게 되죠 222 00:15:28.622 --> 00:15:30.340 조금 더 밀어도 될 것 같습니다 223 00:15:34.322 --> 00:15:36.871 그리고 스프링 암을 보면 224 00:15:36.871 --> 00:15:39.280 카메라를 우리가 뒤로 따로 밀지 않았는데도 225 00:15:39.280 --> 00:15:40.479 카메라가 뒤로 가 있죠 226 00:15:40.479 --> 00:15:43.840 이것은 스프링 암의 속성에 보면 227 00:15:43.840 --> 00:15:47.000 여기 카메라에 Target Arm Length라는 게 있습니다 228 00:15:47.000 --> 00:15:48.599 이게 300이라서 그렇고요 229 00:15:48.599 --> 00:15:51.080 이거를 200이나 이렇게 줄여주시면 230 00:15:51.080 --> 00:15:52.721 이렇게 가까워지는 걸 볼 수 있고 231 00:15:52.721 --> 00:15:56.371 이걸 0으로 하면 바로 앞에 붙게 됩니다 232 00:15:56.371 --> 00:15:59.021 그래서 저는 이걸 200이라고 할게요 233 00:16:00.119 --> 00:16:05.119 그리고 실행을 한번 해 보고요 이렇게 되겠죠 234 00:16:05.119 --> 00:16:10.320 그럼 이 부분을 C 로 구현을 해 보도록 할게요 235 00:16:10.320 --> 00:16:19.350 이쪽으로 가서 플레이어의 헤더 파일로 이동하고요 236 00:16:23.640 --> 00:16:26.000 그러면 방금 우리가 추가했던 내용들 있죠 237 00:16:26.000 --> 00:16:30.159 여기 보면 스프링 암과 카메라 이 두 가지를 추가했고 238 00:16:30.159 --> 00:16:34.872 이 메시에다가 메시 애셋을 이렇게 지정을 해줬습니다 239 00:16:34.872 --> 00:16:38.479 이 일을 코드로 작성해 보도록 하겠습니다 240 00:16:38.479 --> 00:16:49.039 먼저 헤더로 와서 카메라와 스프링 암 두 가지를 추가했죠 241 00:16:49.039 --> 00:16:52.960 그리고 스프링 암을 Attach해서 카메라를 붙였어요 242 00:16:52.960 --> 00:16:55.000 그러면 이걸 먼저 만들어 줄게요 243 00:16:55.000 --> 00:17:05.472 카메라와 스프링 암 코드 작성 UPROPERTY(EditAnywhere)로 244 00:17:05.472 --> 00:17:19.680 class라고 하고요 USpringArmComponent* 245 00:17:20.359 --> 00:17:26.520 이거는 스프링 암이라고 하겠습니다 246 00:17:26.520 --> 00:17:29.072 그리고 이거를 그대로 복사해서 247 00:17:29.072 --> 00:17:40.572 카메라 코드 작성 카메라도 만들어야겠죠 UCameraComponent* 248 00:17:40.572 --> 00:17:43.669 이거는 캠이라고 하겠습니다 249 00:17:48.522 --> 00:17:50.640 컴포넌트니까 이렇게 붙일까요? 250 00:17:50.640 --> 00:17:57.589 CamComp, SpringArmComp 이렇게 251 00:18:02.199 --> 00:18:04.239 이거를 이제 생성을 해 줄게요 252 00:18:04.239 --> 00:18:12.439 생성자로 와서 먼저 스프링 암 컴포넌트를 만들어주겠습니다 253 00:18:12.439 --> 00:18:14.989 CreateDefaultSubobject 254 00:18:27.800 --> 00:18:29.079 이렇게 하고요 255 00:18:29.079 --> 00:18:32.800 이거는 USpringArmComponent가 되겠죠 256 00:18:32.800 --> 00:18:37.319 TEXT라고 하고요 이름을 항상 이렇게 지어줍니다 257 00:18:37.319 --> 00:18:39.419 똑같은 이름으로 할게요 258 00:18:42.071 --> 00:18:44.680 그리고 이거를 루트에 붙여야겠죠 259 00:18:44.680 --> 00:18:48.329 이 녀석은 Attach를 하는데 260 00:18:52.271 --> 00:18:59.920 SetupAttachment(RootComponent)에다가 붙이겠습니다 261 00:18:59.920 --> 00:19:08.119 그리고 이거는 헤더를 추가해야겠죠 이렇게 해서 262 00:19:08.119 --> 00:19:11.371 헤더를 이렇게 추가해 주도록 하겠습니다 263 00:19:11.371 --> 00:19:13.971 이거는 GameFramework이 있네요 264 00:19:17.880 --> 00:19:19.439 그리고 카메라도 만들어야겠죠 265 00:19:19.439 --> 00:19:22.439 CamComp = CreateDefaultSubobject 266 00:19:22.439 --> 00:19:26.989 그다음에 여기도 UCameraComponent 그리고 TEXT 267 00:19:31.221 --> 00:19:33.221 CamComp라고 하겠습니다 268 00:19:37.199 --> 00:19:40.520 이것은 스프링 암에다가 Attach를 할 거예요 269 00:19:40.520 --> 00:19:45.239 이렇게 해서 SetupAttachment 270 00:19:45.239 --> 00:19:48.489 이거는 SpringArmComp에 붙이겠습니다 271 00:19:49.560 --> 00:19:54.599 이것도 마찬가지로 헤더를 include 해주셔야겠죠 272 00:19:54.599 --> 00:19:59.549 이것도 Camera/CameraComponent인 것 같습니다 273 00:20:01.880 --> 00:20:04.880 이렇게 작성을 해주시고요 그다음에 274 00:20:06.571 --> 00:20:14.071 세 번째는 Mesh에 입력한 내용을 실제 코드에 반영하는 형태로 만들기 275 00:20:14.071 --> 00:20:17.000 이거를 하는 방법은 여기에 넣은 애셋이 있습니다 276 00:20:17.000 --> 00:20:20.119 이거는 여기 보면 두 가지 버튼이 있는데 277 00:20:20.119 --> 00:20:23.199 이거는 내가 선택한 것을 넣겠다는 뜻이고요 278 00:20:23.199 --> 00:20:26.640 이거는 이 애셋의 폴더로 가겠다는 뜻이에요 279 00:20:26.640 --> 00:20:30.171 이 폴더를 눌러보시면 이렇게 이동하죠 지금 보고 계시는 280 00:20:30.171 --> 00:20:33.571 Skeletal Mesh를 사용하고 있다고 보시면 되고요 281 00:20:33.571 --> 00:20:37.680 여기서 마우스 오른쪽 눌러서 Copy Reference를 합니다 282 00:20:37.680 --> 00:20:42.271 그다음에 이 내용을 메모장에다가 붙여넣기를 해 보면 283 00:20:42.271 --> 00:20:45.959 이렇게 문자열로 보입니다 이렇게 되어있고요 284 00:20:45.959 --> 00:20:49.280 이 문자를 이용해서 로드를 할 수 있어요 285 00:20:49.280 --> 00:20:52.479 이게 실제로 애셋의 경로라고 보시면 됩니다 286 00:20:52.479 --> 00:20:56.160 실제 애셋의 상대 경로 287 00:20:56.160 --> 00:20:59.410 그래서 이것을 이용해서 Mesh에다가 288 00:21:01.599 --> 00:21:03.319 값을 채워보도록 할게요 289 00:21:03.319 --> 00:21:07.571 먼저 ConstructorHelpers라는 클래스가 있습니다 여기 보면 290 00:21:07.571 --> 00:21:14.119 FClassFinder와 FObjectFinder라는 템플릿 구조체가 있어요 291 00:21:14.521 --> 00:21:16.439 그러면 이렇게 되어 있으니까 292 00:21:18.671 --> 00:21:22.760 클래스는 블루프린트 클래스를 로드할 때 사용됨 293 00:21:22.760 --> 00:21:26.560 우리는 애셋을 로드할 거니까 ObjectFinder를 사용하겠습니다 294 00:21:28.071 --> 00:21:31.621 이렇게 작성한 다음에 우리가 여기다가 꺾쇠를 해요 295 00:21:31.621 --> 00:21:34.371 왜냐면 템플릿이기 때문에 이렇게 296 00:21:34.371 --> 00:21:37.560 <>(꺾쇠)를 이용하여 자료형을 적음 297 00:21:37.560 --> 00:21:39.680 어떤 자료형을 할지 아직 정확하게 모르겠죠? 298 00:21:39.680 --> 00:21:41.719 그래서 일단 이렇게 작성을 하고요 299 00:21:41.719 --> 00:21:47.640 그다음에 일단은 TempMesh라고 할까요? 300 00:21:47.640 --> 00:21:51.359 Mesh를 로드할 거니까 이렇게 하고 301 00:21:51.359 --> 00:21:53.000 괄호를 해서 이렇게 만들겠습니다 302 00:21:53.000 --> 00:21:56.369 여기는 이제 문자열이 들어가는데요 TEXT 하고 303 00:21:58.640 --> 00:22:02.000 어떻게 보면 이게 자료형 그다음에 변수 이름 304 00:22:02.000 --> 00:22:04.071 그리고 이거는 생성자 함수를 호출할 때 305 00:22:04.071 --> 00:22:08.371 인자값을 넘기는 부분이 되겠죠 306 00:22:08.371 --> 00:22:13.771 그래서 여기다가 아까 전에 우리가 기재를 해놨었던 것을 307 00:22:13.771 --> 00:22:16.160 여기다가 붙여넣기를 합니다 308 00:22:16.160 --> 00:22:18.280 이게 좀 조심하셔야 되는 게 309 00:22:18.280 --> 00:22:22.071 이거를 그냥 이렇게 붙여넣기를 하면 310 00:22:22.071 --> 00:22:25.521 가끔 이렇게 띄어쓰기가 되는 경우가 있어요 311 00:22:25.521 --> 00:22:26.571 이렇게 하시면 안 됩니다 312 00:22:26.571 --> 00:22:29.921 이런 식으로 해서 넣으시면 안 되고요 딱 붙어있는 상태 313 00:22:29.921 --> 00:22:35.839 원래 카피한 그대로 문자열을 만들어 사용해야 함 314 00:22:35.839 --> 00:22:39.880 보면 여기에 어떤 자료형을 넣어야 되는지가 보이는데요 315 00:22:39.880 --> 00:22:41.920 SkeletalMesh가 적혀있습니다 316 00:22:41.920 --> 00:22:47.870 그래서 이것을 적어줍니다 그리고 이거는 U로 시작합니다 317 00:22:48.839 --> 00:22:50.359 이렇게 하면 되고요 318 00:22:50.359 --> 00:22:54.959 그럼 이것도 사용하려면 당연히 include 해줘야겠죠 319 00:22:57.670 --> 00:23:00.670 Engine/SkeletalMesh 이렇게 되어있네요 320 00:23:04.571 --> 00:23:10.371 TempMesh가 실제 내부에서 로딩을 시도 321 00:23:10.371 --> 00:23:13.640 파일 읽기를 시도하고요 만약에 성공했잖아요 322 00:23:13.640 --> 00:23:17.959 그러면 그거에 대해서 피드백을 받을 수가 있는데 323 00:23:17.959 --> 00:23:21.800 if 하고 만약에 TempMesh가 성공했다면 324 00:23:21.800 --> 00:23:26.170 Succeeded라고 함수가 있는데 이렇게 하면 325 00:23:28.070 --> 00:23:29.800 피드백 확인 후, 처리할 수 있음 326 00:23:29.800 --> 00:23:32.319 사실 이 함수에 들어가보면 327 00:23:32.319 --> 00:23:35.640 이거는 Object라는 객체가 있는데 328 00:23:35.640 --> 00:23:39.770 이 객체가 null이 아니면 성공, null이면 false 329 00:23:39.770 --> 00:23:42.040 이렇게 반환한다고 보시면 됩니다 330 00:23:42.040 --> 00:23:43.839 여기서 이렇게 되어있고요 331 00:23:43.839 --> 00:23:48.370 그러면 실제로 우리가 Mesh에 넣어야 되니까 처리를 해야 되는데 332 00:23:48.370 --> 00:23:50.839 사실 우리가 Mesh를 만들지 않았잖아요 333 00:23:50.839 --> 00:23:53.959 하지만 Character를 상속받았을 때는 334 00:23:53.959 --> 00:23:57.040 기본적으로 이렇게 Mesh가 있습니다 335 00:23:57.040 --> 00:23:59.160 그래서 이것을 가져오면 되는데요 336 00:23:59.970 --> 00:24:05.220 Get Mesh 하시면 돼요 Get Mesh라는 함수를 이용하시면 337 00:24:05.220 --> 00:24:10.870 Character에 존재하고 있는 Mesh를 우리가 받아낼 수가 있습니다 338 00:24:13.040 --> 00:24:14.520 그러면 Mesh를 가져왔으니까 339 00:24:14.520 --> 00:24:21.470 여기에서 SetSkeletalMesh를 해주면 되겠죠 340 00:24:22.400 --> 00:24:25.319 여기에 이제 새로운 Mesh를 넣으라고 되어있는데요 341 00:24:25.319 --> 00:24:33.970 이게 바로 아까 TempMesh에 있던 Object입니다 342 00:24:33.970 --> 00:24:36.760 우리는 지금 이거를 로드를 했는데 343 00:24:36.760 --> 00:24:40.370 이 Object라는 변수에 이렇게 344 00:24:40.370 --> 00:24:44.420 USkeletalMesh라는 객체가 담기게 되는 거죠 345 00:24:46.520 --> 00:24:50.020 이렇게 해서 우리가 로드를 할 수가 있습니다 346 00:24:51.199 --> 00:24:56.040 그리고 마저 해주면 이것이 로드가 되었으니까 347 00:24:56.040 --> 00:24:59.359 이제 Transform 정보도 우리가 넣어줘야겠죠 348 00:24:59.359 --> 00:25:03.599 그래서 이 값을 넣어줄게요 349 00:25:03.599 --> 00:25:08.149 여기 보면 GetMesh에 350 00:25:12.420 --> 00:25:20.439 SetRelativeLocationAndRotation 함수가 있습니다 351 00:25:20.439 --> 00:25:23.920 이걸 가지고 FVector로 하나 넣어주고요 352 00:25:23.920 --> 00:25:27.420 그다음에 FRotator로 이렇게 넣어줍니다 353 00:25:28.719 --> 00:25:33.839 그래서 여기 보면 아까 0, 0, -90 이렇게 되어있었잖아요 354 00:25:33.839 --> 00:25:37.470 이걸 일단 복사를 해 볼게요 Copy 355 00:25:37.970 --> 00:25:40.079 이거는 이렇게 되고요 356 00:25:40.079 --> 00:25:43.520 그다음에 밑에 있는 Rotator도 한번 복사를 해 보겠습니다 357 00:25:43.520 --> 00:25:48.120 이렇게 해서 보면 이렇게 나옵니다 358 00:25:48.970 --> 00:25:52.000 근데 이제 여기에서 우리가 또 학습할 내용이 하나 있는데요 359 00:25:52.000 --> 00:25:56.079 보시면 Rotator는 X, Y, Z가 아닌가? 하고 봤는데 360 00:25:56.079 --> 00:25:58.719 Frotator는 Pitch, Yaw, Roll 361 00:25:58.719 --> 00:26:02.560 이거는 DirectX라든지 362 00:26:02.560 --> 00:26:05.599 아니면 여러분들 드론 같은 거 혹시 배워보셨나요? 363 00:26:05.599 --> 00:26:08.719 거기에 보면 항공 관련된 거 보면 364 00:26:08.719 --> 00:26:11.319 Pitch, Yaw, Roll이라는 용어를 많이 쓰는데요 365 00:26:11.319 --> 00:26:14.560 Pitch, Yaw, Roll은 축과 관련 있는 정보 366 00:26:14.560 --> 00:26:16.640 여기다 일단 넣어보도록 하겠습니다 367 00:26:16.640 --> 00:26:20.090 이건 0, 0, -90이니까 일단 그대로 채우고 368 00:26:24.079 --> 00:26:27.960 그다음에 Rotator에도 넣는데 Rotator는 보면 369 00:26:29.000 --> 00:26:34.650 여기도 보면 Pitch, Yaw, Roll 순서로 넣게 되어있어요 그렇죠? 이렇게 370 00:26:39.429 --> 00:26:42.479 그래서 Pitch, Yaw, Roll을 넣어야 되니까 보시면 371 00:26:42.479 --> 00:26:45.560 분명히 우리가 z에 -90을 넣었는데 372 00:26:45.560 --> 00:26:47.119 Yaw가 가운데 있습니다 373 00:26:47.119 --> 00:26:55.270 주의사항 그래서 0, -90, 0 이렇게 넣어야 돼요 374 00:26:55.270 --> 00:26:57.959 이렇게 해서 이게 주의사항이고요 375 00:26:57.959 --> 00:27:00.760 이거는 Pitch, Yaw, Roll 순서인데 376 00:27:00.760 --> 00:27:04.079 이거를 설명을 잠깐 해 보면 377 00:27:04.079 --> 00:27:11.719 축을 봤을 때 이렇게 되어있잖아요 이게 x, y, z라면 378 00:27:27.359 --> 00:27:31.420 y, z, x 순서로 넣어야 되는 거죠 379 00:27:31.420 --> 00:27:34.420 그래서 요거를 잘 기억하셔야 됩니다 380 00:27:36.220 --> 00:27:40.479 이 Rotator에 넣을 때는 x, y, z 순서가 아니라는 거예요 381 00:27:40.479 --> 00:27:44.220 y, z, x의 순서입니다 382 00:27:44.220 --> 00:27:46.000 Pitch, Yaw, Roll 이라는 걸 기억하세요 383 00:27:46.000 --> 00:27:55.280 Pitch는 끄덕끄덕, Yaw는 도리도리, Roll은 갸우뚱갸우뚱을 나타냄 384 00:27:55.280 --> 00:27:56.020 회전할 때요 385 00:27:59.160 --> 00:28:04.160 그러면 이렇게 넣어주시고요 이거는 다 배치를 했으니까 386 00:28:04.160 --> 00:28:08.070 언리얼 엔진을 잠깐 한번 꺼주고 387 00:28:08.070 --> 00:28:10.170 그다음에 여기서 다시 컴파일 하겠습니다 388 00:28:11.319 --> 00:28:14.970 그리고 아까 생각해 보니까 스프링 암 같은 경우에도 389 00:28:14.970 --> 00:28:17.719 우리가 지정을 좀 더 해줘야 될 것 같은데 390 00:28:17.719 --> 00:28:21.769 아까 전에 어떻게 했었죠? 여기에서 스프링 암에 391 00:28:23.319 --> 00:28:26.839 TargetArmLength를 아까 우리가 200이라고 했죠 392 00:28:26.839 --> 00:28:29.969 이렇게 200이라고 해주고요 그다음에 393 00:28:29.969 --> 00:28:33.789 Spring Length의 위치도 우리가 바꿨어요 394 00:28:33.789 --> 00:28:37.400 이거에 SetRelativeLocation 395 00:28:37.400 --> 00:28:41.950 이거를 0 아까 몇이었죠? 40, 70 이렇게 했나요? 396 00:28:43.439 --> 00:28:45.479 이런 식으로 우리가 작성해 줬었거든요 397 00:28:45.479 --> 00:28:46.879 FVector가 빠졌네요 398 00:28:51.599 --> 00:28:53.560 이렇게 지정을 해줬었거든요 399 00:28:53.560 --> 00:28:56.649 이것도 마저 같이 해줄게요 컴파일 하고요 400 00:29:00.160 --> 00:29:01.610 일단 실행해 보겠습니다 401 00:29:06.669 --> 00:29:09.880 그러면 여기 주인공을 잠깐 볼게요 402 00:29:09.880 --> 00:29:15.569 TPS 플레이어를 열어서 뷰포트를 보면 이렇게 되어있는데요 403 00:29:21.669 --> 00:29:23.359 그러면 우리가 만든 거 말고 404 00:29:23.359 --> 00:29:26.359 아까 전에 블루프린트에서 넣었던 거 그게 남아 있죠 405 00:29:26.359 --> 00:29:27.800 그거는 삭제를 하겠습니다 406 00:29:27.800 --> 00:29:31.710 스프링 암이랑 카메라 이거는 삭제를 해주고요 407 00:29:32.769 --> 00:29:35.880 C 로 제작한 것들만 그대로 남겨 놓음 408 00:29:35.880 --> 00:29:39.880 보시면 우리가 작성했던 내용으로 409 00:29:39.880 --> 00:29:44.040 그대로 잘 반영이 되는 걸 볼 수 있고요 410 00:29:44.040 --> 00:29:48.440 컴파일 한 후에 다시 실행해 보면 이렇게 됩니다 411 00:29:54.000 --> 00:29:57.719 그러면 이제 Input을 처리해 볼게요 412 00:29:57.719 --> 00:30:00.619 Enhanced Input이라는 게 있는데요 여기 보면 413 00:30:02.049 --> 00:30:06.269 Input에 보면 이렇게 되어있죠 414 00:30:06.269 --> 00:30:09.760 기존에 이렇게 입력에 대한 것도 있긴 한데 415 00:30:09.760 --> 00:30:11.569 이거는 우리가 해봤으니까요 416 00:30:11.569 --> 00:30:14.880 이번에는 Enhanced Input으로 처리를 해 보도록 하겠습니다 417 00:30:14.880 --> 00:30:18.119 언리얼에 이미 여기 보면 Third Person 예제를 보면 418 00:30:18.119 --> 00:30:20.519 이렇게 Enhanced Input이라고 있는데요 419 00:30:20.519 --> 00:30:25.000 기본적인 구조는 Input 액션들을 만들고요 420 00:30:25.000 --> 00:30:28.599 그다음에 이것들을 매핑해서 처리하는 구조로 되어있습니다 421 00:30:28.599 --> 00:30:32.040 그래서 우리도 이런 구조를 만들어 볼게요 422 00:30:32.040 --> 00:30:37.309 먼저 폴더를 하나 만들고요 Input이라고 하겠습니다 423 00:30:39.969 --> 00:30:42.469 그리고 액션 두 개를 등록을 해야겠죠 424 00:30:42.469 --> 00:30:44.769 Input에 보면 여기 액션이 있습니다 Input 액션 425 00:30:46.019 --> 00:30:49.359 이거는 Input 액션이니까 IA라는 접두어를 쓰고요 426 00:30:49.359 --> 00:30:54.000 TPSMove라는 걸 하나 만들고요 427 00:30:54.000 --> 00:30:57.439 그대로 복제해서 Ctrl D 해서 하나 더 만들고 428 00:30:57.439 --> 00:31:02.589 이거는 Jump 이렇게 만들어 주도록 하겠습니다 일단 저장하고요 429 00:31:04.919 --> 00:31:08.719 Jump를 보면 얘는 디지털 해서 bool이라고 되어있네요 430 00:31:08.719 --> 00:31:12.319 True, False 처리를 할 수 있음 431 00:31:12.319 --> 00:31:14.768 그리고 Move를 보면 얘는 이렇게 되어있는데 432 00:31:14.768 --> 00:31:16.920 이거를 열어가지고 Axis 2D를 할게요 433 00:31:16.920 --> 00:31:20.400 Move라는 거는 두 개의 축을 사용할 거기 때문에 434 00:31:20.400 --> 00:31:24.000 그래서 2D라고 지정을 해주겠습니다 435 00:31:25.800 --> 00:31:28.418 그리고 마우스 오른쪽 누르고 436 00:31:28.418 --> 00:31:31.719 Input에서 이번에는 Mapping Context를 하나 만들 건데요 437 00:31:31.719 --> 00:31:35.669 이렇게 만들고 이거는 IMC 플레이어 거니까 438 00:31:35.669 --> 00:31:42.069 이름은 TPS 플레이어로 설정 439 00:31:43.680 --> 00:31:45.190 더블 클릭합니다 440 00:31:46.040 --> 00:31:48.359 그럼 매핑을 할 수 있게 이렇게 되어있는데 441 00:31:48.359 --> 00:31:51.199 여기 더하기를 누르면 이렇게 하나씩 추가할 수 있어요 442 00:31:51.199 --> 00:31:54.199 이걸 열어서 우리가 만든 건 이 두 개죠 443 00:31:54.199 --> 00:31:59.430 Jump랑 Move 두 가지를 넣겠습니다 444 00:32:00.680 --> 00:32:03.599 Jump에 해당하는 버튼을 활성화해줘야 되는데 445 00:32:03.599 --> 00:32:09.519 이렇게 누르고 스페이스바를 처리를 할게요 446 00:32:09.519 --> 00:32:15.280 이동은 4개가 있어야겠죠 W, A, S, D 이런 식으로 447 00:32:15.280 --> 00:32:20.280 그래서 앞뒤로 움직이는 거를 저는 x에다 넣을 거예요 448 00:32:20.280 --> 00:32:25.789 왜냐면 축을 보면 앞뒤가 x축이죠 그리고 좌우가 y축이니까 449 00:32:25.789 --> 00:32:30.560 x값에 앞뒤, 좌우를 y값에 넣도록 할게요 450 00:32:30.560 --> 00:32:33.359 그러면 원래 x, y, z 순서이기 때문에 451 00:32:33.359 --> 00:32:36.280 여기 보시면 아까 밸류 타입에 보면 452 00:32:36.280 --> 00:32:39.040 Axis 2D라고 되어있고 Vector로 되어있죠 453 00:32:39.040 --> 00:32:42.119 당연히 Vector는 x, y 순서겠죠 454 00:32:42.119 --> 00:32:44.319 그래서 이렇게 넣어주도록 할 건데요 455 00:32:44.319 --> 00:32:46.640 일단은 키를 할당을 하겠습니다 456 00:32:46.640 --> 00:32:51.000 W, S 해서 이거는 Vertical이라는 개념으로 쓸 거고 457 00:32:51.000 --> 00:32:56.639 이거는 A, D 해서 Horizontal이라는 개념으로 사용하도록 할게요 458 00:32:57.469 --> 00:33:00.119 w는 그냥 누르면 1 이렇게 되겠죠 459 00:33:00.119 --> 00:33:03.719 아무것도 안 누르면 0이고 누르면 1 이렇게 될 겁니다 460 00:33:03.719 --> 00:33:06.920 그럼 S는 누르면 -1이 되어야겠죠 461 00:33:06.920 --> 00:33:11.839 그래서 Modifier 쪽에서 하나 추가를 해줄 건데 462 00:33:11.839 --> 00:33:15.819 여기 보면 Negate라는 게 있어요 이게 음수거든요 463 00:33:15.819 --> 00:33:21.640 그러면 위에 있는 w는 x값에 1이 들어가고요 누르면 464 00:33:21.640 --> 00:33:23.000 안 누르면 0이 되겠죠 465 00:33:23.000 --> 00:33:28.869 그리고 S는 누르면 -1이 x값에 들어가는 개념입니다 기본적으로 466 00:33:29.469 --> 00:33:31.079 이렇게 두 개는 설정을 해줬고요 467 00:33:31.079 --> 00:33:33.160 그러면 A랑 D를 해야 되겠죠 468 00:33:33.160 --> 00:33:36.680 A와 D는 저는 y에다 넣고 싶어요 469 00:33:36.680 --> 00:33:39.640 그래서 여기 Modifier를 하나 추가를 하고요 470 00:33:39.640 --> 00:33:43.168 여기 보면 Swizzle이라는 게 있습니다 471 00:33:43.168 --> 00:33:49.368 Swizzle은 펼쳐보시면 Order죠 순서를 바꿀 수가 있는데 472 00:33:49.368 --> 00:33:51.760 y, x, z 순서로 이렇게 바꿀 수가 있어요 473 00:33:52.418 --> 00:33:57.839 가장 왼쪽에 있는 축에 값을 담는 것이라고 기억하시면 되고요 474 00:33:57.839 --> 00:34:00.920 그러면 y에다 담게 되는 거예요 Swizzle을 해주면 475 00:34:00.920 --> 00:34:05.199 여기 보시면 여러분이 원하시는 값을 바꿔서 넣을 수도 있습니다 476 00:34:05.199 --> 00:34:10.379 일단은 우리는 Swizzle을 통해서 y에다가 넣겠다고 하는 거고요 477 00:34:11.668 --> 00:34:15.668 그러면 A는 음수죠 D는 양수고 478 00:34:15.668 --> 00:34:18.690 일단은 D도 Swizzle을 해줘야 되고요 이렇게 479 00:34:19.618 --> 00:34:22.679 여기 A랑 D 두 개는 y에 넣는 겁니다 480 00:34:22.679 --> 00:34:25.879 근데 D는 양수니까 그대로 넣으면 되는데 481 00:34:25.879 --> 00:34:28.600 A 같은 경우에는 음수예요 -1을 넣어야 됩니다 482 00:34:28.600 --> 00:34:33.549 그래서 하나를 더 추가하고 여기다가 Negate 이렇게 483 00:34:36.399 --> 00:34:37.800 이렇게 넣어주도록 하겠습니다 484 00:34:37.800 --> 00:34:39.468 이렇게 지정을 해주시면 됩니다 485 00:34:39.468 --> 00:34:46.368 전체를 보면 W는 아무것도 안 했고 S는 Negate 486 00:34:46.368 --> 00:34:48.760 A, D는 이런 식으로 처리를 했습니다 487 00:34:49.760 --> 00:34:52.760 그리고 마우스 회전도 처리를 해야 되겠네요 488 00:34:52.760 --> 00:34:55.399 하나를 더 추가하겠습니다 489 00:34:55.399 --> 00:34:58.000 Input을 Move를 복제를 하고요 490 00:34:58.000 --> 00:35:00.560 이거는 Look이라고 하겠습니다 491 00:35:01.918 --> 00:35:05.679 여기에서 매핑을 하나 추가를 하고요 492 00:35:05.679 --> 00:35:07.370 여기는 Look입니다 493 00:35:09.120 --> 00:35:13.199 Look은 마우스 x, y를 입력을 받을 건데요 494 00:35:13.199 --> 00:35:16.968 마우스 x랑 마우스 y요 495 00:35:22.468 --> 00:35:23.679 이렇게 해주고요 496 00:35:23.679 --> 00:35:29.329 x, y니까 y는 Swizzle을 해서 받으면 되겠죠 이렇게 497 00:35:33.168 --> 00:35:37.618 그리고 보면 x는 좌·우인데 y는 상·하잖아요 498 00:35:37.618 --> 00:35:42.399 일반적으로 마우스랑 실제 좌표계의 방향은 반대 499 00:35:42.399 --> 00:35:45.040 그래서 이거를 Negate까지 넣어주겠습니다 500 00:35:45.040 --> 00:35:49.289 이렇게 지정을 해줄게요 501 00:35:50.168 --> 00:35:53.580 TPS 클래스로 이동을 하고요 502 00:35:56.218 --> 00:36:00.140 TPS 플레이어로 이동하고요 아래로 내려옵니다 여기다가 503 00:36:01.268 --> 00:36:05.199 여기다가 IMC와 IA를 입력 504 00:36:05.199 --> 00:36:14.560 UPROPERTY(EditAnywhere) 이렇게 해줘야 담을 수 있을 거예요 505 00:36:14.560 --> 00:36:16.300 class라고 하고요 506 00:36:18.418 --> 00:36:28.918 UInputMappingContext 이렇게 그다음 여기는 이름을 IMC_player 507 00:36:30.868 --> 00:36:32.718 이렇게 기재를 해주겠습니다 508 00:36:34.318 --> 00:36:36.768 그리고 액션도 등록을 해야겠죠 509 00:36:36.768 --> 00:36:40.070 이렇게 해서 이거는 UInputAction이고요 510 00:36:41.120 --> 00:36:46.580 여기는 IMC가 아니라 IA_Move라고 하면 되고요 511 00:36:48.080 --> 00:36:52.568 그대로 복사하고 하나 더 넣을게요 Jump도 있죠 512 00:36:52.568 --> 00:36:58.439 Jump 말고 Move 밑에 Look이라는 것도 추가하겠습니다 이렇게요 513 00:37:00.589 --> 00:37:07.310 그러면 이거에 대응하는 함수를 만들어야겠죠 여기다가 514 00:37:12.118 --> 00:37:18.339 void OnIAMove라고 할게요 이렇게 하고요 515 00:37:20.568 --> 00:37:25.559 Move 그다음에 Look 그리고 Jump 516 00:37:26.768 --> 00:37:32.618 이렇게 3개의 기능을 연결해 줄 건데요 근데 여기에 517 00:37:32.618 --> 00:37:35.199 매개 변수가 있어요 여기다가 이렇게 작성하면 됩니다 518 00:37:35.199 --> 00:37:41.040 const라고 하고요 FInputActionValue라는 게 있어요 519 00:37:41.040 --> 00:37:45.280 이거는 &이라고 하고 value 이렇게 받겠습니다 520 00:37:45.280 --> 00:37:49.018 근데 이걸 사용하려면 헤더를 추가해야 되거든요 이렇게 521 00:37:49.018 --> 00:37:52.129 그러면 이거를 잠깐 검색을 해 볼까요? 522 00:37:53.618 --> 00:37:56.339 여기서 이렇게 검색을 해보시면 523 00:37:58.639 --> 00:38:01.318 이렇게 되어있죠 이거를 추가하면 되는데 보시면 524 00:38:01.318 --> 00:38:05.418 모듈이 Enhancedinput이라고 되어있어요 525 00:38:06.268 --> 00:38:12.239 그래서 이쪽으로 와보시면 제가 미리 적어놨었는데 526 00:38:12.239 --> 00:38:15.840 여기다가 아마 여러분들은 이렇게 적혀있을 겁니다 527 00:38:15.840 --> 00:38:20.170 여기다 콤마 하시고 쌍따옴표 문자열로 하신 다음에 528 00:38:20.768 --> 00:38:23.040 EnhancedInput 아까 전에 여기 있죠 529 00:38:23.040 --> 00:38:26.380 EnhancedInput 이거를 그대로 여기다 작성을 해줍니다 530 00:38:28.560 --> 00:38:33.120 모듈을 등록해야 클래스를 사용할 수 있음 531 00:38:33.120 --> 00:38:38.240 이렇게 등록을 해주시고 이거를 include 하겠습니다 532 00:38:42.968 --> 00:38:47.120 이렇게 해서 상단에다가 하실 때 533 00:38:47.120 --> 00:38:52.767 generated 위쪽에 작성해야 함 534 00:38:53.517 --> 00:38:55.767 이렇게 기재를 해주고요 535 00:38:58.159 --> 00:39:01.759 같은 방식으로 전부다 이렇게 넣어주도록 하겠습니다 536 00:39:03.217 --> 00:39:05.219 구현부를 만들어 주시고요 537 00:39:06.719 --> 00:39:08.400 일단 컴파일을 해볼까요 538 00:39:12.367 --> 00:39:13.439 컴파일 오류가 나네 539 00:39:13.439 --> 00:39:15.120 언리얼이 열려 있어 컴파일 오류 발생 540 00:39:15.120 --> 00:39:17.360 언리얼이 열려있으니까 끄고요 541 00:39:17.360 --> 00:39:19.667 다시 컴파일 해보겠습니다 542 00:39:21.767 --> 00:39:23.919 그러면 잘 성공하는 걸 볼 수 있고요 543 00:39:23.919 --> 00:39:25.520 가끔 이렇게 빨간 줄이 가는데요 544 00:39:25.520 --> 00:39:27.850 이건 일단 무시하고 진행하시면 돼요 545 00:39:31.017 --> 00:39:34.479 그리고 이거를 이제 등록해서 사용하는 거거든요 546 00:39:36.067 --> 00:39:43.517 TPS의 BeginPlay로 이동하여 작성 547 00:39:45.120 --> 00:39:49.140 먼저 플레이어 컨트롤러를 가져옵니다 548 00:39:49.760 --> 00:39:54.567 auto pc라고 할게요 Cast 하고요 549 00:39:54.567 --> 00:39:57.600 현재 지금 이 플레이어를 조작하고 있는 550 00:39:57.600 --> 00:39:59.760 플레이어 컨트롤러를 가져올 수 있는데 551 00:39:59.760 --> 00:40:03.059 그거를 캐스팅해서 플레이어 컨트롤러로 552 00:40:06.717 --> 00:40:09.517 플레이어 컨트롤러죠 이렇게 553 00:40:09.517 --> 00:40:16.917 캐스팅에 성공하면 실제로 조작하는 주인공 플레이어라는 것을 검증 554 00:40:16.917 --> 00:40:19.967 이렇게 해서 GetController라고 합니다 555 00:40:22.167 --> 00:40:26.639 가져온 다음에 이게 성공했다면 pc가 null이 아니라면 556 00:40:26.639 --> 00:40:29.120 물론 nullptr이 아니라면 이렇게 작성해도 되지만 557 00:40:29.120 --> 00:40:30.470 이렇게 써도 돼요 558 00:40:32.167 --> 00:40:37.167 그다음에 ULocalPlayer라는 게 있습니다 여기 보면 559 00:40:37.167 --> 00:40:40.767 Getsubsystem을 가져올 수 있는데요 이렇게 560 00:40:40.767 --> 00:40:42.879 이건 템플릿으로 되어있고요 561 00:40:42.879 --> 00:40:49.217 여기에 UEnhancedInputLocalPlayerSubsystem 562 00:40:49.217 --> 00:40:50.639 이렇게 기재를 해주시면 되고요 563 00:40:50.639 --> 00:40:53.239 여기다가 플레이어 컨트롤러에 564 00:40:56.567 --> 00:41:02.000 Local Player 가져와서 넣어주면 되고요 565 00:41:02.000 --> 00:41:04.399 이거는 당연히 헤더를 추가해야겠죠 566 00:41:04.399 --> 00:41:07.299 이것도 검색을 한 다음에 567 00:41:11.919 --> 00:41:16.717 여기 있는 include를 사용해 보도록 하겠습니다 568 00:41:19.199 --> 00:41:21.499 이렇게 추가를 해주시면 되고요 569 00:41:24.639 --> 00:41:25.766 이걸 일단 받아야겠죠 570 00:41:25.766 --> 00:41:29.919 얘는 서브시스템을 반환하는데요 571 00:41:29.919 --> 00:41:34.169 auto subsystem이라고 해서 받을게요 572 00:41:37.266 --> 00:41:40.639 이렇게 한 다음에 얘도 이제 null 체크를 해야죠 573 00:41:40.639 --> 00:41:43.717 null이 아니라면 subsystem에 574 00:41:47.017 --> 00:41:51.160 잠깐만요 컴파일 한번 하고 가겠습니다 575 00:41:57.317 --> 00:42:04.317 컴파일 일단 성공했죠 subsystem에서 Clear 576 00:42:04.317 --> 00:42:07.280 자동 완성이 안되는데요 일단 적을게요 577 00:42:13.199 --> 00:42:16.320 이렇게 해서 일단 매핑되어 있는 건 다 날려버리고요 578 00:42:16.320 --> 00:42:18.066 다시 매핑을 하겠습니다 579 00:42:18.066 --> 00:42:28.239 여기서 AddMappingContext라는 함수를 호출해서 580 00:42:28.239 --> 00:42:32.959 여기다가 IMC_Player 그리고 0번 이렇게 넣어주면 되겠습니다 581 00:42:34.159 --> 00:42:36.080 이거는 우선순위 같은 개념이에요 582 00:42:36.080 --> 00:42:37.760 그래서 이걸 바로 사용할 거니까 583 00:42:37.760 --> 00:42:40.680 이렇게 넣어서 등록을 해주겠습니다 584 00:42:47.280 --> 00:42:50.517 이것을 구현하고 여기다 등록해서 사용하면 되겠죠 585 00:42:50.517 --> 00:42:51.729 등록을 해 볼게요 586 00:42:55.067 --> 00:42:57.840 등록하기 위한 캐스팅 필요 587 00:42:57.840 --> 00:43:01.679 보면 UEnhancedInputComponent라는 게 있어요 588 00:43:01.679 --> 00:43:04.320 보면 UInputComponent인데 이거를 589 00:43:04.320 --> 00:43:06.639 이걸로 캐스팅해서 사용할 겁니다 590 00:43:06.639 --> 00:43:13.040 이렇게 해서 Cast 해서 사용할 건데 591 00:43:13.040 --> 00:43:15.679 CastChecked라는 것도 있어요 592 00:43:15.679 --> 00:43:20.080 CastChecked 이거는 null 체크까지 다 해주는 개념인데 593 00:43:20.080 --> 00:43:26.480 이렇게 해서 이거를 캐스팅해서 사용하도록 할게요 594 00:43:31.517 --> 00:43:33.120 이렇게 하면 되겠죠 595 00:43:33.120 --> 00:43:36.020 이것도 사용하려면 헤더를 추가를 해야 됩니다 596 00:43:36.967 --> 00:43:41.767 헤더를 자동으로 추가 597 00:43:41.767 --> 00:43:44.719 이렇게 하면 잘 반영이 되는 걸 볼 수 있고요 598 00:43:44.719 --> 00:43:46.719 이것도 이런 식으로 추가를 해 볼게요 599 00:43:46.719 --> 00:43:48.639 이게 자꾸 오류가 뜨는데요 600 00:43:48.639 --> 00:43:52.190 이것도 이렇게 추가를 하겠습니다 601 00:43:53.040 --> 00:43:55.510 이렇게 두 개를 include를 했어요 602 00:43:59.560 --> 00:44:04.466 인클루드로 오류 해결 이렇게 하니까 오류가 없어지네요 빌드를 하고요 603 00:44:06.520 --> 00:44:08.750 그러면 여기다가 연결을 해줘야겠죠 604 00:44:09.566 --> 00:44:11.989 바인드를 해주도록 하겠습니다 605 00:44:15.616 --> 00:44:18.816 EnhancedInput의 경우에는 606 00:44:18.816 --> 00:44:21.320 이게 Action도 있고 Axis도 있고 그렇잖아요 607 00:44:21.320 --> 00:44:24.919 Input은 모두 BindAction으로 설정 608 00:44:24.919 --> 00:44:27.816 BindAction이라고 하고요 609 00:44:27.816 --> 00:44:30.416 그다음에 내가 Move부터 하겠다 그러면 610 00:44:30.416 --> 00:44:33.399 IA_Move 이렇게 넣어주시고 611 00:44:33.399 --> 00:44:39.719 그다음에 ETriggerEvent에 보면 이렇게 있어요 612 00:44:39.719 --> 00:44:42.816 Triggered가 있고요 Started, Ongoing, Completed 613 00:44:42.816 --> 00:44:45.810 이런 것들이 있습니다 여러 가지 있는데 614 00:44:46.760 --> 00:44:49.466 기본적으로 Axis를 처리하려면 Triggered로 하면 돼요 615 00:44:49.466 --> 00:44:51.000 그럼 계속해서 들어오고요 616 00:44:51.000 --> 00:44:52.360 그다음에 버튼 처리를 할 때는 617 00:44:52.360 --> 00:44:55.679 Started와 Completed를 사용하면 됩니다 618 00:44:55.679 --> 00:44:59.616 그래서 이거는 Move니까 Triggered로 하면 되겠죠 619 00:44:59.616 --> 00:45:03.039 this를 넣고요 그다음에 여기에 함수의 주소를 넣습니다 620 00:45:04.639 --> 00:45:07.840 기존의 방식과 크게 다르진 않아요 621 00:45:07.840 --> 00:45:10.016 이렇게 등록해 주시고요 622 00:45:10.016 --> 00:45:17.159 그리고 복제해서 저는 Lookup도 623 00:45:17.159 --> 00:45:19.666 쳐다보는 것도 이렇게 해주도록 할 거고요 624 00:45:19.666 --> 00:45:21.129 이거는 Look이겠죠 625 00:45:26.216 --> 00:45:31.560 Jump도 해보겠습니다 Jump는 버튼 형식이니까 626 00:45:31.560 --> 00:45:35.199 이렇게 해서 Jump라고 하고요 627 00:45:35.199 --> 00:45:36.760 그리고 이건 Triggered가 아니라 628 00:45:36.760 --> 00:45:41.216 눌렀을 때만 발동을 할 거라서 Started로 하겠습니다 629 00:45:42.316 --> 00:45:44.070 여기는 Jump라고 하고요 630 00:45:45.066 --> 00:45:49.066 플레이어 이동 및 회전 처리 631 00:45:49.320 --> 00:45:52.040 다음은 플레이어를 이동시키고 632 00:45:52.040 --> 00:45:54.616 회전 처리를 구현해 보겠습니다 633 00:45:55.080 --> 00:45:57.666 이동부터 해볼까요 이동은 634 00:45:57.666 --> 00:46:00.466 이동을 하기 위해서 일단은 방향을 저장해야겠죠 635 00:46:00.466 --> 00:46:03.666 여기 넘어온 값을 그냥 바로 쓸 수 있는 것이 아니기 때문에 636 00:46:03.666 --> 00:46:07.379 여기서 Direction이라는 변수를 하나 만들고요 Vector로 637 00:46:12.966 --> 00:46:15.569 Direction에다가 담아주도록 하겠습니다 638 00:46:16.716 --> 00:46:20.216 여기 담을 건데요 이렇게 바로 쓸 수 있는 건 아니고요 639 00:46:20.216 --> 00:46:23.439 여기 보면 이 value를 가져와야겠죠 640 00:46:23.439 --> 00:46:26.239 value에서 Get 해서 가져오면 되는데 641 00:46:26.239 --> 00:46:30.816 지금 Move 같은 경우에는 제가 껐지만 보면 642 00:46:30.816 --> 00:46:33.616 Move는 FVector2D로 되어 있습니다 643 00:46:33.616 --> 00:46:36.266 이렇게 해서 가지고 오고요 644 00:46:36.266 --> 00:46:40.600 그러면 이렇게 하면 되겠죠 645 00:46:40.600 --> 00:46:43.560 그러면 여기에 있는 값을 여기다가 똑같이 넣어주면 됩니다 646 00:46:43.560 --> 00:46:45.700 x에다가 x를 넣고요 647 00:46:49.000 --> 00:46:50.959 그리고 x, y를 쓰고 있으니까 648 00:46:50.959 --> 00:46:56.080 y에다가 y값을 이렇게 넣어주면 되겠습니다 649 00:46:59.080 --> 00:47:10.879 Lookup 회전 함수: AddControllerPitchInput, AddControllerYawInput 그리고 Lookup 같은 경우에는 회전은 이런 함수가 있어요 650 00:47:10.879 --> 00:47:14.719 이게 뭐냐면 Input 회전 값에 대해서 651 00:47:14.719 --> 00:47:16.360 여기다 값을 넣어주면요 652 00:47:16.360 --> 00:47:20.040 일단은 회전 정보를 저장하고 있어요 653 00:47:20.040 --> 00:47:25.280 그다음에 그것을 캐릭터 쪽에서 어디다가 반영할 것이냐 654 00:47:25.280 --> 00:47:27.365 그거를 결정을 해주면 되거든요 655 00:47:27.365 --> 00:47:30.399 일단은 여기서는 Pitch랑 Yaw를 할 건데요 656 00:47:30.399 --> 00:47:32.916 왜냐면 Pitch랑 Yaw가 657 00:47:32.916 --> 00:47:36.560 Pitch는 끄덕끄덕이고 Yaw는 도리도리거든요 658 00:47:36.560 --> 00:47:42.116 그래서 이렇게 회전하고 이렇게 회전시키고 659 00:47:42.760 --> 00:47:45.800 이렇게 회전시키고 이렇게 회전시킬 것이기 때문에 660 00:47:45.800 --> 00:47:55.916 그래서 AddControllerPitchInput, AddControllerYawInput 661 00:47:55.916 --> 00:47:58.199 두 가지를 사용하도록 하겠습니다 662 00:48:02.366 --> 00:48:05.600 이렇게 되겠죠 그럼 여기서 또 가져와야겠죠 663 00:48:05.600 --> 00:48:07.599 같은 방식으로 이렇게 가지고 옵니다 664 00:48:10.616 --> 00:48:14.166 마우스에서 x가 좌·우 그리고 y가 상·하이기 때문에 665 00:48:14.166 --> 00:48:16.840 끄덕끄덕은 y가 되겠죠 666 00:48:16.840 --> 00:48:19.066 vec의 y 값을 여기다 넣어주고요 667 00:48:20.840 --> 00:48:25.000 그다음에 여기다가 vec의 x 값을 이렇게 넣어주면 668 00:48:25.000 --> 00:48:28.549 끄덕끄덕 도리도리 이런 것들을 하게 될 수 있습니다 669 00:48:29.766 --> 00:48:31.959 그다음에 Jump는 이렇게 해요 670 00:48:31.959 --> 00:48:33.669 그냥 Jump라고 하시면 됩니다 671 00:48:35.919 --> 00:48:38.959 이렇게 Jump라는 함수를 호출하면 Jump를 뛸 수 있고요 672 00:48:38.959 --> 00:48:40.719 이렇게 구현을 했고요 673 00:48:40.719 --> 00:48:45.479 그러면 이거를 실제로 이동하는 부분은 674 00:48:45.479 --> 00:48:47.966 T에서 구현을 해줘야겠죠 675 00:48:47.966 --> 00:48:51.315 캐릭터 같은 경우에는 캐릭터 무브먼트라는 컴포넌트가 있는데 676 00:48:51.315 --> 00:48:53.040 그걸 이용해서 이동을 할 겁니다 677 00:48:53.040 --> 00:48:57.360 거기 보면 AddMovementInput이라는 기능이 있어요 678 00:48:57.360 --> 00:49:04.616 여기다가 Direction을 넣어주면 됩니다 이렇게 넣어주고 679 00:49:04.616 --> 00:49:07.520 그런데 Direction이라는 걸 여기서 값을 계속 채우고 있잖아요 680 00:49:07.520 --> 00:49:09.439 그러면 여기 계속 남아있겠죠 681 00:49:09.439 --> 00:49:11.515 그럼 내가 누르지 않아도 갈 수가 있는 거죠 682 00:49:11.515 --> 00:49:14.215 그래서 무조건 이거는 683 00:49:14.215 --> 00:49:25.199 Direction을 한번 처리한 후에는 ZeroVector를 넣어 초기화 684 00:49:25.199 --> 00:49:29.065 누를 때만 값이 들어가고 떼면 Zero가 되는 거죠 685 00:49:29.065 --> 00:49:31.400 그럼 안 움직이겠죠 이렇게요 686 00:49:33.965 --> 00:49:36.370 한번 결과를 보도록 할게요 687 00:49:42.615 --> 00:49:50.479 그러면 플레이어 쪽에 입력하는 내용들을 다 넣어줘야 됩니다 688 00:49:51.715 --> 00:49:54.800 입력하는 부분이 여기 있네요 689 00:49:54.800 --> 00:49:59.120 여기다가 IMC 여기는 우리가 만든 거를 넣어주시고요 690 00:49:59.120 --> 00:50:02.010 그다음에 Move는 TPS라고 되어있는 것들 691 00:50:03.265 --> 00:50:08.249 TPSLook, TPSJump 이렇게 넣어주시면 됩니다 692 00:50:10.415 --> 00:50:12.919 컴파일 해주고요 한번 실행을 해 볼게요 693 00:50:12.919 --> 00:50:15.015 그러면 회전이 되고요 694 00:50:15.015 --> 00:50:20.565 상하좌우로 회전이 되고 이렇게 움직여지죠 695 00:50:20.565 --> 00:50:22.115 근데 상하좌우로 회전되는 거는 696 00:50:22.115 --> 00:50:25.399 제가 뭔가 설정을 좀 했어요 보시면 697 00:50:27.949 --> 00:50:34.065 회전하는 거는 기본적으로 이렇게 이렇게 이렇게 3개 698 00:50:34.065 --> 00:50:36.959 셀프가 있고 그다음에 여기 스프링 암이 있죠 699 00:50:36.959 --> 00:50:38.515 그리고 캐릭터 무브먼트가 있습니다 700 00:50:38.515 --> 00:50:44.239 여기 보면 rotation이라고 한번 보세요 701 00:50:44.239 --> 00:50:46.315 검색해 보면 이렇게 체크되어 있죠 여기 보면 702 00:50:46.315 --> 00:50:49.600 Pawn에 Use Controller Rotation Yaw라고 되어 있고 703 00:50:49.600 --> 00:50:52.080 그다음에 원래는 여기 체크가 안 되어 있어요 704 00:50:52.080 --> 00:50:54.600 그래서 여러분들은 실행해 보시면 705 00:50:54.600 --> 00:50:58.465 아마 이렇게만 회전이 될 거고 이동은 될 겁니다 706 00:50:58.465 --> 00:51:02.040 근데 이동도 이상해요 나는 뒤를 보는데 뒤로 가죠 707 00:51:02.040 --> 00:51:04.965 w 누르는데 절대적인 708 00:51:04.965 --> 00:51:09.365 이동이 부자연스러움 저 앞쪽으로만 가고 이렇게 처리가 되는 걸 볼 수 있는데요 709 00:51:09.365 --> 00:51:12.665 이런 것들을 좀 해결을 해줘야겠죠 710 00:51:13.199 --> 00:51:18.929 먼저 회전부터 볼게요 회전은 기본적으로 이렇게 711 00:51:20.479 --> 00:51:24.315 AddControllerPitchInput/YawInput이라는 값에다가 712 00:51:24.315 --> 00:51:26.120 이렇게 회전값을 넣어주면요 713 00:51:26.120 --> 00:51:29.919 실제로 회전하는 정보를 일단은 가지고 있습니다 714 00:51:29.919 --> 00:51:32.815 이거를 반영하는 것은 여기 있는 715 00:51:32.815 --> 00:51:35.239 옵션을 통해 회전 반영 716 00:51:35.239 --> 00:51:40.639 그래서 셀프는 실제로 TPSPlayer 자체를 말하는 거잖아요 717 00:51:40.639 --> 00:51:44.600 TPSPlayer의 Yaw에 대한 회전축에다가 718 00:51:44.600 --> 00:51:47.639 컨트롤러의 값을 사용하겠다 이런 뜻입니다 719 00:51:47.639 --> 00:51:50.915 그러면 Pitch를 체크해 보면 이렇게 되는 거죠 720 00:51:50.915 --> 00:51:53.809 회전하면 이렇게 누워 버리는 거죠 721 00:51:55.415 --> 00:51:58.760 이렇게 F8을 누르면 빠져나올 수 있는데 722 00:51:58.760 --> 00:52:00.399 이런 식으로 되는 거예요 723 00:52:00.399 --> 00:52:03.690 그래서 이건 아니고 저희가 하고 싶은 거는 724 00:52:03.690 --> 00:52:05.879 Pitch는 이거를 회전하는 게 아니라 725 00:52:05.879 --> 00:52:07.879 카메라만 회전하고 싶어요 726 00:52:07.879 --> 00:52:12.365 그래서 여기에는 그냥 그대로 두고요 그다음에 727 00:52:12.365 --> 00:52:17.765 Spring Arm - Use Pawn Control Rotation 체크 728 00:52:18.679 --> 00:52:24.470 이렇게 하고 실행을 해보면 이런 식으로 처리가 되는 거죠 729 00:52:25.320 --> 00:52:28.615 그다음에 마지막으로 Jump도 이렇게 하죠 730 00:52:28.615 --> 00:52:31.465 근데 마지막으로 이거를 731 00:52:31.465 --> 00:52:33.800 바라보는 방향으로 이동을 해야 될 것 같아요 732 00:52:33.800 --> 00:52:37.814 지금 보면 절대적인 방향으로 움직이고 있거든요 733 00:52:37.814 --> 00:52:42.740 이쪽을 보더라도 앞쪽을 가겠다고 했는데 이렇게 가요 734 00:52:45.065 --> 00:52:47.869 이거를 해결해 보도록 할게요 735 00:52:49.915 --> 00:52:52.619 플레이어로 와서요 여기서 736 00:52:54.719 --> 00:52:57.915 Tick으로 갑니다 Tick에서 이거를 처리를 해 줄 건데 737 00:52:57.915 --> 00:53:04.965 이 Direction 방향을요 절대적인 방향이죠 738 00:53:04.965 --> 00:53:14.865 절대적인 방향을 나를 기준으로 회전하고 싶다라는 거죠 739 00:53:14.865 --> 00:53:16.719 그러니까 무슨 말이냐면 앞쪽이에요 740 00:53:16.719 --> 00:53:18.665 그러면 원래 동서남북 이런 식으로 741 00:53:18.665 --> 00:53:21.760 동쪽 이렇게 북쪽 이렇게 되는 건데 742 00:53:21.760 --> 00:53:26.815 나를 기준으로 이동하게 만듦 그거를 나를 기준으로 앞쪽 이렇게 743 00:53:26.815 --> 00:53:32.315 그런 식으로 Direction 값을 바꿔주도록 하겠습니다 744 00:53:32.315 --> 00:53:34.159 어떻게 하냐면 이렇게 할 수 있어요 745 00:53:34.159 --> 00:53:39.919 Direction = FTransform이라고 하고요 746 00:53:39.919 --> 00:53:46.479 그다음에 여기서 GetControlRotation이라는 게 있습니다 747 00:53:48.015 --> 00:53:54.879 컨트롤러 쪽에 입력받은 회전 값을 그대로 가져옴 748 00:53:54.879 --> 00:53:57.359 지금 우리가 여기다 이렇게 집어넣었잖아요 749 00:53:58.115 --> 00:54:02.680 그러면 거기에 저장되어 있는 회전 값을 가지고 옵니다 750 00:54:03.515 --> 00:54:11.960 그다음에 이거를 기준으로 TransformVector라는 게 있어요 751 00:54:14.310 --> 00:54:17.764 블루프린트에서는 이게 TransformDirection 이렇게 되어있는데 752 00:54:17.764 --> 00:54:20.560 이거는 TransformVector라는 이름으로 되어있습니다 753 00:54:20.560 --> 00:54:25.439 여기다가 Direction을 이렇게 넣어주시고 변환하시면 돼요 754 00:54:25.439 --> 00:54:32.214 이러면 지금 저장된 컨트롤에 들어있는 회전 방향으로 755 00:54:32.214 --> 00:54:37.399 기준을, 축을 바꿔서 반환을 해줍니다 이렇게 되고요 756 00:54:38.364 --> 00:54:46.114 그러면 이걸 가지고 컴파일 한 다음에 결과를 볼게요 757 00:54:46.114 --> 00:54:49.064 실행을 해보면 제가 이쪽을 쳐다보고 w를 누르면 758 00:54:49.064 --> 00:54:53.514 이쪽으로 이제 이동을 하게 되죠 이렇게 하고 이렇게 759 00:54:53.514 --> 00:54:57.500 그래서 이런 식으로 제어를 할 수가 있다는 부분이고요 760 00:54:58.614 --> 00:55:03.399 그리고 플레이어 같은 경우에 우리가 이런 식으로 했는데 761 00:55:03.399 --> 00:55:05.679 지금은 얼굴을 볼 수가 없거든요 762 00:55:05.679 --> 00:55:07.314 제가 이렇게 하고 회전을 이렇게 해보면 763 00:55:07.314 --> 00:55:08.959 절대로 얼굴을 보여주지 않아요 764 00:55:08.959 --> 00:55:10.520 뒤통수만 볼 수 있는데 765 00:55:10.520 --> 00:55:13.479 보통 롤플레잉 게임들, RPG 게임이라고 하죠 766 00:55:13.479 --> 00:55:15.864 그런 게임들에서는 얼굴을 볼 수 있죠 767 00:55:15.864 --> 00:55:18.800 그리고 얼굴을 보더라도 w를 딱 누르면 768 00:55:18.800 --> 00:55:20.700 뒤를 돌아서 가게 됩니다 769 00:55:21.664 --> 00:55:24.669 그래서 그런 처리도 할 수가 있어요 어떻게 하냐면 770 00:55:25.664 --> 00:55:31.560 여기에서 셀프, 본체 회전은 하지 않고요 이걸 꺼주시고 771 00:55:31.560 --> 00:55:35.114 그다음에 캐릭터 무브먼트가 있죠 여기에 보면 772 00:55:35.114 --> 00:55:37.600 Rotation을 검색했을 때 이렇게 나와요 773 00:55:37.600 --> 00:55:40.364 여기에 Orient Rotation to Movement라는 게 있습니다 774 00:55:40.364 --> 00:55:45.280 이거를 체크해 주신 다음에 컴파일 하고 실행을 해보면 775 00:55:45.280 --> 00:55:48.969 이제 이렇게 할 수가 있죠 얼굴을 이제 볼 수가 있고요 776 00:55:49.919 --> 00:55:52.199 이렇게 얼굴 보다가 w를 누르잖아요 777 00:55:52.199 --> 00:55:56.314 그러면 내가 이동하는 방향으로 회전해 버립니다 778 00:55:56.314 --> 00:55:59.964 w를 누른 상태에서는 이런 식으로 회전을 하게 돼요 779 00:56:02.959 --> 00:56:05.479 누르지 않았을 땐 이렇게 되고요 780 00:56:05.479 --> 00:56:07.364 이 기능을 이용하시면 781 00:56:07.364 --> 00:56:10.364 여러분들이 원하는 컨텐츠를 제작하실 때 782 00:56:10.364 --> 00:56:14.179 어떤 콘셉트를 가져갈 거냐에 따라서 이렇게 만들 수 있겠죠 783 00:56:15.029 --> 00:56:19.840 근데 저희는 TPS이기 때문에 이렇게 하진 않고요 784 00:56:19.840 --> 00:56:21.964 그냥 뒤통수만 보도록 하겠습니다 785 00:56:21.964 --> 00:56:25.120 그래서 원래대로 체크를 해줄게요 786 00:56:25.120 --> 00:56:27.399 그다음에 Jump 부분도 있는데요 787 00:56:27.399 --> 00:56:29.320 보시면 Jump 이렇게 뛰잖아요 788 00:56:29.320 --> 00:56:33.679 만약에 두 번을 뛰고 싶다 할 때 설정을 해줄 수가 있는데 789 00:56:33.679 --> 00:56:37.120 Character에 가서 이거는 잠깐 끄고요 790 00:56:37.120 --> 00:56:38.864 그다음에 여기 셀프를 누르고 791 00:56:38.864 --> 00:56:45.479 여기에서 Jump Max Count라고 검색을 해보시면 792 00:56:45.479 --> 00:56:47.814 이런 게 있습니다 1이라고 되어있죠 793 00:56:47.814 --> 00:56:52.879 이거를 2라고 바꾸시면 두 번 띌 수 있어요 794 00:56:52.879 --> 00:56:57.399 이렇게 한 번, 두 번 이렇게 2단 Jump가 가능하고요 795 00:56:57.399 --> 00:56:59.919 이런 식으로 이 값을 어떻게 하느냐에 따라서 796 00:56:59.919 --> 00:57:02.719 Jump 횟수를 바꿀 수가 있죠 797 00:57:02.719 --> 00:57:07.570 그리고 여기 Character Movement에 보시면 798 00:57:10.063 --> 00:57:13.479 Jump에 대한 설정을 할 수가 있는데요 799 00:57:13.479 --> 00:57:14.719 Jumping, Falling이 있죠 800 00:57:14.719 --> 00:57:17.564 여기에 보면 Air Control이 있어요 801 00:57:17.564 --> 00:57:19.864 더 많은 내용이 있는데 802 00:57:19.864 --> 00:57:21.564 여기 보면 Air Control이 있고 803 00:57:21.564 --> 00:57:24.264 이게 0.05라고 되어있습니다 이게 뭐냐면 804 00:57:24.264 --> 00:57:28.199 Air Control은 점프 중에 받는 힘을 설정 805 00:57:28.199 --> 00:57:29.879 굉장히 작은 값을 받게 되어있어서 806 00:57:29.879 --> 00:57:32.310 그래서 지금 보면 Jump를 한 다음에 807 00:57:33.560 --> 00:57:35.360 반대쪽으로 이렇게 눌러보셔도 808 00:57:35.360 --> 00:57:38.719 크게 저항이 일어나는 것 같지가 않아요 809 00:57:38.719 --> 00:57:43.414 계속해서 Jump를 뛴 방향으로 계속 가게 되는 느낌입니다 810 00:57:44.564 --> 00:57:51.760 공중에서도 방향 전환을 하려면 Air Control 값을 증가시킴 811 00:57:51.760 --> 00:57:55.399 이거를 5 정도로 올려 볼게요 812 00:57:55.399 --> 00:57:59.714 이렇게 하고 컴파일 하신 다음에 실행해서 보면 813 00:57:59.714 --> 00:58:03.979 반대쪽으로 이렇게 누르면 저항값이 커지죠 814 00:58:05.479 --> 00:58:10.439 이런 식으로 공중에서도 컨트롤을 할 수가 있는 내용이 있습니다 815 00:58:10.439 --> 00:58:13.314 그래서 이런 것들을 참고하셔서 진행하시면 되겠습니다 816 00:58:13.314 --> 00:58:17.664 이번 단원에서 학습한 내용을 정리하도록 하겠습니다 817 00:58:17.664 --> 00:58:20.014 C 기반의 프로젝트와 TPS 플레이어 생성 캐릭터 클래스의 이해 818 00:58:20.014 --> 00:58:22.364 FPS : First-Person Shooter (1인칭) TPS : Third-Person Shooter (3인칭) 819 00:58:22.364 --> 00:58:24.714 TPS 캐릭터 외관 적용 기획자, 아트, 프로그래머 820 00:58:24.714 --> 00:58:26.714 3인칭 카메라와 외관 적용 방법 821 00:58:26.714 --> 00:58:28.664 SpringArm의 역할 카메라 시야가 막히는 상황을 자동으로 처리함 822 00:58:28.664 --> 00:58:30.664 카메라와 플레이어 사이에 벽이 있을 경우 스프링 암을 활용하여 카메라의 위치가 벽 너머로 이동함 823 00:58:30.664 --> 00:58:32.614 카메라가 저절로 뒤로 밀릴 경우 Target Arm Length를 줄임 824 00:58:32.614 --> 00:58:34.664 플레이어 이동 및 회전 처리 825 00:58:34.664 --> 00:58:37.564 CharacterMovementComponent의 역할 실제 캐릭터를 조작할 때 움직임을 제어하기 위해 사용되는 컴포넌트 826 00:58:37.564 --> 00:58:40.514 이동 처리 방법: Lookup 회전 함수 AddcontrollerPitchInput, AddcontrollerYawInput