1 00:00:04.240 --> 00:00:08.992 실감 기본편 언리얼 엔진 블루프린트 활용 2 00:00:08.992 --> 00:00:11.517 GCC 사관학교 3 00:00:27.366 --> 00:00:28.515 안녕하세요 4 00:00:28.515 --> 00:00:32.183 블루프린트 강의를 담당하게 된 탁광욱입니다 5 00:00:32.183 --> 00:00:34.483 이번에는 블루프린트를 활용해서 6 00:00:34.483 --> 00:00:37.381 간단한 기능을 제작해 보겠습니다 7 00:00:37.381 --> 00:00:41.153 이번 시간에는 실습 예제를 통해서 기능을 설계하고 8 00:00:41.153 --> 00:00:43.846 설계한 작업이 제대로 작동하는지 검증하고 9 00:00:43.846 --> 00:00:46.396 그리고 그 기능을 최종적으로 완료하는 10 00:00:46.396 --> 00:00:49.006 일련의 방식에 대해서 알아보도록 하겠습니다 11 00:00:49.327 --> 00:00:53.277 Collision의 역할 및 작동 원리 12 00:00:53.500 --> 00:00:58.350 이번에는 앞서 배운 블루프린트 기초 이론을 이용해서 13 00:00:58.350 --> 00:01:02.252 간단하게 기능을 만들어 볼 건데요 14 00:01:02.252 --> 00:01:05.500 어떤 기능이냐 하면 이렇게 하얀색 발판이 있고 15 00:01:05.500 --> 00:01:09.500 이 하얀색 발판에 플레이어가 올라가게 되면 16 00:01:09.500 --> 00:01:12.700 이 하얀색 발판이 버튼이 되어서 17 00:01:12.700 --> 00:01:19.975 이 앞에 있던 문이 열리는 기능을 만들어 보려고 합니다 18 00:01:19.975 --> 00:01:22.500 그러기 위해서 몇 가지 준비 사항이 필요해요 19 00:01:22.500 --> 00:01:26.243 먼저 문을 설치를 해야 될 것 같아요 20 00:01:26.243 --> 00:01:30.500 문은 StarterContent에 있는 애셋을 이용해 볼 거예요 21 00:01:30.500 --> 00:01:32.150 Content Drawer에 보면 22 00:01:32.150 --> 00:01:36.180 StarterContent라고 하는 폴더가 있을 겁니다 23 00:01:36.180 --> 00:01:39.630 이것은 프로젝트를 처음 생성했을 때 24 00:01:39.630 --> 00:01:42.880 포함시켜서 설치를 하겠느냐 안 하겠느냐를 25 00:01:42.880 --> 00:01:44.500 설정을 할 수가 있어요 26 00:01:44.500 --> 00:01:47.500 만약에 없다면 그때 설정하지 않았다면 27 00:01:47.500 --> 00:01:51.807 이 + 버튼을 눌러서 상단에 보시면 이렇게 28 00:01:51.807 --> 00:01:54.457 Add Feature or Content Pack이라고 하는 29 00:01:54.457 --> 00:01:55.718 항목이 있습니다 30 00:01:55.718 --> 00:01:59.368 이 항목을 클릭을 하면 여러 가지 컨텐츠 항목들을 31 00:01:59.368 --> 00:02:00.500 추가를 할 수가 있는데요 32 00:02:00.500 --> 00:02:03.500 그 중에서 Content라고 하는 항목이 있어요 33 00:02:03.500 --> 00:02:06.173 여기에 보면 Starter Content가 있습니다 34 00:02:06.173 --> 00:02:07.923 이 Starter Content를 선택하고 35 00:02:07.923 --> 00:02:10.054 Add to Project를 누르면 36 00:02:10.054 --> 00:02:13.896 좀 전에 봤었던 이 StarterContent 폴더가 생성이 되면서 37 00:02:13.896 --> 00:02:18.777 그 안에 있는 여러 가지 애셋들을 사용할 수가 있게 돼요 38 00:02:18.777 --> 00:02:22.427 그 안에 Props이라고 하는 항목 중에 보시면 39 00:02:22.427 --> 00:02:24.143 여러 가지 애셋들이 있죠 40 00:02:24.143 --> 00:02:28.500 그 중에 보면 SM_Door라고 하는 애셋이 있을 겁니다 41 00:02:28.500 --> 00:02:33.916 애셋을 배치를 시켜 보도록 할게요 42 00:02:33.916 --> 00:02:37.589 우리가 원하는 것은 여기 중간에 어떤 발판을 놓고 43 00:02:37.589 --> 00:02:41.520 이 발판에 플레이어가 이 발판을 누르게 되면 44 00:02:41.520 --> 00:02:45.074 Z축으로 이렇게 회전하는 것을 만들어 볼 거예요 45 00:02:48.480 --> 00:02:52.767 플레이 버튼을 누르게 되면, 이렇게 플레이를 하게 되면 46 00:02:52.767 --> 00:02:56.067 이렇게 캐릭터가 나오지 않죠 47 00:02:56.067 --> 00:02:58.262 이렇게 돌아다닐 수만 있어요 48 00:02:58.262 --> 00:03:00.906 우리가 원하는 것은 캐릭터를 직접 조작을 해서 49 00:03:00.906 --> 00:03:03.955 그 캐릭터가 버튼을 누르는 것을 원하는데 50 00:03:03.955 --> 00:03:06.500 캐릭터가 지금 나오지 않기 때문에 51 00:03:06.500 --> 00:03:10.213 캐릭터가 나오는 시스템을 설치를 해줘야 됩니다 52 00:03:10.213 --> 00:03:13.074 이렇게 나오는 이유는 처음에 생성할 때 53 00:03:13.074 --> 00:03:15.500 3인칭 모드로 만든 것이 아니기 때문에 54 00:03:15.500 --> 00:03:20.431 이런 시스템이 자동적으로 탑재되지 않았을 거예요 55 00:03:20.431 --> 00:03:23.906 그러기 위해서는 일단 취소를 하고 56 00:03:23.906 --> 00:03:28.035 역시 마찬가지 Content Drawer의 상단에 57 00:03:28.035 --> 00:03:29.500 Add 버튼을 클릭을 하고 58 00:03:29.500 --> 00:03:33.500 Add Feature or Content Pack을 클릭을 하면 59 00:03:33.500 --> 00:03:35.767 좀 전에 우리 컨텐츠를 클릭을 했었죠 60 00:03:35.767 --> 00:03:37.500 여기 보시면 블루프린트 항목에 61 00:03:37.500 --> 00:03:39.747 여러 가지 모드들을 설치할 수 있게끔 62 00:03:39.747 --> 00:03:42.500 이렇게 모아져 있어요 63 00:03:42.500 --> 00:03:46.015 굳이 우리가 프로젝트를 생성하기 전에 64 00:03:46.015 --> 00:03:48.025 이걸 선택하지 않았다고 해서 65 00:03:48.025 --> 00:03:51.500 굳이 프로젝트를 다시 생성할 필요는 없다는 거죠 66 00:03:51.500 --> 00:03:55.173 이렇게 추가적으로 넣을 수도 있게 되는 겁니다 67 00:03:55.173 --> 00:03:57.500 우리는 간단하게 Third Person을 클릭한 상태에서 68 00:03:57.500 --> 00:03:59.817 Add to Project를 클릭을 하면 69 00:03:59.817 --> 00:04:03.233 이렇게 설치가 된 걸 볼 수가 있고요 70 00:04:03.233 --> 00:04:07.153 Content Browser가 따로 튀어나와 있네요 71 00:04:07.153 --> 00:04:09.044 다시 닫고 72 00:04:09.044 --> 00:04:11.648 Content Drawer를 클릭하면 이제 73 00:04:11.648 --> 00:04:13.500 여러 가지 폴더들이 생겼을 겁니다 74 00:04:13.500 --> 00:04:16.183 Characters 폴더, LevelPrototyping, 75 00:04:16.183 --> 00:04:19.500 Third Person이라고 하는 폴더가 생성이 됐을 거예요 76 00:04:19.500 --> 00:04:22.500 이렇게 되면 플레이를 한다고 해서 77 00:04:22.500 --> 00:04:24.708 바로 적용이 되는 건 아니고요 78 00:04:24.708 --> 00:04:27.213 일정한 설정을 좀 해줘야 돼요 79 00:04:27.213 --> 00:04:31.500 Edit→Project Settings에서 80 00:04:31.500 --> 00:04:33.876 좌측에 보시면 프로젝트 항목에 81 00:04:33.876 --> 00:04:36.500 Maps&Modes라고 하는 항목이 있습니다 82 00:04:36.500 --> 00:04:39.500 Maps&Modes 항목에 보시면 83 00:04:39.500 --> 00:04:41.500 이 모드를 바꿀 수가 있어요 84 00:04:41.500 --> 00:04:45.500 여기서 우리가 받았던 Third Person 모드로 85 00:04:45.500 --> 00:04:47.243 바꿔주시면 됩니다 86 00:04:47.243 --> 00:04:49.500 GameModeBase를 클릭 87 00:04:49.500 --> 00:04:50.500 상단에 보시면 88 00:04:50.500 --> 00:04:53.896 BP_ThirdPersonGameMode라고 하는 항목이 있죠 89 00:04:53.896 --> 00:04:56.856 이 항목을 선택을 해주시면 90 00:04:56.856 --> 00:04:59.757 아래에 있는 것도 알아서 착착착착 91 00:04:59.757 --> 00:05:02.698 적용이 된 것을 볼 수가 있을 거예요 92 00:05:02.698 --> 00:05:04.728 이렇게 적용이 됐다면 93 00:05:04.728 --> 00:05:06.500 Project Settings 창을 끄고 94 00:05:06.500 --> 00:05:08.500 다시 플레이를 하게 되면 95 00:05:08.500 --> 00:05:12.500 이런 식으로 캐릭터가 나오게 됩니다 96 00:05:12.500 --> 00:05:14.500 캐릭터가 나오는 지점은 97 00:05:14.500 --> 00:05:16.500 이런 식으로 이 깃발 표시 있죠 98 00:05:16.500 --> 00:05:19.500 이게 PlayerStart라고 하는 액터인데 99 00:05:19.500 --> 00:05:21.866 이 액터가 있는 곳에서 100 00:05:21.866 --> 00:05:24.054 캐릭터가 등장하게끔 101 00:05:24.054 --> 00:05:27.876 그렇게 지정을 해주는 역할을 하는 액터예요, 이 액터는 102 00:05:27.876 --> 00:05:29.500 그래서 플레이를 하게 되면 103 00:05:29.500 --> 00:05:31.500 캐릭터는 여기에 나오게 됩니다 104 00:05:31.500 --> 00:05:35.173 만약에 이 PlayerStart 위치를 105 00:05:35.173 --> 00:05:38.243 뒤에다가 이렇게 빼놓으면 106 00:05:38.243 --> 00:05:40.718 플레이를 하면 그 위치에다가 107 00:05:40.718 --> 00:05:45.005 좀 더 뒷부분에 캐릭터가 생성되는 것을 볼 수가 있죠 108 00:05:45.005 --> 00:05:48.205 그러면 문에서 조금 한 발짝 멀어진 상태에서 109 00:05:48.205 --> 00:05:51.440 캐릭터가 등장한 걸 볼 수가 있죠 110 00:05:51.440 --> 00:05:53.440 좀 더 뒤에다 놔도 괜찮을 것 같네요 111 00:05:53.440 --> 00:05:55.120 좀 더 뒤에다 놓을게요 112 00:05:55.120 --> 00:06:00.120 이렇게 뒤에다 놓고 플레이를 해보면 좀 더 먼 곳에서 113 00:06:00.120 --> 00:06:03.080 이렇게 시작하는 것을 볼 수가 있습니다 114 00:06:03.080 --> 00:06:04.880 이제 준비는 다 됐네요 115 00:06:04.880 --> 00:06:07.799 문도 준비가 됐고 플레이어도 준비가 됐으니까 116 00:06:07.799 --> 00:06:11.959 문을 열 수 있는 버튼 블루프린트를 만들어 보도록 할게요 117 00:06:11.959 --> 00:06:14.091 Content Drawer를 다시 열어서 118 00:06:14.091 --> 00:06:17.720 이 BP 폴더 안에다가 만들어 보도록 할게요 119 00:06:17.720 --> 00:06:22.639 우클릭, Blueprint Class를 클릭 120 00:06:22.639 --> 00:06:26.599 역시 이번에도 마찬가지, 액터 클래스를 상속받아서 121 00:06:26.599 --> 00:06:29.400 이 레벨에다가 배치할 수 있게끔 해볼게요 122 00:06:29.400 --> 00:06:32.200 그래서 액터를 클릭 123 00:06:32.200 --> 00:06:36.840 이름은 BP_Door로 할게요 124 00:06:36.840 --> 00:06:40.799 더블 클릭해서 블루프린트 안으로 들어가 보도록 하겠습니다 125 00:06:40.799 --> 00:06:45.880 역시 마찬가지 이 패널은 레벨 옆에다가 이렇게 붙고 126 00:06:45.880 --> 00:06:49.400 Basic은 필요 없으니까 닫도록 하겠습니다 127 00:06:49.400 --> 00:06:52.760 먼저 외형부터 좀 간단하게 만들어 보도록 할게요 128 00:06:52.760 --> 00:06:56.510 먼저 바닥이라는 여기가 버튼이라고 하는 129 00:06:56.510 --> 00:06:57.720 표현을 하기 위해서 130 00:06:57.720 --> 00:07:01.839 간단한 박스를 이용해서 버튼을 만들어 보도록 할게요 131 00:07:01.839 --> 00:07:04.160 실제 버튼을 누르는 버튼은 아니고 132 00:07:04.160 --> 00:07:07.060 여기가 발판이야라고 하는 133 00:07:07.060 --> 00:07:10.720 시각적인 표시라고 생각하시면 좋을 것 같아요 134 00:07:10.720 --> 00:07:13.639 그래서 Components에서 + 버튼을 눌러 135 00:07:13.639 --> 00:07:16.439 Cube라고 검색을 해보면 이렇게 136 00:07:16.439 --> 00:07:19.440 큐브 셰이프를 꺼낼 수가 있게 됩니다 137 00:07:19.440 --> 00:07:21.879 클릭해서 큐브를 꺼내 볼게요 138 00:07:21.879 --> 00:07:28.760 이것은 큐브 모양의 외형을 갖도록 하는 컴포넌트에요 139 00:07:28.760 --> 00:07:32.320 단순히 외형의 모습만을 담당하죠 140 00:07:32.320 --> 00:07:35.070 그리고 여기에는 Static Mesh가 141 00:07:35.070 --> 00:07:38.146 Cube라고 하는 Static Mesh가 들어가 있어서 142 00:07:38.146 --> 00:07:42.199 이렇게 사각형의 모습을 하고 있는 거예요 143 00:07:42.199 --> 00:07:46.800 이 사각형의 모습을 조금 변형시켜서 납작하게 만들어 볼게요 144 00:07:46.800 --> 00:07:52.960 Z축으로 0.1 정도로 이렇게 납작하게 만들어 주면 145 00:07:52.960 --> 00:07:58.523 좀 더 납작해도 되겠네요 0.05 정도로 146 00:07:58.523 --> 00:08:01.600 납작하게 이렇게 만들어 주도록 하겠습니다 147 00:08:01.600 --> 00:08:06.300 이렇게 되면 캐릭터가 위에 딱 밟을 수 있게끔 148 00:08:06.300 --> 00:08:08.839 간단한 표시가 됐겠죠 149 00:08:08.839 --> 00:08:12.539 다음, 큐브라고 하는 발판은 150 00:08:12.539 --> 00:08:15.399 직접적으로 눌려지는 것이 아니에요 151 00:08:15.399 --> 00:08:18.399 직접 누르는 것이 아니라 152 00:08:18.399 --> 00:08:21.899 그냥 여기는 누를 수 있는 위치야라고 153 00:08:21.899 --> 00:08:24.600 표시만 되는 거라고 이야기를 했었죠 154 00:08:24.600 --> 00:08:28.360 우리가 캐릭터를 이동해서 이 발판 위에 올라서서 155 00:08:28.360 --> 00:08:31.110 이 발판을 누른다는 개념은 156 00:08:31.110 --> 00:08:34.960 사실상 여기에 어떤 감지를 할 수 있는 157 00:08:34.960 --> 00:08:38.360 캐릭터를 감지할 수 있는 어떤 영역이 있어서 158 00:08:38.360 --> 00:08:42.320 캐릭터가 그 공간 안으로 들어와서 충돌되었을 때 159 00:08:42.320 --> 00:08:46.020 오버랩 되었을 때 눌렀다 혹은 160 00:08:46.020 --> 00:08:50.160 누른 이벤트가 발생했다고 볼 수 있는 거죠 161 00:08:50.160 --> 00:08:54.080 그래서 중요한 것은 캐릭터가 충돌할 수 있는 162 00:08:54.080 --> 00:08:57.679 캐릭터가 들어갈 수 있는 영역이 필요합니다 163 00:08:57.679 --> 00:09:00.160 그래서 캐릭터와 충돌할 수 있는 그 영역 164 00:09:00.160 --> 00:09:02.760 실질적으로 캐릭터와 충돌하게 할 수 있는 165 00:09:02.760 --> 00:09:05.320 이 영역을 무엇이라고 하냐면 166 00:09:05.320 --> 00:09:07.880 Collision이라고 이야기를 합니다 167 00:09:07.880 --> 00:09:10.160 그래서 Collision을 설치를 해줘야 돼요 168 00:09:10.160 --> 00:09:13.679 역시 마찬가지 Components에 + 버튼을 눌러서 169 00:09:13.679 --> 00:09:19.520 Collision이라고 검색을 하면 170 00:09:19.520 --> 00:09:23.119 여러가지 형태의 Collision들을 꺼낼 수가 있게 돼요 171 00:09:23.119 --> 00:09:28.399 그 중에서 Box Collision을 선택을 해 볼게요 172 00:09:28.399 --> 00:09:33.679 이름은 그냥 Box로 지어주도록 하겠습니다 173 00:09:33.679 --> 00:09:37.199 이렇게 Box Collision 컴포넌트를 만들게 되면 174 00:09:37.199 --> 00:09:41.399 이렇게 노란색의 와이어프레임만 있는 175 00:09:41.399 --> 00:09:43.960 도형이 생성된 걸 볼 수가 있습니다 176 00:09:43.960 --> 00:09:47.240 이게 영역을 의미하는 거예요 177 00:09:47.240 --> 00:09:53.080 충돌 영역을 표시한 겁니다 178 00:09:53.080 --> 00:09:55.520 이 영역을 위로 올리거나 179 00:09:55.520 --> 00:09:59.448 혹은 사이즈를 이용해서, Scale을 이용하든지 180 00:09:59.448 --> 00:10:04.320 아니면 그 밑에 있는 Box Extent라고 하는 항목이 있죠 181 00:10:04.320 --> 00:10:09.760 이 Box Extent를 이용해서 수치대로 조정을 할 수 있어요 182 00:10:09.760 --> 00:10:12.040 사이즈에 맞춰서 조금 조정을 해 보도록 하겠습니다 183 00:10:12.040 --> 00:10:16.685 이것을 50 정도로 184 00:10:16.685 --> 00:10:20.040 50, 50으로 맞춰 놓도록 하겠습니다 185 00:10:20.040 --> 00:10:26.320 그럼 밑에 있는 하얀색 박스 모양과 거의 일치가 될 거예요 186 00:10:26.320 --> 00:10:32.799 그리고 벗어나지 않게끔 위에다가 설치를 해 보도록 하죠 187 00:10:32.799 --> 00:10:35.519 이렇게 영역을 표시를 하게 되면 188 00:10:35.519 --> 00:10:40.079 캐릭터가 이 하얀색 발판을 보고 밟으러 오게 되면 189 00:10:40.079 --> 00:10:46.119 캐릭터가 이 Collision Box와 중첩이 되면서 190 00:10:46.119 --> 00:10:50.399 캐릭터가 이 영역 안으로 들어왔다고 인지를 하게 되면 191 00:10:50.399 --> 00:10:57.239 이제 그 인지됨을 통해서 문을 열리게끔 실행하게 되는 거죠 192 00:10:57.239 --> 00:11:02.519 그러면 유저들은 발판을 눌렀구나라고 생각하게 되는 겁니다 193 00:11:02.519 --> 00:11:06.720 그래서 이 영역은 캐릭터가 이 공간에 들어왔다 194 00:11:06.720 --> 00:11:08.870 라는 것을 인지하는 공간 195 00:11:08.870 --> 00:11:11.559 감지 공간이라고 생각하시면 좋아요 196 00:11:11.559 --> 00:11:13.160 그게 바로 Collision입니다 197 00:11:13.160 --> 00:11:19.160 일단 외형만 이렇게 놓고 컴파일을 하고 저장을 한 다음에 198 00:11:19.160 --> 00:11:21.359 여기다가 설치를 한번 해 볼게요 199 00:11:21.359 --> 00:11:24.459 Content Drawer에서 블루프린트를 200 00:11:24.459 --> 00:11:28.440 드래그&드롭해서 이렇게 얹어 볼게요 201 00:11:28.440 --> 00:11:32.000 이렇게 얹어 놓으면 하얀색 발판과 함께 202 00:11:32.000 --> 00:11:35.850 그리고 노란색 Collision 영역까지 203 00:11:35.850 --> 00:11:37.440 표현되는 걸 볼 수가 있죠 204 00:11:37.440 --> 00:11:39.582 그러면 캐릭터가 여기에 이렇게 205 00:11:39.582 --> 00:11:42.480 발판을 밟으러 왔을 때 잘 감지가 되는지 206 00:11:42.480 --> 00:11:46.000 우리가 Hello World를 출력했었던 것처럼 207 00:11:46.000 --> 00:11:49.200 감지되었습니다를 출력을 해서 감지가 되는지 안 되는지 208 00:11:49.200 --> 00:11:53.320 작동이 잘 되는지 안 되는지 확인해 보도록 하겠습니다 209 00:11:53.320 --> 00:11:55.920 다시 BP_Door로 들어와서 210 00:11:55.920 --> 00:11:59.440 이번에는 출력 기능을 만들어야 되니까 211 00:11:59.440 --> 00:12:02.000 상단에 Event Graph 항목으로 가야 되겠죠 212 00:12:02.000 --> 00:12:03.348 Event Graph를 클릭 213 00:12:06.519 --> 00:12:08.969 일단은 Print String 214 00:12:08.969 --> 00:12:12.359 Print String을 215 00:12:12.359 --> 00:12:14.799 Print String 노드를 선택을 하고요 216 00:12:14.799 --> 00:12:17.199 이 Print String 노드에서 217 00:12:17.199 --> 00:12:21.440 감지되었습니다를 출력하도록 218 00:12:21.440 --> 00:12:23.640 이렇게 설정을 해 볼게요 219 00:12:23.640 --> 00:12:26.640 이 노드는 어디에 연결을 해야 될까요 220 00:12:26.640 --> 00:12:29.279 어떤 이벤트 노드에 연결을 해야 될까요 221 00:12:29.279 --> 00:12:37.040 시작할 때? 살아있을 때? 혹은 액터와 겹쳐질 때? 222 00:12:37.040 --> 00:12:41.559 당연히 액터와 겹쳐질 때겠죠 223 00:12:41.559 --> 00:12:45.320 우리가 만들었던 이 Collision이라고 하는 것이 224 00:12:45.320 --> 00:12:50.760 바로 이 ActorBeginOverlap과 연관이 되어 있어요 225 00:12:50.760 --> 00:12:54.878 즉 BeginOverlap, 이 블루프린트가 226 00:12:54.880 --> 00:12:58.030 외부의 어떤 액터와 Overlap 227 00:12:58.030 --> 00:13:01.480 중첩이 됐을 때, 겹쳐졌을 때 228 00:13:01.480 --> 00:13:06.239 어떠한 이벤트를 발생하라고 하는 노드예요 229 00:13:06.239 --> 00:13:09.559 그때 중첩이 되는 것을 어떻게 알아차리느냐 230 00:13:09.559 --> 00:13:14.640 그것이 바로 이 박스, Collision의 역할인 거죠 231 00:13:14.640 --> 00:13:16.990 Collision과 캐릭터가 중첩이 됐을 때 232 00:13:16.990 --> 00:13:19.411 겹쳐졌을 때가 바로 233 00:13:19.411 --> 00:13:22.561 ActorBeginOverlap이 발생됐을 때 234 00:13:22.561 --> 00:13:25.839 실행됐을 때를 의미하는 겁니다 235 00:13:25.839 --> 00:13:29.739 그래서 이 ActorBeginOverlap의 실행 핀을 236 00:13:29.739 --> 00:13:33.040 Print String에다가 이렇게 연결을 해주면 237 00:13:33.040 --> 00:13:36.959 액터가 Collision에 부딪혔을 때 238 00:13:36.959 --> 00:13:41.239 Print String 노드를 실행하게 될 거예요 239 00:13:41.239 --> 00:13:42.079 한번 봅시다 240 00:13:42.079 --> 00:13:47.760 Compile, 저장, 돌아와서 플레이를 해 볼게요 241 00:13:47.760 --> 00:13:50.839 지금 보면 이렇게 캐릭터가 있죠 242 00:13:50.839 --> 00:13:53.239 이 발판으로 가보겠습니다 243 00:13:53.239 --> 00:13:55.540 이렇게 가면 좌측 상단에 244 00:13:55.540 --> 00:13:58.679 감지되었습니다라는 문구가 뜬 걸 보셨나요? 245 00:13:58.679 --> 00:14:02.440 조금 더 길게 할게요 246 00:14:02.440 --> 00:14:09.359 10초로 하고 Compile, 저장, 다시 플레이를 해보면 247 00:14:09.359 --> 00:14:11.079 캐릭터를 움직여서 발판으로 가볼게요 248 00:14:11.079 --> 00:14:14.339 가면 좌측 상단에 감지되었습니다 249 00:14:14.339 --> 00:14:19.559 라고 하는 문구가 나타난 걸 볼 수가 있죠 250 00:14:19.559 --> 00:14:23.459 그렇다는 것은 잘 작동을 한다는 것을 251 00:14:23.459 --> 00:14:24.760 알 수가 있게 되는 거죠 252 00:14:24.760 --> 00:14:29.719 그러면 우리는 이제 이 ActorBeginOverlap에서 253 00:14:29.719 --> 00:14:33.000 어떠한 기능들을 추가하면 될 거예요 254 00:14:33.000 --> 00:14:35.840 잠시 Print String을 지우고요 255 00:14:35.840 --> 00:14:39.679 이 노드를 통해서 우리는 무엇을 하냐 256 00:14:39.679 --> 00:14:44.119 이 레벨에 있는 이 문을 회전시켜서 열 거예요 257 00:14:44.119 --> 00:14:46.400 노드를 하나 추가를 하도록 하겠습니다 258 00:14:46.400 --> 00:14:58.000 우클릭을 해서 Add Actor World Rotation 259 00:14:58.000 --> 00:15:01.440 이라고 하는 노드를 꺼내 보도록 하겠습니다 260 00:15:01.440 --> 00:15:06.280 이 노드는 액터를 회전시켜주는 노드예요 261 00:15:06.280 --> 00:15:11.162 그래서 보시면 필요한 데이터 핀들이 262 00:15:11.162 --> 00:15:12.840 왼쪽에 두 가지가 있죠 263 00:15:12.840 --> 00:15:14.960 하나는 타깃이 누구냐 264 00:15:14.960 --> 00:15:18.599 지금 self라고 하면 BP_Door 본인이에요 265 00:15:18.599 --> 00:15:23.200 즉 무슨 얘기냐면 이것 자체가 돌아가겠다 266 00:15:23.200 --> 00:15:25.440 이 발판 자체가 돌아가겠다는 건데 267 00:15:25.440 --> 00:15:27.599 우리는 이걸 원하진 않아요 268 00:15:27.599 --> 00:15:32.159 그래서 우리가 원하는 것은 이 문이니까 269 00:15:32.159 --> 00:15:33.320 다른 액터죠 270 00:15:33.320 --> 00:15:36.320 그래서 이 다른 액터를 변수에 담아서 271 00:15:36.320 --> 00:15:39.200 그 액터를 여기다가 연결해서 272 00:15:39.200 --> 00:15:41.760 외부에 있는 액터를 회전시킬 수 있게끔 273 00:15:41.760 --> 00:15:42.719 그렇게 만들어줄 거예요 274 00:15:42.719 --> 00:15:46.320 그래서 변수를 일단 만들어줄 거예요 275 00:15:46.320 --> 00:15:48.799 VARIABLES에서 + 버튼을 눌러서 276 00:15:48.799 --> 00:15:52.440 이름은 Door라고 할게요 277 00:15:52.440 --> 00:15:59.640 외부에 있는 액터를 변수로 담아둬야 되기 때문에 278 00:15:59.640 --> 00:16:04.880 액터를 담는 그릇, 즉 자료형이 Actor여야 할 거예요 279 00:16:04.880 --> 00:16:09.479 분류는 큰 선택을 해서 여기서 Actor라고 검색을 해 볼게요 280 00:16:12.960 --> 00:16:18.039 그러면 Actor의 오브젝트 타입 중에 281 00:16:18.039 --> 00:16:22.320 Actor에 Object Reference라고 하는 항목이 있습니다 282 00:16:22.320 --> 00:16:24.119 이 항목을 클릭을 해주면 283 00:16:24.119 --> 00:16:30.880 액터 클래스를 담을 수 있는 변수로 만들어지게 된 거예요 284 00:16:30.880 --> 00:16:33.919 액터 자료형은 우리가 자료형을 배울 때 285 00:16:33.919 --> 00:16:38.069 기본 자료형과 사용자 정의 자료형 286 00:16:38.069 --> 00:16:39.799 두 가지가 있다고 했었죠 287 00:16:39.799 --> 00:16:41.799 이 액터 자료형은 두 번째 288 00:16:41.799 --> 00:16:45.359 사용자 정의 자료형에 속해요 289 00:16:45.359 --> 00:16:49.640 특히 이 액터는 언리얼에서 만들어진 사용자 자료형이죠 290 00:16:49.640 --> 00:16:52.520 그래서 액터라고 하는 클래스를 담을 수 있도록 291 00:16:52.520 --> 00:16:57.440 미리 만들어둔 클래스 자료형이라고 보시면 돼요 292 00:16:57.440 --> 00:17:03.159 이 변수에다가 우리는 외부에서 문을 집어 넣어야 하니까 293 00:17:03.159 --> 00:17:08.479 눈을 켜서, 혹은 Instance Editable 항목을 체크를 해서 294 00:17:08.479 --> 00:17:12.440 외부로 뺄 수 있도록 설정을 해 보도록 하겠습니다 295 00:17:12.440 --> 00:17:15.960 그리고 이 Door 변수는 이제 여기다가 연결을 해야겠죠 296 00:17:15.960 --> 00:17:19.919 드래그&드롭해서 Get Door를 클릭을 해서 297 00:17:19.919 --> 00:17:21.039 변수를 가져와야겠죠 298 00:17:21.039 --> 00:17:23.289 이 변수를 가지고 와서 이 변수를 299 00:17:23.289 --> 00:17:25.633 Target에다가 이렇게 이어줘요 300 00:17:30.804 --> 00:17:33.320 컴파일을 하고 저장하고 잠시 볼까요 301 00:17:33.320 --> 00:17:39.039 그러면 이 블루프린트를 선택을 해서 Details 창을 보시면 302 00:17:39.039 --> 00:17:43.440 이렇게 중간에 Door라고 하는 변수가 지금 보이게 되죠 303 00:17:43.440 --> 00:17:46.840 그리고 이 Door는 지금 아무것도 담겨 있지 않은데 304 00:17:46.840 --> 00:17:51.880 이 슬롯에다가 이 Door를 지정만 해주면 돼요 305 00:17:51.880 --> 00:17:55.840 지정하는 방법은 이 None 표시를 클릭을 해서 306 00:17:55.840 --> 00:18:01.320 직접 SM_Door를 선택할 수도 있고요 307 00:18:01.320 --> 00:18:07.080 혹은 우측에 스포이드 버튼을 클릭해서 308 00:18:07.080 --> 00:18:10.286 직접 이 오브젝트를 선택해서 가져오는 방법도 있습니다 309 00:18:14.840 --> 00:18:16.119 이렇게요 310 00:18:16.119 --> 00:18:17.640 그러면 들어간 걸 볼 수가 있죠 311 00:18:17.640 --> 00:18:20.119 그럼 이렇게 선택이 된 거예요 312 00:18:20.119 --> 00:18:22.280 그럼 이제 다시 돌아오면 313 00:18:22.280 --> 00:18:25.330 이제 이 변수에는 Door 액터가 314 00:18:25.330 --> 00:18:27.840 담겨있는 걸 알 수가 있겠죠 315 00:18:27.840 --> 00:18:31.200 그 Door가 회전할 거야 316 00:18:31.200 --> 00:18:35.880 회전할 거야라고 우리는 기능을 넣어주는 거예요 317 00:18:35.880 --> 00:18:40.440 그럼 보시면 이제 밑에 여기 항목이 있어요 318 00:18:40.440 --> 00:18:43.140 얼마만큼 돌려줄 거야를 319 00:18:43.140 --> 00:18:46.119 이 밑에 있는 항목에서 제어를 하게 됩니다 320 00:18:46.119 --> 00:18:48.880 보시면 Delta Rotation이 되어 있고 321 00:18:48.880 --> 00:18:51.280 그 다음에 X, Y, Z 라고 되어 있습니다 322 00:18:51.280 --> 00:18:58.000 즉 Delta라고 하는 건 가변 값이라고 생각하시면 돼요 323 00:18:58.000 --> 00:19:02.479 Delta Rotation은 얼마만큼 회전시킬 거니 324 00:19:02.479 --> 00:19:04.840 얼마만큼 회전시킬 거니?라고 하는 거예요 325 00:19:04.840 --> 00:19:07.340 X축으로는 얼마만큼, Y축으로는 얼마만큼, 326 00:19:07.340 --> 00:19:09.960 Z축으로는 얼마만큼 회전시킬 거니 327 00:19:09.960 --> 00:19:14.599 얼마만큼 회전시킬까를 설정해준다고 보시면 돼요 328 00:19:14.599 --> 00:19:17.479 이 항목은 어떤 개념이냐면 329 00:19:17.479 --> 00:19:19.212 Door 액터를 선택한 상태에서 330 00:19:19.212 --> 00:19:22.320 이 Rotation을 보시면 X, Y, Z가 있죠 331 00:19:22.320 --> 00:19:28.719 이 X, Y, Z의 각도를 지정해 준다고 보시면 돼요 332 00:19:28.719 --> 00:19:30.880 우리가 원하는 것은 보시면 알겠지만 333 00:19:30.880 --> 00:19:33.760 이렇게 화살표가 이렇게 X, Y, Z로 되어 있어요 334 00:19:33.760 --> 00:19:35.880 기즈모가 월드 기준으로 되어있죠 335 00:19:35.880 --> 00:19:38.329 월드 기준으로 회전을 할 예정이니까 336 00:19:38.329 --> 00:19:43.357 우리는 월드를 기준으로 놓고 337 00:19:43.357 --> 00:19:47.872 보시면 파란색 화살표 Z축을 기준으로 해서 338 00:19:47.872 --> 00:19:50.744 이렇게 움직인다는 것을 볼 수가 있을 거예요 339 00:19:50.744 --> 00:19:55.944 그래서 이렇게 90도만큼 이렇게 더해주면 되겠죠 340 00:19:55.944 --> 00:19:58.835 다시 돌려 놓고 341 00:19:58.835 --> 00:20:04.435 여기다가 Z축에만 90도를 입력하면 되겠죠 342 00:20:04.435 --> 00:20:06.905 그러기 위해서는 지금 다 합쳐져 있으니까 343 00:20:06.905 --> 00:20:10.655 이 합쳐져 있는 Input Pin을 344 00:20:10.655 --> 00:20:13.405 입력 핀을 풀어주면 좋겠어요 345 00:20:13.405 --> 00:20:15.880 그래서 입력 핀을 우클릭을 할게요 346 00:20:15.880 --> 00:20:20.480 그러면 Split Struct Pin이라고 하는 항목이 있습니다 347 00:20:20.480 --> 00:20:22.680 이 항목을 선택을 해줄게요 348 00:20:22.680 --> 00:20:27.730 그러면 이렇게 X, Y, Z로 분리가 되는 걸 볼 수가 있어요 349 00:20:27.730 --> 00:20:31.928 X, Y 는 영영 그대로고 우리가 원하는 것은 Z축이죠 350 00:20:31.928 --> 00:20:36.880 Z축으로 90도만큼, 이런 식으로 입력을 해주면 돼요 351 00:20:36.880 --> 00:20:39.980 그런 다음에 우리는 ActorBeginOverlap에다가 352 00:20:39.980 --> 00:20:42.218 이렇게 연결을 해주면 되겠죠 353 00:20:45.639 --> 00:20:47.889 그러면 오버랩이 되는 순간 354 00:20:47.889 --> 00:20:53.480 Door 액터에 Z축으로 90도를 더해서 355 00:20:53.480 --> 00:20:57.380 회전시키겠다는 기능이 되는 거예요 356 00:20:57.380 --> 00:20:58.578 한번 해볼게요 357 00:20:58.578 --> 00:21:00.578 컴파일과 저장을 누르고요 358 00:21:00.578 --> 00:21:03.799 다시 돌아와서 플레이 버튼을 누르려고 하는데 359 00:21:03.799 --> 00:21:05.499 아 여기서 잠깐만 360 00:21:05.499 --> 00:21:10.040 지금 현재 이 문은 아마 움직이지 않을 거예요 361 00:21:10.040 --> 00:21:12.140 플레이하면 움직이지 않을 거예요 362 00:21:12.140 --> 00:21:17.000 그 이유는 뭐냐면 이 메시의 속성이 움직이지 마 363 00:21:17.000 --> 00:21:21.400 즉 멈춰 있어, 움직이지 않은 존재야라고 정해져 있어요 364 00:21:21.400 --> 00:21:24.767 Details 창을 보시면, Details 창에 365 00:21:24.767 --> 00:21:28.080 이 문을 선택한 상태에서 Details 창을 보시면 366 00:21:28.080 --> 00:21:32.320 Transform 하단에 Mobility라고 하는 항목이 있습니다 367 00:21:32.320 --> 00:21:34.178 이 Mobility 항목이 바로 그 항목이거든요 368 00:21:34.178 --> 00:21:36.639 거기가 지금 Static이라고 체크가 되어 있을 겁니다 369 00:21:36.639 --> 00:21:38.821 Static이 된다는 게 뭐냐면 이 액터는 370 00:21:38.821 --> 00:21:43.478 절대 움직이지 않는 존재라고 박아버린 거예요 371 00:21:43.478 --> 00:21:46.778 이 Static을 Movable로 바꿔주셔야 됩니다 372 00:21:46.778 --> 00:21:48.400 그래야 움직일 수 있어요 373 00:21:48.400 --> 00:21:51.450 이렇게 한 상태에서 플레이 버튼을 눌러보면 374 00:21:51.450 --> 00:21:54.639 캐릭터가 있고 발판으로 가볼게요 375 00:21:54.639 --> 00:21:58.639 이렇게 발판을 밟게 되면 이런 식으로 탁 하고 376 00:21:58.639 --> 00:22:00.959 열리게 되는 걸 볼 수가 있을 겁니다 377 00:22:00.959 --> 00:22:04.709 그런데 보시면 아시겠지만 378 00:22:04.709 --> 00:22:07.599 플레이를 했을 때 발판을 눌렀는데 379 00:22:07.599 --> 00:22:11.440 탁 하고 열리는 게 영 맘에 들진 않아요 380 00:22:11.440 --> 00:22:15.290 점점 부드럽게 이렇게 슥 열리면 좋겠는데 381 00:22:15.290 --> 00:22:18.119 탁 하고 열리니까 자연스럽진 못하죠 382 00:22:18.119 --> 00:22:20.969 그래서 우리가 만들었던 이 노드를 383 00:22:20.969 --> 00:22:26.357 좀 더 부드럽게 문을 열 수 있게끔 만들어볼 거예요 384 00:22:28.679 --> 00:22:30.579 그러면 어떻게 하는 게 좋을까요 385 00:22:30.579 --> 00:22:33.879 매 프레임마다 조금씩 조금씩 조금씩 더해서 386 00:22:33.879 --> 00:22:35.800 회전시키는 게 좋겠죠 387 00:22:35.800 --> 00:22:43.479 OK, 그러면 이 노드를 틱에다가 연결을 한번 해볼게요 388 00:22:43.479 --> 00:22:44.729 아마 90도로 389 00:22:44.729 --> 00:22:47.520 매 프레임마다 지금 90도로 돌아가게 되니까 390 00:22:47.520 --> 00:22:49.170 이걸 풀고요 391 00:22:49.170 --> 00:22:51.620 매 프레임마다 90도로 돌아가니까 392 00:22:51.620 --> 00:22:53.240 굉장히 많이 돌아갈 것 같아요 393 00:22:53.240 --> 00:22:56.040 천천히, 매 프레임이니까 394 00:22:56.040 --> 00:23:00.960 1도씩만 움직일 수 있게끔 이렇게 해볼게요 395 00:23:00.960 --> 00:23:04.759 그럼 어떻게 되느냐, 컴파일하고 저장을 해볼게요 396 00:23:04.759 --> 00:23:07.109 플레이를 해보면 397 00:23:07.109 --> 00:23:10.299 플레이를 해보면 이렇게 398 00:23:10.299 --> 00:23:13.299 잘 돌아가는 것처럼 보이긴 해요 399 00:23:13.299 --> 00:23:15.839 잘 돌아가는 것처럼 보이는데 400 00:23:15.839 --> 00:23:17.589 여긴 문제가 있어요 401 00:23:17.589 --> 00:23:20.389 우리가 발판을 밟지도 않았는데 402 00:23:20.389 --> 00:23:23.119 문이 회전을 하고 있는 걸 볼 수가 있죠 403 00:23:23.119 --> 00:23:27.169 우리가 원하는 것은 발판을 밟을 때죠 404 00:23:27.169 --> 00:23:31.520 밟을 때 움직여야 되는데 밟지도 않는데 움직이고 있어요 405 00:23:31.520 --> 00:23:35.279 그래서 우리는 기능을 조금 더 추가를 해줘야 됩니다 406 00:23:35.279 --> 00:23:39.529 이 캐릭터가 이 발판을 밟았다 혹은 밟지 않았다를 407 00:23:39.529 --> 00:23:44.434 설정할 수 있는 기능을 넣어줘야 돼요 408 00:23:44.434 --> 00:23:47.838 이렇게 한번 해보도록 할게요 409 00:23:47.839 --> 00:23:52.686 블루프린트로 돌아와서 우리가 버튼을 밟았는지 410 00:23:52.686 --> 00:23:55.217 캐릭터가 버튼을 밟았는지 안 밟았는지를 411 00:23:55.217 --> 00:23:58.673 어떻게 하면 좋을까요 412 00:23:58.673 --> 00:24:01.923 저는 Boolean 변수를 하나 만들 거예요 413 00:24:01.923 --> 00:24:07.440 참과 거짓을 담을 수 있는 그릇을 하나 만들고 414 00:24:07.440 --> 00:24:11.339 ActorBeginOverlap, 즉 충돌이 됐을 때, 밟았을 때 415 00:24:11.339 --> 00:24:16.839 그 변수를 열린 상태라고 참으로 바꿔주면 416 00:24:16.839 --> 00:24:19.919 열린 상태라고 알려줄 수 있게 되겠죠 417 00:24:19.919 --> 00:24:24.064 그 알려준 변수의 결과에 따라서 418 00:24:24.064 --> 00:24:27.364 이 Rotation 노드가 작동되도록 419 00:24:27.364 --> 00:24:29.600 그렇게 한번 해볼 거예요 420 00:24:29.600 --> 00:24:32.050 그래서 일단 변수를 하나 만들어야겠죠 421 00:24:32.050 --> 00:24:34.900 그래서 VARIABLES에 + 버튼을 눌러서 422 00:24:34.900 --> 00:24:40.000 이름은 isOpen이라고 할게요 423 00:24:40.000 --> 00:24:43.538 열렸니? 라는 정보를 담는 거죠 424 00:24:43.538 --> 00:24:48.753 그래서 자료형은 Boolean으로 해줄게요 425 00:24:48.753 --> 00:24:51.901 이 변수는 외부에 공개할 필요는 없죠 426 00:24:51.901 --> 00:24:54.401 이 안에서만 정보를 갖고 있으면 되니까 427 00:24:54.401 --> 00:24:56.839 굳이 오픈할 필요는 없을 것 같고요 428 00:24:56.839 --> 00:24:59.139 컴파일, 저장을 통해서 429 00:24:59.139 --> 00:25:02.842 기본적인 이 Value 값을 비활성화 시켜줄게요 430 00:25:02.842 --> 00:25:07.192 즉 오픈되어 있지 않다, 열려 있지 않다는 것을 431 00:25:07.192 --> 00:25:10.760 비활성화 된 것으로 알려주는 거예요 432 00:25:10.760 --> 00:25:13.810 이제 ActorBeginOverlap이 실행이 되면 433 00:25:13.810 --> 00:25:17.559 즉 부딪혀서 이벤트가 발생을 했다면 434 00:25:17.559 --> 00:25:24.519 이 isOpen 변수를 체크하도록 이렇게 세팅을 해줘야 돼요 435 00:25:24.519 --> 00:25:29.984 이렇게 어떻게 하냐면 isOpen을 변수를 가지고 올 때 436 00:25:29.984 --> 00:25:33.239 우리는 여태까지 Get isOpen 가져오기만 했었죠 437 00:25:33.239 --> 00:25:39.004 이번에는 Set isOpen을 선택을 할 거예요 이렇게 438 00:25:39.004 --> 00:25:41.854 그래서 ActorBeginOverlap의 실행 핀을 439 00:25:41.854 --> 00:25:47.239 Set 실행 핀에다가 연결을 해줍니다 440 00:25:47.239 --> 00:25:53.320 그리고 이 Set 노드의 Is Open을 체크를 해줄게요 441 00:25:53.320 --> 00:25:57.870 이렇게 되면 ActorBeginOverlap 이벤트가 발생했을 때 442 00:25:57.870 --> 00:26:03.318 즉 캐릭터가 Collision과 부딪혔을 때 실행을 해라 443 00:26:03.318 --> 00:26:09.668 어떤 실행을? Set isOpen 변수를 설정을 해 444 00:26:09.668 --> 00:26:16.040 어떻게? 체크하도록 설정을 하라고 기능을 추가한 거예요 445 00:26:16.040 --> 00:26:22.850 작동이 잘 되는지 한번 Print 노드를 이용해서 446 00:26:22.850 --> 00:26:25.200 Print 노드를 이용해서 확인을 한번 해볼게요 447 00:26:25.200 --> 00:26:27.679 잠시 이 친구들은 이렇게 내리고 448 00:26:27.679 --> 00:26:31.975 여기에는 열렸습니다라고 449 00:26:36.399 --> 00:26:42.640 문구를 집어 넣으면, 만약에 잘 작동이 된다면 450 00:26:42.640 --> 00:26:46.290 Is Open이 체크가 되고 451 00:26:46.290 --> 00:26:50.890 열렸습니다라는 문구까지 출력이 되겠죠 452 00:26:50.890 --> 00:26:51.920 한번 확인해 볼게요 453 00:26:51.920 --> 00:26:57.000 컴파일, 저장, 플레이를 해보고 454 00:26:57.000 --> 00:26:58.550 발판으로 가보도록 할게요 455 00:26:58.550 --> 00:27:05.237 발판에 이렇게 가서 올라가면 열렸습니다가 나오게 되죠 456 00:27:05.237 --> 00:27:10.959 그러면 잘 작동이 된 걸 볼 수가 있습니다, 됐죠? 457 00:27:10.959 --> 00:27:14.009 그러면 이제부터 해야 될 일은 뭐냐면 458 00:27:14.009 --> 00:27:19.311 이 Tick 이라고 하는 이 이벤트에서 459 00:27:19.311 --> 00:27:23.361 Add Actor World Rotation 문을 회전시키는 460 00:27:23.361 --> 00:27:28.000 이 기능을 계속하는 것이 아니라 461 00:27:28.000 --> 00:27:33.850 이 isOpen 변수의 상황에 따라서 462 00:27:33.850 --> 00:27:38.974 즉 Is Open이 참일 때만 이 작업을 해 463 00:27:38.974 --> 00:27:42.119 라는 기능을 추가하면 되겠죠 464 00:27:42.119 --> 00:27:43.710 이제 우리는 여기다가 465 00:27:43.710 --> 00:27:48.000 이 Tick 이라고 하는 이벤트를 발생을 할 때 466 00:27:48.000 --> 00:27:50.800 조건식을 하나 달아두도록 할게요 467 00:27:50.800 --> 00:27:53.720 우리는 앞서서 Branch라고 하는 노드를 배웠을 겁니다 468 00:27:53.720 --> 00:27:54.894 Branch 469 00:28:01.040 --> 00:28:03.140 Branch 노드를 이용해서 470 00:28:03.140 --> 00:28:05.577 이 Tick에서 Branch를 연결을 하고요 471 00:28:09.210 --> 00:28:13.360 이 Branch의 이 조건식의 결과에 따라서 472 00:28:13.360 --> 00:28:19.440 참이면 무엇을, 거짓이면 무엇을 이렇게 실행하는 거죠 473 00:28:19.440 --> 00:28:24.890 우리의 조건식은 뭐냐면 이 isOpen 변수가 474 00:28:24.890 --> 00:28:30.000 True일 때가 바로 열린 상태가 되는 거겠죠 475 00:28:30.000 --> 00:28:33.400 그래서 이 변수를 드래그&드롭해서 476 00:28:33.400 --> 00:28:37.250 Get isOpen 가지고 와서 477 00:28:37.250 --> 00:28:42.093 이 Condition에다가 이렇게 연결을 해줍니다 478 00:28:42.093 --> 00:28:46.343 이렇게 되면 Is Open이 참이라면 479 00:28:46.343 --> 00:28:47.743 Is Open에 담겨있는 480 00:28:47.743 --> 00:28:51.359 이 변수에 담겨있는 값이 참이라면 True 481 00:28:51.359 --> 00:28:53.509 True라면 True 실행 핀이 482 00:28:53.509 --> 00:28:59.119 False, 거짓이라면 False 실행 핀이 작동하게 될 거예요 483 00:28:59.119 --> 00:29:02.919 우리는 이 Is Open이 참일 때 484 00:29:02.919 --> 00:29:06.679 열렸을 때 무엇을 하냐? 회전하게 된다고 그랬죠 485 00:29:06.679 --> 00:29:10.229 그래서 True 핀을 여기다가 이렇게 연결해 주면 돼요 486 00:29:13.796 --> 00:29:17.484 간단하죠? False일 때는 일을 하지 않아도 되니까 487 00:29:17.484 --> 00:29:19.479 아무것도 연결할 필요는 없을 것 같아요 488 00:29:19.479 --> 00:29:23.029 이 상태에서 컴파일, 저장하고 한번 확인해 볼게요 489 00:29:23.029 --> 00:29:27.039 플레이를 하게 되면 지금 상태에서는 문이 움직이지 않죠 490 00:29:27.039 --> 00:29:35.479 그 이유는 지금 Is Open의 값이 False이기 때문이죠 491 00:29:35.479 --> 00:29:38.329 이제 발판으로 다가가서 492 00:29:38.329 --> 00:29:42.799 isOpen 변수를 참으로 만들어 주면 움직일 거예요 493 00:29:42.799 --> 00:29:44.479 가볼게요 494 00:29:44.479 --> 00:29:47.880 착! 열려지죠 495 00:29:47.880 --> 00:29:49.799 열려지죠 496 00:29:49.799 --> 00:29:54.699 다시 플레이를 해보고 이 발판으로 캐릭터가 다가가게 되면 497 00:29:54.699 --> 00:29:59.239 그제서야 이렇게 움직이는 걸 확인해 볼 수가 있어요 498 00:29:59.239 --> 00:30:02.139 됐죠? 여기 또 문제점이 있네요 499 00:30:02.139 --> 00:30:05.200 문이 계속 회전하는 것을 볼 수가 있어요 500 00:30:05.200 --> 00:30:12.876 이렇게 돌다가 각도가 90도가 되면 딱 멈춰야 되겠죠 501 00:30:12.880 --> 00:30:18.380 이 Door의 이 Rotation 값의 이 Z값이 502 00:30:18.380 --> 00:30:24.440 90도보다 크다면 멈추면 되겠죠 503 00:30:24.440 --> 00:30:28.200 그렇죠? 이거는 여기서 할게요 504 00:30:28.200 --> 00:30:31.900 돌고 있는데 505 00:30:31.900 --> 00:30:35.440 여기서 다시 한번 조건식을 만들어 주는 거예요 506 00:30:35.440 --> 00:30:39.397 Branch 507 00:30:39.397 --> 00:30:43.479 Branch인데 조건식은 뭘까요? 508 00:30:43.479 --> 00:30:49.559 Door의 Z값이 90보다 크다면 되겠죠 509 00:30:49.559 --> 00:30:51.959 즉 이 Door죠 이 Door 변수 510 00:30:51.959 --> 00:30:54.239 Door 변수를 일단 가지고 올게요 511 00:30:54.239 --> 00:30:59.200 Get Door, 이 Door가 바로 이 Door죠 512 00:30:59.200 --> 00:31:03.679 이 Door의 Rotation 값을 가지고 옵니다 513 00:31:03.679 --> 00:31:08.520 즉 Transform에 있는 Rotation Z 값을 가져올 거예요 514 00:31:08.520 --> 00:31:11.620 그래서 이렇게 쭉 빼서 515 00:31:11.620 --> 00:31:15.599 이 Door 변수가 갖고 있는 속성 혹은 기능 516 00:31:15.599 --> 00:31:20.640 여러가지 값들 중에서 Get, 가져와, 무엇을? 517 00:31:20.640 --> 00:31:26.239 Actor Rotation 518 00:31:26.239 --> 00:31:32.933 즉 액터의 로테이션 값을 가지고 오라고 하는 겁니다 519 00:31:32.933 --> 00:31:37.080 그러면 이 Door의 로테이션 값을 가지고 온 거예요 520 00:31:37.080 --> 00:31:39.320 그 정보가 지금 여기에 담겨 있어요 521 00:31:39.320 --> 00:31:42.679 역시 마찬가지 리턴의 값을 뺄 수가 있는데 522 00:31:42.679 --> 00:31:47.760 지금 같은 경우에는 값이 X, Y, Z 모두 다 들어 있어요 523 00:31:47.760 --> 00:31:49.880 그래서 우리는 여기서 Z값만 가져오면 되죠 524 00:31:49.880 --> 00:31:52.030 그래서 여기서 우클릭해서 525 00:31:52.030 --> 00:31:55.200 Split Struct Pin을 클릭을 하면 526 00:31:55.200 --> 00:31:57.719 쫘락하고 풀어집니다 527 00:31:57.719 --> 00:32:02.840 우리는 이 중에서 이 값만 비교해 사용하면 돼요 528 00:32:02.840 --> 00:32:09.760 그래서 이 값이, 지금 이 Z값이 90도보다 크다 하면이죠 529 00:32:09.760 --> 00:32:12.919 그래서 우클릭 530 00:32:12.919 --> 00:32:13.960 크다 531 00:32:13.960 --> 00:32:17.239 Greater 비교 연산자를 가지고 옵니다 532 00:32:17.239 --> 00:32:20.640 그리고 이 Z값을 비교 연산자 위에다 놓고요 533 00:32:20.640 --> 00:32:25.520 이 아래쪽에는 얼마보다 클 거니?라는 걸 정할 수가 있는데 534 00:32:25.520 --> 00:32:28.080 일반적인 숫자를 집어넣을 수도 있지만 535 00:32:28.080 --> 00:32:30.885 일단 여기다 그냥 바로 90이라는 536 00:32:30.885 --> 00:32:33.960 숫자를 넣어도 되기는 해요 537 00:32:33.960 --> 00:32:40.520 그러면 90도보다 이 Z값이 크다 하면 538 00:32:40.520 --> 00:32:43.520 90도보다 크다 하면 539 00:32:43.520 --> 00:32:47.119 이렇게 성립이 되는 겁니다 540 00:32:47.119 --> 00:32:49.869 그 결과 값을 이제 이 Branch에다가 541 00:32:49.869 --> 00:32:51.760 이렇게 연결을 해주는 거예요 542 00:32:51.760 --> 00:32:57.719 그러면 이 결과 값이 90도보다 크다 하면 멈춰야겠죠 543 00:32:57.719 --> 00:32:59.479 멈춰야 될 거예요 544 00:32:59.479 --> 00:33:03.840 Door의 Z값이 90도보다 크다 하면 545 00:33:03.840 --> 00:33:05.080 True 값으로 진행이 되겠죠 546 00:33:05.080 --> 00:33:12.479 그때 isOpen 변수를 False로 다시 바꿔주는 거예요 547 00:33:12.479 --> 00:33:15.919 바꿔주게 된다면 548 00:33:15.919 --> 00:33:21.679 매 프레임마다 이 Tick 이벤트가 발생을 한다고 했었죠 549 00:33:21.679 --> 00:33:24.320 그때 다시 한번 발생했을 때 550 00:33:24.320 --> 00:33:30.679 isOpen 변수가 비활성이네? False네? 551 00:33:30.679 --> 00:33:34.440 그러면 True로 가지 말고 False로 가야겠다라고 해서 552 00:33:34.440 --> 00:33:35.799 일을 안 하게 되는 겁니다 553 00:33:35.799 --> 00:33:37.559 즉 멈추게 된다는 거죠 554 00:33:37.559 --> 00:33:40.479 이 모두가 멈추게 되는 거예요 555 00:33:40.479 --> 00:33:43.200 그래서 여기다가 이렇게 작업을 해 볼게요 556 00:33:43.200 --> 00:33:46.650 isOpen 변수를 가지고 와서 557 00:33:46.650 --> 00:33:51.039 Set isOpen 모드를 열어줄 거예요 558 00:33:51.039 --> 00:33:56.119 그래서 90도보다 클 때, 즉 참일 때 559 00:33:56.119 --> 00:34:03.219 Is Open 변수를 비활성화 시켜줘라 560 00:34:03.219 --> 00:34:05.719 라고 실행을 한 거예요 561 00:34:05.719 --> 00:34:07.919 됐죠? 562 00:34:07.919 --> 00:34:09.359 그러고 나서 다시 한번 볼까요 563 00:34:09.359 --> 00:34:11.719 여기 테스트 한번 해볼게요 564 00:34:11.719 --> 00:34:15.869 Print String을 통해서 565 00:34:15.869 --> 00:34:22.479 이제는 멈췄습니다라고 출력해 보도록 할게요 566 00:34:22.479 --> 00:34:25.320 만약에 이게 잘 작동이 된다면 567 00:34:25.320 --> 00:34:27.270 Is Open이 비활성화 되고 568 00:34:27.270 --> 00:34:32.000 멈췄다라는 출력도 나오게 되겠죠 569 00:34:32.000 --> 00:34:33.559 그러면 아 잘 작동을 했겠구나 570 00:34:33.559 --> 00:34:35.119 우리는 알 수 있게 될 거니까요 571 00:34:35.119 --> 00:34:37.058 멈췄습니다는 한 572 00:34:41.454 --> 00:34:45.559 10회 정도, 길게 해보도록 하겠습니다 573 00:34:45.559 --> 00:34:48.309 지금 Open, 열렸습니다가 574 00:34:48.309 --> 00:34:50.239 열렸습니다도 지금 2초로 돼있으니까 575 00:34:50.239 --> 00:34:55.320 금방 사라지니까 10초로 맞춰놓도록 할게요 576 00:34:55.320 --> 00:34:59.479 컴파일, 저장하고 다시 플레이를 해보면 577 00:34:59.479 --> 00:35:03.059 이렇게 버튼을 눌러 이렇게 가면 578 00:35:03.059 --> 00:35:07.119 열렸습니다라는 메시지와 함께 멈췄습니다 579 00:35:07.119 --> 00:35:08.640 이번엔 끝났죠 580 00:35:08.640 --> 00:35:10.840 다 열리고 나서 90도가 넘으니까 581 00:35:10.840 --> 00:35:13.200 멈췄습니다라고 하는 출력이 되면서 582 00:35:13.200 --> 00:35:17.559 문도 자연스럽게 멈춘 걸 볼 수가 있어요 583 00:35:17.559 --> 00:35:24.799 그럼 이번에는 열리는 속도가 조금은 느린 것 같아서 584 00:35:24.799 --> 00:35:28.559 적당한 것을 좀 찾아볼까 해요 585 00:35:28.559 --> 00:35:31.080 지금 1이라고 되어 있는데 586 00:35:31.080 --> 00:35:34.760 변수를 하나 만들어서 외부에서 수정할 수 있도록 587 00:35:34.760 --> 00:35:36.599 그렇게 만들어 보도록 하죠 588 00:35:36.599 --> 00:35:39.199 그래서 VARIABLES을 클릭을 해서 589 00:35:39.199 --> 00:35:41.852 변수를 하나 만들게요 590 00:35:41.852 --> 00:35:48.080 이름은 Speed라고 할게요 591 00:35:48.080 --> 00:35:55.520 값은 Float로 소수점까지 찍어보도록 할게요 592 00:35:55.520 --> 00:36:03.960 그리고 이 변수를 Get Speed로 변수를 빼내와서 593 00:36:03.960 --> 00:36:06.960 변수를 Delta Rotation에 이렇게 594 00:36:06.960 --> 00:36:09.280 집어넣도록 하겠습니다 595 00:36:09.280 --> 00:36:11.440 컴파일을 누르고 저장을 눌러서 596 00:36:11.440 --> 00:36:16.960 Speed에 대한 기본값을 일단은 1로 둬야겠죠 597 00:36:16.960 --> 00:36:21.440 그리고 Instance Editable을 체크를 해서 598 00:36:21.440 --> 00:36:25.440 외부에서도 수정할 수 있게끔 해 뒀고요 599 00:36:25.440 --> 00:36:31.000 컴파일, 저장을 눌러서 이번에는 밖으로 나가면 600 00:36:31.000 --> 00:36:33.199 이 Door가 아니죠, 그리고 이 블루프린트 601 00:36:33.199 --> 00:36:35.599 우리가 만든 블루프린트를 클릭을 해 보면 602 00:36:35.599 --> 00:36:39.565 Door Speed까지 이렇게 설정을 할 수 있는 항목이 603 00:36:39.565 --> 00:36:42.039 노출되어 있는 걸 알 수가 있죠 604 00:36:42.039 --> 00:36:45.479 지금 1로 되어 있는데 조금 더 빠르게 해볼게요 605 00:36:45.479 --> 00:36:47.080 10 정도로 해볼까요 606 00:36:47.080 --> 00:36:49.431 이렇게 있을 경우에 플레이 해볼게요 607 00:36:49.431 --> 00:36:51.479 이렇게 가면 608 00:36:51.479 --> 00:36:53.719 아 이거 너무 빠르네요 그렇죠? 609 00:36:53.719 --> 00:36:56.440 한 3 정도로만 해보겠습니다 610 00:36:56.440 --> 00:36:59.240 플레이를 해보면 이렇게 611 00:36:59.240 --> 00:37:01.799 샥 하고 열리는 걸 볼 수가 있습니다 612 00:37:01.799 --> 00:37:06.000 너무 빠른 것 같다 그러면 더 줄여도 되고요 613 00:37:06.000 --> 00:37:12.479 0.5로 더 줄여도 상관없겠죠 614 00:37:12.479 --> 00:37:17.119 이렇게 천천히 열리는 걸 볼 수가 있습니다 615 00:37:17.119 --> 00:37:19.334 이렇게 Speed 변수를 이용해서 616 00:37:19.334 --> 00:37:21.560 회전문의 속도를 조정을 했었죠 617 00:37:21.560 --> 00:37:26.680 그래서 매 프레임마다 일정한 값이 계속 늘어나게끔 618 00:37:26.680 --> 00:37:29.464 그렇게 기능을 만들어 줬어요 619 00:37:29.807 --> 00:37:33.649 델타 세컨드 620 00:37:34.239 --> 00:37:37.920 그런데 이 기능은 치명적인 오류를 담고 있어요 621 00:37:37.920 --> 00:37:41.040 지금 플레이하고 있는 이 PC에서는 622 00:37:41.040 --> 00:37:44.560 현 시점에서는 오류가 아니에요 623 00:37:44.560 --> 00:37:48.800 하지만 델타 세컨드라고 하는 개념을 여러분들이 알게 되면 624 00:37:48.800 --> 00:37:55.439 이 모드는 커다란 오류에 빠져있다는 걸 알게 됩니다 625 00:37:55.439 --> 00:37:58.680 델타 세컨드에 대해서 알아보도록 할게요 626 00:37:58.680 --> 00:38:00.760 먼저 2대의 PC가 있다고 할게요 627 00:38:00.760 --> 00:38:04.119 철수와 영희, 2명의 플레이어가 628 00:38:04.119 --> 00:38:07.959 2대의 컴퓨터를 놓고 달리기 게임을 한다고 할게요 629 00:38:07.959 --> 00:38:11.760 이 달리기 게임은 하나의 프레임을 읽으면 630 00:38:11.760 --> 00:38:14.560 1m씩 가게끔 이렇게 짜여 있어요 631 00:38:14.560 --> 00:38:17.640 철수의 컴퓨터는 좀 더 좋아서 632 00:38:17.640 --> 00:38:21.199 한 프레임을 읽는데 0.25초가 걸린다고 합시다 633 00:38:21.199 --> 00:38:23.800 그리고 영희의 컴퓨터 같은 경우는 634 00:38:23.800 --> 00:38:29.160 하나의 프레임을 읽는데 0.5초가 걸린다고 했을 때 635 00:38:29.160 --> 00:38:33.400 1초가 되는 시점에는 철수의 PC는 4번 읽게 되고 636 00:38:33.400 --> 00:38:37.680 프레임을 읽을 때마다 1m씩, 1m씩, 1m씩, 1m씩 이동하니까 637 00:38:37.680 --> 00:38:41.479 철수는 결과적으로 4m를 이동하게 될 거고요 638 00:38:41.479 --> 00:38:47.239 영희의 PC는 1초에 2번의 프레임을 읽게 되겠죠 639 00:38:47.239 --> 00:38:49.040 0.5초를 한 프레임에 읽으니까 640 00:38:49.040 --> 00:38:52.540 그러면 한 프레임을 읽을 때 1m씩 641 00:38:52.540 --> 00:38:54.400 한 프레임을 읽을 때 1m씩 하게 되니까 642 00:38:54.400 --> 00:38:56.550 결과적으로는 1초가 됐을 때 643 00:38:56.550 --> 00:38:59.199 2m를 움직이는 결과가 생기게 될 거예요 644 00:38:59.199 --> 00:39:04.719 즉 철수보다 영희는 항상 뒤처질 수밖에 없죠 645 00:39:04.719 --> 00:39:08.880 이것은 PC가 좋고 낮음에 따라서 646 00:39:08.880 --> 00:39:13.199 달리기 게임의 결과가 달라진다는 것을 의미해요 647 00:39:13.199 --> 00:39:16.839 이렇게 되면 형평성이 어긋나죠 648 00:39:16.839 --> 00:39:19.800 그래서 어떤 방법을 쓰게 되냐면 649 00:39:19.800 --> 00:39:21.756 바로 여기서 델타 세컨드 650 00:39:21.756 --> 00:39:26.280 즉 변위 시간을 각각 적용하게 돼요 651 00:39:26.280 --> 00:39:30.430 한 번 프레임을 읽는 시간을 곱해줘서 652 00:39:30.430 --> 00:39:32.800 일정 시간으로 유지시켜 주는 거예요 653 00:39:32.800 --> 00:39:37.200 즉 1초가 지났을 때 1m가 움직이게끔 654 00:39:37.200 --> 00:39:39.040 강제화 시켜주는 거죠 655 00:39:39.040 --> 00:39:43.000 그래서 매 프레임마다 일정한 시간을 656 00:39:43.000 --> 00:39:50.000 철수는 조금 더 작은 숫자의 0.25라는 시간을 곱해주고 657 00:39:50.000 --> 00:39:53.600 영희의 컴퓨터에서는 0.5라고 하는 시간 658 00:39:53.600 --> 00:39:55.400 조금 다른 시간이죠 659 00:39:55.400 --> 00:39:58.900 철수와 영희의 컴퓨터가 컴퓨터에 따라서 660 00:39:58.900 --> 00:40:01.182 조금은 다른 시간을 곱해주는 거죠 661 00:40:01.182 --> 00:40:05.032 결국 이 두 플레이어는 1초가 됐을 때 똑같이 662 00:40:05.032 --> 00:40:08.682 1m가 이렇게 움직일 수 있는 결과값을 663 00:40:08.682 --> 00:40:12.359 얻을 수가 있게 있을 수 있다는 얘깁니다 664 00:40:12.359 --> 00:40:16.759 그렇게 되면 둘 다 형평성에 어긋나지 않겠죠 665 00:40:16.759 --> 00:40:20.809 이 Speed 값에 이 델타 세컨드라고 하는 666 00:40:20.809 --> 00:40:25.719 이 프레임을 읽는 시간의 값을 곱해줌으로 해서 667 00:40:25.719 --> 00:40:29.019 전체 시간을 고정시켜 주는 것은 668 00:40:29.019 --> 00:40:31.519 프로그래밍 할 때 가장 기본이 되는 669 00:40:31.519 --> 00:40:33.669 실시간 콘텐츠를 제작을 할 때 670 00:40:33.669 --> 00:40:37.920 가장 기본이 되는 요소라고 생각하시면 좋아요 671 00:40:37.920 --> 00:40:39.570 그래서 그 작업을 좀 해줄 거예요 672 00:40:39.570 --> 00:40:43.070 그래서 이 빈 공간에서 우클릭을 한 다음에 673 00:40:43.070 --> 00:40:52.501 변위 시간, Get World delta Seconds라고 검색을 해보시면 674 00:40:52.501 --> 00:40:53.848 이런 노드가 나오게 됩니다 675 00:40:56.343 --> 00:40:58.793 이 델타 세컨드는 PC마다 다르고요 676 00:40:58.793 --> 00:41:00.683 그 상황마다 다르게 돼요 677 00:41:00.683 --> 00:41:05.083 이것은 엔진에서 계산해서 보내주는 정보이기 때문에 678 00:41:05.083 --> 00:41:08.260 이것은 그냥 가져와서 사용하기만 하면 됩니다 679 00:41:08.260 --> 00:41:10.460 그래서 이 Delta Seconds를 680 00:41:10.460 --> 00:41:13.670 이 Speed 값에 곱해 주셔야 돼요 681 00:41:13.670 --> 00:41:15.825 그래서 Multiply 682 00:41:18.735 --> 00:41:22.750 이 Speed 값과 이 Delta Seconds를 곱해 주고 683 00:41:22.750 --> 00:41:26.700 이 곱해준 결과값을 이렇게 684 00:41:26.700 --> 00:41:30.959 Delta Rotation에 연결을 해주면 됩니다 685 00:41:30.959 --> 00:41:35.759 이렇게 되어야 디바이스 간의 형평성이 어긋나지 않게 돼요 686 00:41:35.759 --> 00:41:37.245 플레이를 해 보겠습니다 687 00:41:40.040 --> 00:41:42.048 그러면 이제 발판을 누르게 되면 688 00:41:46.364 --> 00:41:50.329 아마 지금은 거의 움직이는 것처럼 보이지 않을 텐데 689 00:41:52.840 --> 00:41:56.840 F8을 눌러서 잠깐 나오게 되면 690 00:41:56.840 --> 00:41:59.590 아마 아주 미세하게, 그렇죠? 691 00:41:59.590 --> 00:42:03.800 계속 올라가는 걸 볼 수가 있을 겁니다 692 00:42:03.800 --> 00:42:06.150 움직이고 있다는 얘기에요 693 00:42:06.150 --> 00:42:09.950 이렇게 작아진 이유는 델타 세컨드를 곱해줌으로 해서 694 00:42:09.950 --> 00:42:12.100 이 매 프레임마다 움직이는 숫자가 695 00:42:12.100 --> 00:42:14.245 굉장히 낮아졌기 때문이에요 696 00:42:14.245 --> 00:42:18.295 그래서 이때는 이 속도 값을 697 00:42:18.295 --> 00:42:20.800 이 Speed 값을 아주 많이 올려줘야 돼요 698 00:42:20.800 --> 00:42:22.550 0.5로 많이 낮아졌었네요 699 00:42:22.550 --> 00:42:25.850 이때는 한 10 정도로 좀 올려 볼게요 700 00:42:25.850 --> 00:42:28.826 플레이를 해 보면 701 00:42:28.826 --> 00:42:31.426 아까보단 조금 더 빨라졌죠 702 00:42:31.426 --> 00:42:32.520 좀 더 빨리 해야 되겠네요 703 00:42:35.490 --> 00:42:38.021 100 정도로 넣어보도록 하겠습니다 704 00:42:38.021 --> 00:42:41.160 플레이해서 가보면 705 00:42:41.160 --> 00:42:46.577 결과는 똑같습니다, 발판을 밟으면 열린다는 것은 똑같지만 706 00:42:46.577 --> 00:42:49.985 기본적으로 우리는 디바이스 간의 형평성을 위해서 707 00:42:49.985 --> 00:42:52.885 델타 세컨드라는 걸 적용시켰다는 것이 708 00:42:52.885 --> 00:42:55.635 지금의 시스템에서는 달라진 거예요 709 00:42:55.635 --> 00:42:59.085 그래서 지금 이 PC에서, 혹은 다른 PC에서 710 00:42:59.085 --> 00:43:04.066 이 기능을 작동시켰을 때 똑같이 이제 움직여질 겁니다 711 00:43:04.066 --> 00:43:07.877 그러면 블루프린트를 이용해서 문을 여는 712 00:43:07.877 --> 00:43:10.377 간단한 기능을 한번 만들어 봤어요 713 00:43:10.377 --> 00:43:12.520 수고하셨습니다 714 00:43:12.520 --> 00:43:15.684 그럼 이번 시간에 학습한 내용을 정리해 보겠습니다 715 00:43:16.648 --> 00:43:17.898 콜리전의 역할 및 작동 원리 자동문 발판에 올라가면 문이 회전하면서 열리는 자동문 기능을 구현 StarterContent→Props의 SM_Door 애셋을 드래그해 월드에 배치 716 00:43:17.898 --> 00:43:19.148 BP 폴더 생성→Actor 클래스 상속받은 BP_Door 블루프린트 생성 후 레벨에 배치 717 00:43:19.148 --> 00:43:20.398 블루프린트 스크립팅 컴포넌트창 +Add를 이용해 Cube 컴포넌트 추가 캐릭터와의 충돌을 위한 Box Collision 컴포넌트 추가 718 00:43:20.398 --> 00:43:21.598 [Event ActorBeginOverlap]에 Print String 노드를 이용해 충돌 감지 테스트 719 00:43:21.598 --> 00:43:22.298 문 회전 설정 Add Actor World Rotation 노드를 이용해 작동 회전할 대상을 담은 Door 변수 생성 뒤 Target 입력 핀에 연결 720 00:43:22.298 --> 00:43:22.998 ActorBeginOverlap 노드의 실행 핀을 Add Actor World Rotation 노드와 연결 SM_Door의 Mobility를 Movable로 변경 721 00:43:22.998 --> 00:43:23.648 Event Tick 노드와 Add Actor World Rotation 노드 연결 후 Delta Rotation Z값 설정 isOpen 변수 생성 후 Boolean 자료형 선택 722 00:43:23.648 --> 00:43:24.348 ActorBeginOverlap 실행 시 isOpen 변수가 활성화되도록 설정 isOpen 변수가 True일 때만 문이 회전하도록 설정 723 00:43:24.348 --> 00:43:25.070 SM_Door의 Rotation Z값이 90보다 클 때 문의 회전이 멈추도록 설정 724 00:43:25.070 --> 00:43:25.815 문 회전 속도 조절 변수 생성 후 Speed로 이름 설정하고 Float 자료형 선택 725 00:43:25.815 --> 00:43:26.568 Speed 변수를 그래프창으로 드래그 후 Get Speed 선택하고 Delta Rotation Z 핀에 연결 Instance Editable을 활성화해 외부에서 수정 가능하게 함 726 00:43:26.568 --> 00:43:27.568 델타 세컨드 프레임의 이해 1프레임마다 일정한 거리로 이동하는 코드일 경우 디바이스의 성능에 따라 거리 차이가 발생 727 00:43:27.568 --> 00:43:28.568 디바이스 사양에 따라 게임 겨로가가 달라지게 되며, 이는 형평성에 어긋남 728 00:43:28.568 --> 00:43:29.568 델타 세컨드 디바이스간의 형평성을 위해서 1프레임을 읽는 시간인 변위 시간 Delta Second를 적용 델타 세컨드를 적용하면 같은 시간에 같은 거리를 이동하게 조절이 가능함 729 00:43:29.568 --> 00:43:30.518 델타 세컨드 적용 Get World delta Seconds 노드 생성 Multiply 생성 후 Speed와 Get World Delta Seconds 노드 연결 730 00:43:30.518 --> 00:43:31.485 Multiply 결과를 Delta Rotation Z 핀에 연결 Speed 값에 따라 문 회전 속도가 달라지는 것 확인