﻿1
00:00:04,080 --> 00:00:05,890
‫Hello and welcome back.

2
00:00:05,910 --> 00:00:11,990
‫Now we are moving our tank forward and backward, but we have no way to actually steer the tank.

3
00:00:12,000 --> 00:00:18,260
‫So in this video, we're going to work on actually turning the tank using something called local rotation.

4
00:00:18,270 --> 00:00:23,040
‫This is the rotational analog to add actor local offset.

5
00:00:23,070 --> 00:00:29,850
‫Now add actor local offset had multiple input parameters and we only passed in the first one as the

6
00:00:29,850 --> 00:00:31,470
‫other three were optional.

7
00:00:31,650 --> 00:00:35,010
‫But one of those other three had to do with sweeping.

8
00:00:35,010 --> 00:00:41,190
‫And we're going to discuss a little bit about sweeping before we continue implementing rotation.

9
00:00:41,190 --> 00:00:45,660
‫So I'm back in the documentation for ADD Actor Local Offset.

10
00:00:45,660 --> 00:00:48,720
‫So let's take a look at these input parameters once more.

11
00:00:48,750 --> 00:00:52,770
‫The second one is called B Sweep and it's a Boolean.

12
00:00:53,160 --> 00:00:59,790
‫Now, if we scroll down a little bit more and read the information here for B sweep, it says Whether

13
00:00:59,790 --> 00:01:07,140
‫we sweep to the destination location triggering overlaps along the way and stopping short of the target

14
00:01:07,140 --> 00:01:08,820
‫if blocked by something.

15
00:01:09,180 --> 00:01:14,790
‫It also goes on to say that only the root component is swept and checked for blocking collision.

16
00:01:14,790 --> 00:01:17,430
‫Child components move without sweeping.

17
00:01:17,700 --> 00:01:20,820
‫If collision is off, this has no effect.

18
00:01:21,060 --> 00:01:28,440
‫So let's talk about what this means now in games programming, sweeping is a technique done by the engine,

19
00:01:28,440 --> 00:01:30,390
‫as long as sweeping is enabled.

20
00:01:30,570 --> 00:01:38,370
‫If we have a moving object such as a sphere represented by this circle, each frame as this sphere is

21
00:01:38,370 --> 00:01:42,090
‫moving, the engine is performing sweep checks.

22
00:01:42,090 --> 00:01:49,740
‫This means it's checking to see if that move for this particular frame would have resulted in an overlap

23
00:01:49,740 --> 00:01:51,420
‫between two objects.

24
00:01:51,630 --> 00:01:55,560
‫So I have this block here represented by this rectangle.

25
00:01:56,010 --> 00:01:59,580
‫Now let's just consider that these are the only two objects in the world.

26
00:01:59,580 --> 00:02:06,600
‫So while sweeping is enabled as the sphere is moving towards the object, the engine is checking to

27
00:02:06,600 --> 00:02:09,330
‫see if these two objects are overlapping.

28
00:02:09,570 --> 00:02:16,410
‫Now, as the sphere continues to move, let's say during one of these frames the sphere would have moved

29
00:02:16,410 --> 00:02:19,500
‫such that it's overlapping the other object.

30
00:02:19,500 --> 00:02:26,760
‫Now what sweeping enabled does is the engine will detect this overlap and move that sphere back for

31
00:02:26,790 --> 00:02:31,920
‫that particular frame so that it never actually penetrates the object.

32
00:02:31,950 --> 00:02:35,460
‫Now we never actually see the sphere penetrate the object.

33
00:02:35,490 --> 00:02:40,530
‫The engine catches that overlap before the movement is actually implemented.

34
00:02:40,530 --> 00:02:46,020
‫So the result is that we see that the sphere stops just short of overlapping.

35
00:02:46,020 --> 00:02:52,710
‫So if this rectangle were a wall, for example, the sphere would stop at the surface of the wall.

36
00:02:52,710 --> 00:02:55,170
‫That is what sweeping achieves for us.

37
00:02:55,170 --> 00:03:00,030
‫Now the documentation says if collision is off, this has no effect.

38
00:03:00,030 --> 00:03:04,590
‫So collision has to be enabled in order for sweeping to work.

39
00:03:04,740 --> 00:03:12,090
‫So back here in tanks CP in the move function, here's our call to add actor local offset and if we

40
00:03:12,120 --> 00:03:19,110
‫want we can pass in another input parameter here, the second one being the sweep boolean so we can

41
00:03:19,110 --> 00:03:20,310
‫pass in true here.

42
00:03:20,310 --> 00:03:24,540
‫So let's compile this and see the effect of enabling sweeping.

43
00:03:24,540 --> 00:03:30,720
‫Now if we press play and we attempt to move through a wall, for example, we'll see that we move right

44
00:03:30,720 --> 00:03:31,560
‫through the wall.

45
00:03:31,560 --> 00:03:34,020
‫So something isn't quite working here.

46
00:03:34,020 --> 00:03:38,280
‫Now let's look at what that route component for the BP pond tank is.

47
00:03:38,280 --> 00:03:41,730
‫Recall, we used the capsule component for the route.

48
00:03:41,730 --> 00:03:45,570
‫So with capsule components selected in BP pond tank.

49
00:03:45,570 --> 00:03:51,690
‫Let's go to the details panel and scroll down and we'll see here a section called Collision.

50
00:03:51,690 --> 00:03:55,860
‫And here we see Collision Presets and it has a dropdown.

51
00:03:55,860 --> 00:03:57,420
‫So let's expand that.

52
00:03:57,420 --> 00:04:05,010
‫Now, Collision Presets can be set to any number of options and by default we see overlap all dynamic.

53
00:04:05,010 --> 00:04:08,280
‫Now, depending on the version of Unreal Engine you're using.

54
00:04:08,280 --> 00:04:11,580
‫You may see something else here, but we can change this.

55
00:04:11,580 --> 00:04:18,750
‫If we select the dropdown and choose block all dynamic, then the grayed out options below change.

56
00:04:18,750 --> 00:04:25,470
‫Remember we were on overlap all dynamic and here we see three columns of checkboxes.

57
00:04:25,590 --> 00:04:33,240
‫These are collision responses and the column to the left show a list of collision object types.

58
00:04:33,240 --> 00:04:37,860
‫So any given component has its own collision object type.

59
00:04:37,860 --> 00:04:42,840
‫Notice we can see the object type for the capsule set to world dynamic.

60
00:04:42,840 --> 00:04:48,600
‫And when we change collision presets to block all dynamic, you'll see that the collision responses

61
00:04:48,600 --> 00:04:54,450
‫are all checked to block in response to all other collision object types.

62
00:04:54,450 --> 00:04:59,160
‫So let's press play and see what happens when we try to pass through things.

63
00:04:59,160 --> 00:05:03,630
‫You'll see that we stop just short of overlapping with.

64
00:05:03,710 --> 00:05:04,860
‫The other ponds.

65
00:05:04,880 --> 00:05:13,520
‫Now, if I move the tank so that we can attempt to overlap with the wall and sort of go around the other

66
00:05:13,520 --> 00:05:14,340
‫ponds.

67
00:05:14,360 --> 00:05:17,900
‫Now, if I press play, I block the wall as well.

68
00:05:17,900 --> 00:05:26,330
‫So this collision preset block, all dynamic sets the collision response to block all other object types.

69
00:05:26,330 --> 00:05:32,900
‫And you can always see the collision object type of a particular component by selecting it in the components

70
00:05:32,900 --> 00:05:39,590
‫panel and scrolling down to the collision section in the details panel and opening the dropdown for

71
00:05:39,590 --> 00:05:40,790
‫Collision Presets.

72
00:05:40,790 --> 00:05:47,540
‫I have the base mesh selected and its object type is world dynamic and it's set to block all.

73
00:05:47,540 --> 00:05:54,350
‫So now we see that sweeping is working since we set our collision presets for the capsule comp to block

74
00:05:54,350 --> 00:05:55,490
‫all dynamic.

75
00:05:55,490 --> 00:06:02,720
‫And we saw in the documentation that only the root component is swept and checked for blocking collision.

76
00:06:02,720 --> 00:06:06,140
‫So it doesn't really matter what the other components are set to.

77
00:06:06,170 --> 00:06:10,790
‫We're only checking to see if the root component is blocking something.

78
00:06:10,790 --> 00:06:15,800
‫Now, one issue that's tripped up some students is that they cannot move as soon as they set the capsule

79
00:06:15,800 --> 00:06:17,510
‫to block all dynamic.

80
00:06:17,810 --> 00:06:23,750
‫Now, one reason for this could be that your capsule is overlapping with the floor.

81
00:06:23,780 --> 00:06:28,820
‫If the capsule is overlapping with the floor, you won't be able to move because the engine will not

82
00:06:28,820 --> 00:06:35,390
‫allow your tank to move if the capsule component is overlapping with something that it's set to block.

83
00:06:35,390 --> 00:06:41,240
‫So an easy fix for this would be to make sure your capsule is not overlapping with the floor.

84
00:06:41,720 --> 00:06:49,370
‫Now, you can go into your BP -- tank and make sure that your capsule is just above the wheels here.

85
00:06:49,370 --> 00:06:52,640
‫I'm going to go into orthographic view.

86
00:06:53,720 --> 00:06:56,840
‫And select my base mesh and just bring it down.

87
00:06:56,840 --> 00:07:00,980
‫So the wheels are just below the capsule component.

88
00:07:01,190 --> 00:07:06,470
‫So now if your mesh is just on the floor and the capsule is just above the mesh.

89
00:07:06,680 --> 00:07:09,010
‫You should be able to move around.

90
00:07:09,020 --> 00:07:12,110
‫So I'm going to hit play and there we go.

91
00:07:12,740 --> 00:07:17,620
‫So now that we have sweeping out of the way, it's time to start implementing rotation.

92
00:07:17,630 --> 00:07:19,520
‫Let's go back to our project settings.

93
00:07:19,520 --> 00:07:29,060
‫So we go to edit project settings, scroll down to input and in the input section we have our axis mappings.

94
00:07:29,060 --> 00:07:30,710
‫Now we've already taken care of.

95
00:07:30,710 --> 00:07:31,790
‫Move forward.

96
00:07:31,790 --> 00:07:40,220
‫It's time to take care of the next one called Turn and Turn has D and A assigned to it where D has a

97
00:07:40,220 --> 00:07:44,060
‫scale of one and A has a scale of negative one.

98
00:07:44,060 --> 00:07:48,080
‫We'd like to use the D and AX to rotate the tank.

99
00:07:48,170 --> 00:07:54,470
‫So in order to bind a function to the turn axis mapping, we need a function to bind.

100
00:07:54,470 --> 00:08:02,330
‫So we're back in V's code and I'm going to go into the tank file so we can create a function to bind

101
00:08:02,330 --> 00:08:04,100
‫to that turn axis mapping.

102
00:08:04,100 --> 00:08:08,630
‫Now I'm just going to call this void function turn and just like move.

103
00:08:08,660 --> 00:08:12,560
‫It needs a float input parameter and we'll call this value.

104
00:08:12,560 --> 00:08:18,530
‫So we've declared this function, let's define it and tank CP and I'm going to put it just under the

105
00:08:18,530 --> 00:08:19,790
‫move function.

106
00:08:19,790 --> 00:08:26,600
‫So I've given it a function body and I need the class name along with the double colons just before

107
00:08:26,600 --> 00:08:27,590
‫the function name.

108
00:08:27,590 --> 00:08:29,270
‫Now we have a proper function.

109
00:08:29,270 --> 00:08:31,400
‫Now, this isn't the only thing we need to do.

110
00:08:31,430 --> 00:08:36,590
‫We need to make sure that this function is bound to the axis mapping called turn.

111
00:08:36,590 --> 00:08:44,000
‫We do that in setup player input component and we do it just like we did the move forward axis mapping.

112
00:08:44,000 --> 00:08:51,290
‫So we're going to say player input component, we're going to use the arrow operator and bind axis.

113
00:08:52,100 --> 00:08:58,250
‫Now the first parameter is going to be the axis mapping name wrapped in a text macro.

114
00:08:58,340 --> 00:09:02,420
‫So we're going to say turn as that was the axis mapping name.

115
00:09:02,420 --> 00:09:05,180
‫Next is the object we're binding the function for.

116
00:09:05,180 --> 00:09:10,100
‫We can pass in this and finally we pass in the function we'd like to bind again.

117
00:09:10,100 --> 00:09:14,600
‫We need the address of operator and it's going to be a tank turn.

118
00:09:14,600 --> 00:09:16,550
‫So it's as easy as that.

119
00:09:16,580 --> 00:09:21,200
‫We've bound the turn function to the turn axis mapping.

120
00:09:21,500 --> 00:09:26,330
‫The only thing left is to actually do something in the turn function.

121
00:09:26,330 --> 00:09:32,390
‫Now we've seen that we have ADD actor local offset, but there's a rotational analog to this function

122
00:09:32,390 --> 00:09:35,240
‫and it's called ADD Actor local rotation.

123
00:09:35,240 --> 00:09:41,600
‫What this does is adds a local rotation to the actor as its name suggests, and you'll see that there

124
00:09:41,600 --> 00:09:47,330
‫are two different versions of the function, one that takes an F rotator and one that takes something

125
00:09:47,330 --> 00:09:48,530
‫called an F quad.

126
00:09:48,530 --> 00:09:51,140
‫We're going to use the version that takes an F rotator.

127
00:09:51,140 --> 00:09:53,480
‫It's called Delta rotation.

128
00:09:53,480 --> 00:10:00,800
‫And just like ADD Actor Local offset, it can also take a sweep parameter and the same other two input

129
00:10:00,800 --> 00:10:03,170
‫parameters as add actor local offset.

130
00:10:03,170 --> 00:10:08,720
‫And these last three input parameters are optional, just like add actor local offset.

131
00:10:08,720 --> 00:10:13,060
‫So instead of an F vector, we're going to pass in an F rotator.

132
00:10:13,070 --> 00:10:20,210
‫Now back here in the turn function, if we create an F rotator and we call this Delta rotation, we'll

133
00:10:20,210 --> 00:10:26,960
‫see that if we right click on F rotator and go to definition, we're taken to rotator and we'll see

134
00:10:26,960 --> 00:10:30,410
‫three public member variables here of type float.

135
00:10:30,410 --> 00:10:37,250
‫Now just like the F vector F rotator has these three components only instead of X, Y and Z, we have

136
00:10:37,250 --> 00:10:39,140
‫pitch yaw and roll.

137
00:10:39,140 --> 00:10:42,050
‫Now, yaw is the component that we're interested in.

138
00:10:42,050 --> 00:10:46,940
‫It says rotation around the up axis in parentheses around Z axis.

139
00:10:46,940 --> 00:10:52,370
‫And that's the only type of rotation we care about rotating around the Z axis.

140
00:10:52,370 --> 00:10:54,500
‫That's how we can steer our tank.

141
00:10:54,500 --> 00:11:00,860
‫Now, I'm just going to point out to you that there are multiple constructors for the F rotator as well,

142
00:11:00,860 --> 00:11:06,110
‫and that the default again says no initialization, just like with the F vector.

143
00:11:06,110 --> 00:11:12,410
‫So we can use the one that takes a single float and all components will be initialized to that float

144
00:11:12,410 --> 00:11:13,190
‫value.

145
00:11:13,220 --> 00:11:18,560
‫There's one with three float values and you can take a look and see some of the others.

146
00:11:18,560 --> 00:11:25,820
‫Now, I'll also point out that there's a zero rotator and by the way, this is a static zero rotator.

147
00:11:25,820 --> 00:11:34,880
‫That's why we can go back into tank CP and say something like equals F rotator zero rotator zero rotator

148
00:11:34,880 --> 00:11:42,170
‫is a static member variable and you can access static member functions and variables like this by specifying

149
00:11:42,170 --> 00:11:47,960
‫the class name with the scope resolution operator and referencing that static variable or function by

150
00:11:47,960 --> 00:11:48,440
‫name.

151
00:11:48,440 --> 00:11:50,180
‫That's what we're doing here with you.

152
00:11:50,180 --> 00:11:53,060
‫Gameplay statics get world delta seconds is a static.

153
00:11:53,310 --> 00:11:59,670
‫Function, meaning we don't need an actual instance of the game gameplay statics class to exist for

154
00:11:59,670 --> 00:12:02,230
‫us to access that static function.

155
00:12:02,250 --> 00:12:04,160
‫It just exists already.

156
00:12:04,170 --> 00:12:06,930
‫Same with zero rotator and zero vector.

157
00:12:07,080 --> 00:12:14,010
‫So I'm going to close out of rotator h and we have this delta rotation and it's initialized to a zero

158
00:12:14,010 --> 00:12:14,700
‫rotator.

159
00:12:14,730 --> 00:12:20,280
‫Now your pitch and role are zeroed out just like X, Y and Z are zeroed out for the F vector.

160
00:12:20,280 --> 00:12:22,920
‫So we're going to need to change that your component.

161
00:12:22,920 --> 00:12:29,460
‫So just like I did with our delta location in the MOV function, let's create some pseudocode for delta

162
00:12:29,460 --> 00:12:30,120
‫rotations.

163
00:12:30,120 --> 00:12:36,690
‫Ya, we're going to want y'all to be set to value scaled by Delta time of course, because we want this

164
00:12:36,690 --> 00:12:42,570
‫turning to be frame rate independent, but we also need some sort of turning speed we can call this

165
00:12:42,570 --> 00:12:43,560
‫turn rate.

166
00:12:43,560 --> 00:12:49,890
‫So once we've set that, yeah, then we can add that local rotation which is going to rotate the actor

167
00:12:49,890 --> 00:12:54,630
‫according to the F rotator each frame and that ya will be scaled by value.

168
00:12:54,630 --> 00:12:59,640
‫So it'll be zero if we're not pressing any keys and it will have a value if we're pressing the DX and

169
00:12:59,640 --> 00:13:00,320
‫ax.

170
00:13:00,330 --> 00:13:02,190
‫So now you have a challenge.

171
00:13:02,190 --> 00:13:06,090
‫This is going to work just like adding the actor local offset.

172
00:13:06,120 --> 00:13:09,000
‫The only difference is we're rotating the actor now.

173
00:13:09,000 --> 00:13:14,820
‫So since we need some sort of turn rate for rotating the actor, you're going to create a turn rate

174
00:13:14,820 --> 00:13:20,550
‫variable, make this a float and put it in the private section right next to the speed variable.

175
00:13:20,550 --> 00:13:25,560
‫Expose this variable with you property and choose the appropriate new property specifiers.

176
00:13:25,560 --> 00:13:32,490
‫Now in the turn function you're going to set Delta rotation in particular, we care about the your component

177
00:13:32,490 --> 00:13:41,280
‫set the value equal to value times our turn rate variable and also multiply by delta time and then you're

178
00:13:41,280 --> 00:13:48,780
‫ready to call add actor local rotation passing in this f rotator now for the second parameter go ahead

179
00:13:48,780 --> 00:13:56,880
‫and pass in true for the B sweep input since we do want to sweep when rotating, pause the video and

180
00:13:56,880 --> 00:13:59,190
‫implement rotation for the tank now.

181
00:14:02,110 --> 00:14:02,500
‫Okay.

182
00:14:02,500 --> 00:14:04,630
‫So this is going to be fairly simple.

183
00:14:04,630 --> 00:14:07,360
‫We just need a turn rate variable.

184
00:14:07,390 --> 00:14:14,440
‫Now I'm going to go into tank just under speed and create float turn rate.

185
00:14:14,590 --> 00:14:18,640
‫Now you probably initialize this to some value and that's okay.

186
00:14:18,640 --> 00:14:24,040
‫If it's different than what I'm choosing, I'm going to go with 45 F and see how that works.

187
00:14:24,040 --> 00:14:29,150
‫But we're going to expose this to blueprints so we can change it while we're developing.

188
00:14:29,170 --> 00:14:35,620
‫Now I'd like it to be edit anywhere and I'm going to stick it in the same category movement as speed.

189
00:14:35,620 --> 00:14:41,320
‫So I'm going to go ahead and steal this you property and paste it right here above turn right so it

190
00:14:41,320 --> 00:14:42,180
‫set it anywhere.

191
00:14:42,190 --> 00:14:45,280
‫Category movement now and tank CP.

192
00:14:45,310 --> 00:14:48,190
‫I'm ready to set the yea for Delta rotation.

193
00:14:48,190 --> 00:14:50,320
‫So we're going to say Delta rotation.

194
00:14:50,650 --> 00:14:51,400
‫Yeah.

195
00:14:51,790 --> 00:14:57,060
‫And we're going to set it equal to value times, turn rate times, delta time.

196
00:14:57,070 --> 00:15:04,120
‫And of course we can get Delta time with U gameplay statics, get world delta seconds passing in this

197
00:15:04,120 --> 00:15:06,340
‫as the world context object.

198
00:15:06,460 --> 00:15:08,350
‫So I'm going to paste that right there.

199
00:15:08,470 --> 00:15:12,220
‫Now I know that my pseudocode doesn't exactly match.

200
00:15:12,220 --> 00:15:13,270
‫It's in the wrong order.

201
00:15:13,270 --> 00:15:14,830
‫Delta time is in the middle here.

202
00:15:14,830 --> 00:15:20,440
‫It doesn't matter because when multiplying three values together, you can multiply them in any order

203
00:15:20,440 --> 00:15:21,940
‫and still get the same result.

204
00:15:21,940 --> 00:15:27,460
‫So just in case you were wondering about that, the math will still come out the same if you multiply

205
00:15:27,460 --> 00:15:29,350
‫these three values in a different order.

206
00:15:29,350 --> 00:15:30,910
‫So don't worry about that too much.

207
00:15:30,910 --> 00:15:32,830
‫Now we have delta rotation.

208
00:15:32,830 --> 00:15:41,860
‫The only thing left to do is to call add actor local rotation, and we're passing in Delta rotation

209
00:15:41,950 --> 00:15:47,290
‫and for the second input we're going to pass in true to enable sweeping when rotating.

210
00:15:47,290 --> 00:15:48,670
‫So let's compile this.

211
00:15:48,820 --> 00:15:50,740
‫All right, we're compiled now.

212
00:15:50,740 --> 00:15:57,190
‫You may notice in a couple of the next videos that zero vector and zero rotator are missing from these

213
00:15:57,190 --> 00:15:57,700
‫lines.

214
00:15:57,700 --> 00:16:03,010
‫That's because I started off with these initialized and realized later that these should probably be

215
00:16:03,010 --> 00:16:05,890
‫initialized at least with zero values.

216
00:16:05,890 --> 00:16:12,070
‫So don't worry if you see these lines later looking like this on initialized, keep your zero vector

217
00:16:12,070 --> 00:16:16,690
‫and your zero rotator and you'll see that I catch this in a near future video.

218
00:16:16,690 --> 00:16:17,770
‫So don't worry.

219
00:16:17,770 --> 00:16:21,430
‫If you don't see these initialization ones, they should be there.

220
00:16:21,430 --> 00:16:23,050
‫And we're back in the editor.

221
00:16:23,050 --> 00:16:30,970
‫Let's hit play and I'm going to use the D key and we're rotating and the A key rotates me back the other

222
00:16:30,970 --> 00:16:33,790
‫way and we can also move forward and back.

223
00:16:33,790 --> 00:16:39,570
‫So now that we can rotate and move forward, we have the ability to move around the world.

224
00:16:39,580 --> 00:16:41,890
‫This is a great milestone.

225
00:16:41,890 --> 00:16:47,620
‫Now I'm moving quite slowly, but that's okay because I can select my tank and I can search for the

226
00:16:47,620 --> 00:16:53,230
‫movement category and change turn rate to something higher such as 90.

227
00:16:53,230 --> 00:16:54,760
‫So let's go ahead and hit play.

228
00:16:55,460 --> 00:16:57,630
‫And that's quite a bit faster.

229
00:16:57,650 --> 00:17:00,110
‫Now, if you think this is still a little slow.

230
00:17:00,140 --> 00:17:02,330
‫You can, of course, adjust these.

231
00:17:02,330 --> 00:17:05,570
‫So I'm going to select the -- tank again.

232
00:17:05,570 --> 00:17:08,090
‫And instead of 400, let's make it 800.

233
00:17:08,090 --> 00:17:08,720
‫Why not?

234
00:17:08,750 --> 00:17:11,840
‫Instead of 90, let's go to say 120.

235
00:17:12,260 --> 00:17:16,160
‫Now, if I press play, I'm quite a bit faster.

236
00:17:16,160 --> 00:17:18,800
‫So this is looking really, really good.

237
00:17:18,800 --> 00:17:23,390
‫So looking back at the section plan, we now have a tank that can move throughout the world.

238
00:17:23,390 --> 00:17:29,300
‫That first bullet point is definitely checked off and we're handling WASD movement.

239
00:17:29,300 --> 00:17:32,510
‫We're not handling mouse input just yet, but we'll get to that.

240
00:17:32,510 --> 00:17:35,870
‫But we're one step closer to making this game complete.

241
00:17:35,870 --> 00:17:42,170
‫So in summary, we learned what sweeping is and how we can enable that so that our objects do not pass

242
00:17:42,170 --> 00:17:43,130
‫through one another.

243
00:17:43,130 --> 00:17:49,760
‫We added an actor local rotation and we did this implementing a turn rate that we could adjust in the

244
00:17:49,760 --> 00:17:50,210
‫details.

245
00:17:50,210 --> 00:17:53,750
‫Panel in the editor to make development a little bit easier.

246
00:17:53,750 --> 00:17:54,500
‫Great job.

247
00:17:54,500 --> 00:17:56,480
‫We're now moving the tank throughout the world.

248
00:17:56,480 --> 00:17:57,770
‫I'll see you in the next video.

