WEBVTT

00:07.070 --> 00:08.150
Welcome back.

00:08.180 --> 00:12.440
It's now time to start working on our electrocute ability.

00:12.530 --> 00:17.300
Now our electrocute gameplay ability is going to be really cool.

00:17.300 --> 00:20.360
It's one of my favorites that I've created for this course.

00:20.360 --> 00:24.080
And I'm going to show you just a couple things before we get started.

00:24.080 --> 00:26.420
For one, let's go to effects.

00:27.160 --> 00:33.820
And look in the shock folder and open in s electric beam.

00:35.370 --> 00:38.220
Now here is an electric beam Niagara system.

00:38.460 --> 00:45.460
And this beam can have its start and end locations changed, and it will be dynamic.

00:45.480 --> 00:52.970
We're going to be using this beam to shoot a beam of electricity from Aura's staff.

00:52.980 --> 00:55.830
So by the end of this, it's going to look really cool.

00:56.410 --> 01:01.780
So that's the goal for now is to be able to activate this ability.

01:01.930 --> 01:06.670
In other words, we're going to need first of all to have that ability.

01:06.670 --> 01:08.860
So I'm just going to level up real quick.

01:11.600 --> 01:16.430
And I'm going to have to reconfigure things so that I can easily test this.

01:16.430 --> 01:21.470
But for now, I'm just going to get rid of these threats.

01:26.300 --> 01:27.340
Just a moment.

01:27.350 --> 01:29.450
Got to slay some enemies real quick.

01:39.760 --> 01:41.470
I'm really going to have to.

01:42.960 --> 01:44.910
Fix this so that I can.

01:45.640 --> 01:48.250
Launch these fireballs a little bit closer.

01:52.380 --> 01:52.880
Okay.

01:52.890 --> 01:53.700
Sorry about that.

01:53.700 --> 01:57.840
Let's level up our electrocute ability.

01:57.840 --> 02:00.450
We'll spend a point on it, and we'll equip it.

02:01.330 --> 02:07.900
Okay, I really should just add this to my abilities that I start off with now.

02:07.930 --> 02:12.730
Activating this requires the right mouse button, and so far it does nothing.

02:12.730 --> 02:20.140
But my goal here is to hold the right mouse button, and I'd like aura to play a start animation like

02:20.140 --> 02:28.150
start casting the spell and then be in a loop as we're holding the mouse button down and stay in that

02:28.150 --> 02:36.070
electrocute loop or shock loop until I release the mouse button, and then she can stop.

02:37.310 --> 02:41.120
So the next thing I'm going to take a look at is in assets.

02:41.120 --> 02:49.190
Characters, aura in animations go into abilities and we can see we have a couple of animations here.

02:49.190 --> 02:52.850
We have Cast Shock and this is a really quick animation.

02:52.850 --> 02:57.410
It just starts the cast and it goes all the way to this part and that's it.

02:57.590 --> 03:01.880
And then we have cast Shock Loop that looks like this.

03:02.470 --> 03:09.460
So I'd like to stay in this shock loop while we're holding that mouse button down or whatever input

03:09.460 --> 03:10.060
we're using.

03:10.060 --> 03:14.020
I'd like aura to stay in this loop during that time.

03:14.230 --> 03:22.780
In other words, there can be a boolean on aura that we can set, and aura can be in this animation

03:22.870 --> 03:24.960
when that boolean is set.

03:24.970 --> 03:30.700
So the first thing we can do is we can go into her animation blueprint.

03:30.700 --> 03:35.860
So in character Aura app aura, we can add another state.

03:35.860 --> 03:40.660
Here I'm going to move to an air down here and get that out of the way.

03:41.200 --> 03:48.190
Because if I'm an idol, I'm going to go into that shock loop.

03:48.310 --> 03:52.540
So cast shock loop here and we need a condition.

03:52.660 --> 03:56.140
So here in the event graph we can get that.

03:56.850 --> 04:01.800
And because we have a character, if a character has that boolean, we can get it here.

04:01.800 --> 04:06.990
So I'm going to give or a character's blueprint a shock loop.

04:08.940 --> 04:10.680
And this can be a boolean.

04:11.260 --> 04:12.730
So we'll call this.

04:12.910 --> 04:19.120
We'll call it in shock loop and I'll check the eye icon, make it instance editable.

04:19.120 --> 04:24.670
And from here in the Animation blueprint I'm going to add one pin to the sequence.

04:25.850 --> 04:29.420
And we're going to get our character.

04:31.340 --> 04:33.170
It's got to be the BP version.

04:34.080 --> 04:35.910
We're going to type in shock loop.

04:35.910 --> 04:39.060
We're going to get that and we'll just use this.

04:42.110 --> 04:44.600
Promote it to a variable in shock loop.

04:44.600 --> 04:45.830
And we'll store that here.

04:45.830 --> 04:48.980
And we can use that in our state machine.

04:49.220 --> 04:54.620
We can have a transition into cast shock loop using in shock loop.

04:54.620 --> 04:58.550
And the transition back out is going to be the opposite.

04:58.580 --> 04:59.720
Not in shock loop.

04:59.720 --> 05:01.490
So get in shock loop.

05:01.520 --> 05:03.020
Not boolean.

05:03.020 --> 05:05.630
And then we can hook that in.

05:06.600 --> 05:06.960
Okay.

05:06.960 --> 05:13.890
So that's the first step is now aura is capable of having that animation played.

05:14.070 --> 05:18.300
Now we also need a way to set in shock loop.

05:18.300 --> 05:22.270
And that means we should have an interface function to do that.

05:22.290 --> 05:29.130
So what I can do is I can go into my public folder, into interaction, into combat interface, and

05:29.130 --> 05:33.120
we can add a function that we can implement right there in the blueprint.

05:33.120 --> 05:36.600
It could be a blueprint implementable event.

05:36.840 --> 05:39.270
And we'll also make it blueprint callable.

05:39.270 --> 05:47.910
So we'll call this void set in shock loop with a bool input be in.

05:47.940 --> 05:52.950
We'll just call it in loop because the boolean in blueprint is called in shock loop.

05:52.950 --> 05:57.870
And we'll make it blueprint implementable event blueprint callable.

05:57.870 --> 06:01.440
So we don't have to implement it here in C plus plus okay.

06:01.440 --> 06:02.190
So we have that.

06:02.190 --> 06:06.030
Next time we compile we'll have it here in the editor.

06:06.030 --> 06:07.590
And that's step one.

06:07.860 --> 06:12.390
And after this we can start looking into our gameplay ability.

06:12.480 --> 06:18.420
So let's go to blueprints ability system aura abilities and lightning.

06:18.420 --> 06:23.340
And we have this gameplay ability electrocute which is right now pretty simple.

06:23.370 --> 06:25.560
I'm going to delete on an ability.

06:25.560 --> 06:27.030
It tends to get in the way.

06:27.030 --> 06:32.490
And in fact we can just delete everything here because things are going to be a little bit different.

06:32.490 --> 06:40.080
And the first thing I want to do is find out how we can know in this gameplay ability when we've released

06:40.080 --> 06:41.250
our input.

06:41.370 --> 06:47.880
So if we're holding the input down and we release it, we want to be able to do something well for that

06:47.880 --> 06:48.540
purpose.

06:48.540 --> 06:53.130
There's a gameplay task and it's called wait input release.

06:53.130 --> 06:55.320
And notice there's a wait input press two.

06:55.320 --> 06:56.520
So we have both.

06:56.550 --> 07:03.600
Now if I use wait input release, if I hook this up, you would expect on release to be executed.

07:03.600 --> 07:05.880
When we release the input right.

07:05.910 --> 07:07.590
We can use a print string for that.

07:07.590 --> 07:11.550
And we can say electrocute input release.

07:15.720 --> 07:18.840
And notice there's a test already released as well.

07:18.840 --> 07:23.850
So if it was already released by the time we hit this, then we can get on release.

07:23.850 --> 07:27.990
But let's see what happens if we activate the ability now.

07:28.080 --> 07:29.670
I don't want to have to level up.

07:29.670 --> 07:33.150
I also don't want to have to run away from the enemies.

07:33.150 --> 07:39.360
So for testing purposes, once again I'm moving my nav mesh bounds volume out of the way.

07:40.750 --> 07:42.160
Up to about there.

07:43.570 --> 07:48.250
In addition, I'm going to just go to a character.

07:49.240 --> 07:56.080
And in startup abilities, I'm going to add a electrocute.

07:58.570 --> 08:05.350
And since we're doing that, we have to give a electrocute a input tag.

08:05.380 --> 08:07.510
We have a start up input tag here.

08:07.540 --> 08:10.270
I'm going to give it R&amp;B for the right mouse button.

08:10.870 --> 08:18.480
And if we press play now, we have that ability and I can right click and activate it.

08:18.490 --> 08:23.080
Now there's no confirmation that we're activating the ability.

08:23.080 --> 08:31.840
So just to show that we're actually activating it, I'm going to print a yellow string that says electrocute

08:31.840 --> 08:32.860
activated.

08:35.750 --> 08:38.360
So now I can press play and right click and electrocute.

08:38.360 --> 08:41.370
Activated works at least once.

08:41.390 --> 08:44.510
We can't do it again unless we end the ability.

08:44.510 --> 08:48.470
So we can call end ability, at least right here.

08:49.400 --> 08:52.760
But notice that we didn't get our electrocute input released.

08:52.760 --> 08:53.990
I'm going to make that red.

08:54.020 --> 08:55.250
We didn't get that.

08:55.250 --> 08:56.910
So how come this doesn't work?

08:56.930 --> 08:58.390
We'd expect it to work.

08:58.400 --> 08:59.180
It doesn't.

08:59.390 --> 09:05.510
Well, there's a step that we have to go through to make sure that wait input release works.

09:05.720 --> 09:08.240
So we have to do that in C plus plus.

09:08.240 --> 09:10.610
So I'm going to save all close out.

09:10.610 --> 09:16.970
And we're going to go into our ability system component in the private folder.

09:17.000 --> 09:19.010
Let's open the cpp file.

09:20.520 --> 09:22.920
So here's Ora ability system component.

09:23.630 --> 09:25.940
And I'm going to search for input tag.

09:26.360 --> 09:30.800
And we have ability input tag held and released right now.

09:30.800 --> 09:37.340
In order for weight input release to work, we have to call a function on the ability system component.

09:37.700 --> 09:43.640
And that function is called Invoke Replicated Event.

09:44.120 --> 09:48.260
And by the way, our ability should be active if we're even doing this.

09:48.290 --> 09:55.400
If we're not, there's really no need to pass the input along to the ability if it's not even active.

09:55.430 --> 10:03.890
So here in the if statement, I'm going to place an and and say and ability spec dot is active.

10:04.220 --> 10:12.470
So if so we're going to pass that input active status along and then call invoke replicated event.

10:12.770 --> 10:14.840
Now this needs an event type.

10:14.840 --> 10:16.700
And it does what it sounds like.

10:16.700 --> 10:20.810
It sends data to the server telling it that we're doing something.

10:20.810 --> 10:23.150
And what does the server interpret that as well.

10:23.150 --> 10:25.010
It depends on what we pass in here.

10:25.630 --> 10:30.130
Now this is an ability generic replicated event.

10:30.340 --> 10:32.890
And there's a bunch of options here.

10:32.890 --> 10:35.440
But we can use input pressed and input released.

10:35.440 --> 10:38.380
So we can tell the server look we're releasing input here.

10:38.830 --> 10:42.400
Now the next input is the ability spec handle.

10:42.400 --> 10:46.210
So we need to take the ability spec and get the handle from it.

10:46.210 --> 10:48.640
That's easy ability spec dot handle.

10:49.030 --> 10:54.620
Now this is a predicted action and it needs the original prediction key.

10:54.640 --> 10:59.650
Remember that's the prediction key for when this ability was first activated.

10:59.650 --> 11:04.030
Or I should say last activated the last time it was activated.

11:04.060 --> 11:05.470
We had that prediction key.

11:05.470 --> 11:07.480
And we can get that from the ability spec.

11:09.280 --> 11:11.140
From activation info.

11:12.650 --> 11:13.940
It contains that.

11:14.710 --> 11:16.600
And in fact here's the function for it.

11:16.600 --> 11:18.470
Get activation prediction key.

11:18.490 --> 11:26.920
So now that we're invoking a replicated event for ability input tag released, we can now use wait input

11:26.920 --> 11:27.800
release.

11:27.820 --> 11:31.180
And if we want to use wait input press we got to do the same thing.

11:31.240 --> 11:36.430
So right here in ability input tag held we're doing a couple of things right.

11:36.430 --> 11:39.460
We're checking if the ability is not active.

11:39.460 --> 11:41.320
And we try activate ability.

11:41.320 --> 11:46.840
If we like we can invoke a replicated event if it is active.

11:46.930 --> 11:50.440
Of course we don't really want to do this every frame.

11:50.440 --> 11:58.720
So instead of having just a held and released, we could also have a pressed simply for invoking replicated

11:58.720 --> 11:59.530
events.

11:59.530 --> 12:02.280
And that way it only happens once when pressed.

12:02.290 --> 12:08.470
So if we go into the player controller or a player controller.

12:08.990 --> 12:13.100
We know when ability input is pressed.

12:13.130 --> 12:14.490
That's right here.

12:14.510 --> 12:20.090
So we can let the server know here that input has been pressed for the first time, and it won't be

12:20.090 --> 12:23.330
spammed, because this is just a one off here.

12:25.160 --> 12:29.000
So we can make an ability input tag pressed.

12:29.150 --> 12:32.720
It'll be just like the held and released versions.

12:38.540 --> 12:39.800
So here it is.

12:40.900 --> 12:47.260
We can create the definition for it, and we'll do the same thing that held is doing pretty much.

12:48.180 --> 12:49.890
Minus a couple things.

12:49.890 --> 12:52.030
We'll make sure the input tag is valid.

12:52.050 --> 12:54.470
We'll get our activatable abilities.

12:54.480 --> 12:57.690
We'll find the one that has this input tag.

12:57.720 --> 13:02.170
By the way, in all of these, we could just break out of the loop when we're done.

13:02.220 --> 13:10.080
Once we find the ability with the tag, we can go ahead and pass along the input press status here and

13:10.080 --> 13:14.250
we can check if the ability spec is active when we press it.

13:14.280 --> 13:20.640
The only point in invoking a replicated event for input pressed is if we're pressing input while the

13:20.640 --> 13:22.380
ability is active.

13:22.530 --> 13:27.870
So if it is, we'll go ahead and invoke the replicated event just like we did here.

13:29.120 --> 13:35.090
So we'll say invoke replicated event E ability generic replicated event.

13:36.080 --> 13:38.210
We're going to choose input pressed.

13:39.070 --> 13:41.440
We need to pass in the ability spec handle.

13:41.440 --> 13:43.920
So get ability spec dot handle.

13:43.930 --> 13:47.650
And we also need that activation prediction key.

13:47.920 --> 13:51.960
So that's on the ability spec activation info.

13:51.970 --> 13:53.410
So here's the spec.

13:53.530 --> 13:55.510
Here's activation info.

13:55.510 --> 13:58.330
And then here's get activation prediction key.

13:59.590 --> 14:00.700
And there we go.

14:00.730 --> 14:05.620
We know that ability input tag pressed is only called once every time we click.

14:05.650 --> 14:08.230
So we can check if git ask.

14:10.830 --> 14:15.420
Then get ASC ability input tag.

14:17.660 --> 14:18.470
Pressed.

14:19.540 --> 14:21.430
And we can pass in the input tag.

14:23.240 --> 14:30.260
So now we're sending replicated events for when we press and release and ability tasks like wait, input,

14:30.260 --> 14:31.790
press and release should work.

14:31.790 --> 14:33.950
Now let's test that.

14:37.290 --> 14:39.660
All right, let's get that ability back open.

14:39.660 --> 14:41.640
And first we'll try the release.

14:41.640 --> 14:43.440
So I'm going to right click.

14:43.440 --> 14:51.600
And as soon as I release boom we get our print string and it's pink and we can see it and it's great.

14:51.780 --> 14:54.510
Now let's try the pressed version.

14:54.510 --> 15:00.600
And for that, as soon as we release I'm going to start a timer.

15:01.420 --> 15:03.220
Let's do a delay, actually.

15:04.930 --> 15:05.890
They're easier.

15:05.890 --> 15:09.190
And we'll wait for 10s.

15:11.590 --> 15:13.510
And then we'll end the ability.

15:13.510 --> 15:14.740
But here's the thing.

15:14.770 --> 15:20.710
Immediately after weight input release, I'm also going to use a weight input press.

15:22.110 --> 15:25.110
And on press, I'm going to print a different string.

15:26.600 --> 15:32.540
And it's going to say input press and this can be a different color.

15:32.720 --> 15:33.920
Let's make it purple.

15:35.740 --> 15:38.580
So we can press the input.

15:38.590 --> 15:39.850
We'll see the yellow.

15:40.430 --> 15:44.030
And then when we release, we should see the pink.

15:44.030 --> 15:51.260
And when we press again, at least until the ability is ended, we should keep getting the purple.

15:51.260 --> 15:52.340
So let's see if that works.

15:52.340 --> 15:55.310
I'm going to right click release and press.

15:57.950 --> 15:59.660
Now I can only do it once.

16:00.820 --> 16:02.740
And let's check test already.

16:02.740 --> 16:03.460
Press.

16:06.190 --> 16:09.730
Notice that I got it right away because it was already pressed.

16:09.730 --> 16:11.130
It was pressed right away.

16:11.140 --> 16:14.020
So if test already pressed is checked.

16:16.300 --> 16:18.940
We get that message immediately.

16:18.970 --> 16:25.240
Same goes for weight input release, but we would just see the same result there as it was not released

16:25.240 --> 16:26.080
yet.

16:26.260 --> 16:30.490
But this is how we can wait for input to be pressed and released.

16:31.700 --> 16:37.310
And we can just prove to ourselves that this ability input tag pressed is not being spammed.

16:37.310 --> 16:42.500
And we're not spamming a replicated event here by placing a couple of breakpoints there.

16:43.330 --> 16:50.800
And we can press play and we'll see that it isn't until I click that we get ability input tag pressed.

16:53.710 --> 16:55.390
So here we are.

16:55.420 --> 16:56.170
No break points.

16:56.170 --> 16:57.520
And then I'll go ahead and click.

16:57.850 --> 16:58.720
And we get it.

16:58.720 --> 17:00.400
So it's a one off.

17:02.150 --> 17:03.860
So no spamming there.

17:05.820 --> 17:10.910
Okay, so now we know how to wait for input, press and release.

17:10.920 --> 17:16.020
This is great because this is going to be pivotal for us in our electrocute ability.

17:16.470 --> 17:17.160
All right.

17:17.160 --> 17:22.680
So before we wrap up and move on, I'd like to do something about those fireballs being a little too

17:22.680 --> 17:24.240
hard to use at close range.

17:24.240 --> 17:27.570
And speaking of those fireballs, there's another thing I noticed.

17:27.570 --> 17:34.770
It's a little hard to reproduce, but if you can manage to get a projectile that does not explode,

17:34.770 --> 17:37.290
which with homing projectiles, it can happen.

17:37.290 --> 17:39.300
They can float around in the air there.

17:39.300 --> 17:45.780
I noticed that when that happens, after their lifespan has elapsed, the sound will keep going and

17:45.780 --> 17:54.210
we can fix that by coming into the on hit and make sure to destroy the looping sound component on hit

17:54.210 --> 17:57.210
so we can call destroy component on it.

17:57.210 --> 18:02.430
But also we need to do that and destroy it as well.

18:02.430 --> 18:09.900
So we'll just go ahead and stop and destroy the sound component here regardless of whether we got a

18:09.900 --> 18:10.500
hit or not.

18:10.500 --> 18:18.210
Because if the projectile dies due to its lifespan expiring, we'll go ahead and just stop that looping

18:18.210 --> 18:19.410
sound then too.

18:19.860 --> 18:21.870
Okay, so that's the first problem.

18:21.870 --> 18:28.890
And the other is of course, being a little bit too difficult to hit those enemies when they're close.

18:28.920 --> 18:35.190
Now that's something we can easily fix if we go into GA Firebolt, because we made homing acceleration

18:35.190 --> 18:42.540
min and max parameters, and we can make these a lot higher, say 6000 507,800.

18:43.670 --> 18:50.180
This means those projectiles will arc onto their target location much faster.

18:50.880 --> 18:53.150
They're much less likely to overshoot.

18:53.160 --> 18:55.470
So if we go close.

18:57.840 --> 19:03.840
Well, I'm getting knocked back like crazy, but we can see that it's a lot easier to hit them when

19:03.840 --> 19:04.590
close.

19:05.040 --> 19:06.060
Oh, I died.

19:12.510 --> 19:14.400
So yeah, that's a lot better.

19:22.020 --> 19:22.500
Yes.

19:22.500 --> 19:23.310
Much better.

19:25.130 --> 19:28.130
And we can test with a little upgrade as well.

19:36.740 --> 19:39.080
And of course these are not responding.

19:39.080 --> 19:41.600
These don't block the visibility channel.

19:41.630 --> 19:43.880
They do block the projectile.

19:50.860 --> 19:57.310
And if we try to fire a projectile out into space, well, that's not actually going to work because

19:57.310 --> 20:01.200
these blocking volumes don't block the visibility channel.

20:01.210 --> 20:05.840
But if they did, we could fire a projectile out into space.

20:05.860 --> 20:12.280
So if we just highlight those blocking volumes and get their collision settings open.

20:12.870 --> 20:15.060
Their presets are set to invisible wall.

20:15.060 --> 20:21.180
If we set it to custom and we block the visibility channel, we're going to ignore the camera as well.

20:21.210 --> 20:25.260
Then we should be able to go ahead and click on them.

20:25.260 --> 20:33.450
We just have to be careful because this one here might block the visibility channel if we're out here.

20:39.440 --> 20:39.980
Yeah.

20:39.980 --> 20:42.200
So it's blocking the visibility channel here.

20:42.200 --> 20:48.710
And this is actually a good opportunity to see when they expire and make sure that sound goes away.

20:48.710 --> 20:49.610
So let's listen.

20:54.640 --> 20:55.210
Excellent.

20:55.210 --> 20:57.340
So we took care of the sound problem.

20:57.340 --> 21:07.240
But the problem now is that when we click, since this is blocking the visibility channel, we're clicking

21:07.240 --> 21:12.190
and getting a hit here, we can prove that by moving this down and out of the way.

21:16.380 --> 21:18.030
And now if I shift, click.

21:18.300 --> 21:20.970
Now it's behaving as expected.

21:22.450 --> 21:24.550
So we have an issue, right?

21:24.580 --> 21:29.200
We want our line trace under the cursor to work.

21:29.200 --> 21:29.500
Right.

21:29.500 --> 21:31.120
We want to be able to do this.

21:34.120 --> 21:37.810
Of course, we're actually making a homing target right there, too.

21:37.840 --> 21:40.330
So maybe that's not what we want.

21:40.660 --> 21:47.650
I suppose a good compromise would be to make these also block the projectile channel, or at least overlap

21:47.650 --> 21:51.130
with them and generate overlap events.

21:51.280 --> 21:54.310
At least then our projectiles would explode.

21:55.370 --> 21:57.230
Right, like an invisible wall.

21:57.250 --> 22:00.410
That's probably the best solution here.

22:00.430 --> 22:03.400
And of course, just not have one here.

22:03.760 --> 22:10.390
I think we're going to have to have a distinction between the blocking volume that's going to be in

22:10.390 --> 22:11.590
front of the camera.

22:11.590 --> 22:18.790
In other words, the one on this side, every time we place one in a dungeon and the others.

22:18.940 --> 22:25.090
This one can just not block the visibility channel.

22:28.330 --> 22:30.850
So we'll take visibility and ignore it.

22:31.680 --> 22:37.800
But it can block the other channels such as -- and world static world dynamic, so it'll prevent these

22:37.800 --> 22:41.480
enemies from flying out of it, including aura herself.

22:41.490 --> 22:50.760
But it will not block visibility, so we won't be able to accidentally launch a fireball up there.

22:50.760 --> 22:57.440
And that's okay, because we're never actually going to be facing the other direction, right?

22:57.450 --> 23:02.760
This is like the side on a movie set that nobody in the audience sees.

23:02.760 --> 23:08.580
So that's okay if this one doesn't block visibility, I think that's the best way to go.

23:09.430 --> 23:16.840
And we'll just keep it so that if we launch something out there, well, then we'll just go ahead and

23:16.840 --> 23:18.740
explode that projectile.

23:18.760 --> 23:23.350
The only alternative would be to have a second blocking volume way, way out.

23:23.380 --> 23:28.000
That would block the visibility and projectile channel.

23:28.000 --> 23:34.390
And that would be only for our hits under the cursor for launching projectiles.

23:34.390 --> 23:41.290
And then these ones closer in would be for the enemies and anything that's flying around that had been

23:41.290 --> 23:42.160
launched.

23:44.660 --> 23:46.130
I'd rather not go through the trouble.

23:46.130 --> 23:51.830
I think I'm okay with projectiles exploding on the invisible walls, and that's how I'm going to handle

23:51.830 --> 23:52.220
it.

23:52.340 --> 23:56.810
I'm also going to take these blocking volumes and just put them in their own folder.

23:56.900 --> 24:02.810
So I'm going to move to and create a new folder and rename the folder.

24:05.380 --> 24:07.090
Two blocking volumes.

24:09.780 --> 24:13.560
That'll make things a little bit easier to organize.

24:13.560 --> 24:18.420
So we have the dungeon meshes, we have the blocking volumes, we have the lighting.

24:18.570 --> 24:24.270
Here's all of our enemies and then a few miscellaneous things.

24:24.270 --> 24:27.210
And that makes the level a little bit more manageable.

24:27.510 --> 24:27.930
All right.

24:27.930 --> 24:28.770
Excellent job.

24:28.770 --> 24:30.570
And I'll see you in the next video.
