Transcripts
1. Introduction: What I love about video
games is you can create interesting puzzles
for other people to explore and solve. Hi. My name is Lucas Ridley. I'm a game developer
and 3D animator working in the video
games and film industry. You may have seen
some of my work if you've played video games
like The Last of Us, Part II, or Suicide Squad:
Kill the Justice League. It's wild to me that I get
to do this as a career. I think it's most kids' dreams to play video games
for a living. In this class, you're
going to learn how to create an
entire video game. We're going to start
with a cinematic that blends into gameplay, where we can create game
logic that shows a timer, creates obstacles for our
character, and then finally, we can export this entire thing so you can share it
with your friends. I'm excited to teach
you about this topic, because creating video games is actually quite accessible. Not only do you have free
software like Unreal Engine, but you can do this at
home on your own computer. You should take this
class if you have intermediate knowledge
of Unreal Engine. I'm not going to lie,
we're going to jump into the deep end of Unreal Engine, creating game logic
with blueprints. To follow along, all you're going to
need is Unreal Engine, a computer, and a
three-button mouse. At the end of this
class, you're actually going to have a finished
video game that you can share with your
friends and compete with them in a time
to obstacle course. I hope you walk away
from this class really leveling up your skills and feeling a sense
of achievement, because we're really
going to create something impressive together. Want to play a game?
Let's get started.
2. Getting Started: Welcome to this class.
I'm so glad you're here. In this project,
we're going to create a playable timed video game. It's going to be one that you can share
with your friends, so you can compete with them through this timed
obstacle course. So we're going to
create a timer through game logic that can
appear on screen. So you can compete with your
friends and compare scores. We're going to create obstacles
to make that difficult. So if you run into them, it'll actually simulate
Ragdoll physics on your player and restart the level, so you
can start over. At the end of this class, we're going to export this as a complete playable video game. My first job in the
video game industry was actually on an augmented
reality video game, where we would take a book with tracking markers and that was the actual game
controller for the game and you can manipulate
the players on that book. My job on that project was actually bring
those characters to life through animation on the pages of that
augmented reality book. I didn't even know Unreal
Engine at the time. So if you finish this class, you'll already be ahead of me. I'm going to give you
some great skills that can further your career
in video game design. To take this class, you should be comfortable using
unreal engine, navigating around the viewport and even just knowing that
blueprints are a thing that exists is going to be helpful because
we're going to dive in a lot deeper and create our own blueprints from scratch. So grab your computer,
your three-button mouse and meet me in the next lesson, where we're going to
create a player start so we have somewhere to
begin our video game.
3. Create the Player Start : In this lesson, we're going to cover how to
create a Player Start from scratch if you've created
your own custom level, and we're also going
to do a little bit of debugging so we can
improve our frame rate. Back inside unreal engine, I'm going to start with
a level I've designed. If you haven't
followed along with the other classes and
designed your own level, you can use the third
person template project and use that level that
comes with that template. That level has a
Player Start already, but we'll need to create one if you have your own custom level. Because if I hit
"Play" right now, my playable character will
spawn wherever the camera was. Then I could potentially just be outside the actual game, and I can't get in because it's dependent on the
camera that I used. I'm going to hit
"Escape" to get out, and I want to place
the player start where I want the actual game to begin. I'm going to do it
where I created the introductory cinematic
that will come to later, and I want to match the
position with my player start. I'm going to add the
player, start by clicking the plus button up
here and typing start. You can see we have
a Player Start, and because there's
nothing else in the scene, this will automatically start the player where we want them. I want to match the
position of the cinematic. I'm just going to hit "W" and move this out of
the way for the moment. I'm going to click the
cinematic and get its position by right clicking this
value and choosing "Copy." And then I want to choose
the Player Start again and pasting this value by
right clicking and paste. We can see through the
floor a little bit. I'm just going to lift
it up a certain amount, and then I'll hit "End"
button on my keyboard, E-N-D, and that will
snap it to the floor. Then I just want to rotate
it because we're going to see the blue arrow is
pointing off to the side. I wanted to point
in the direction of the maze that I've
created in my level. Now if I hit "Play", we can see that the
players start will begin exactly where we're expecting
to in that position. Now, if you can tell one thing, it's that the playback
is very slow. The frame rate isn't great, and we can test that by
turning on frames per second. We can choose this
Hamburger three line icon here and go down to show FPS, which is short for
frames per second. When I click that, you can
see in the top right here, we have 18 frames per second. I can also press "Play again" and that frames per
second should persist. We can see it's even worse
when we're playing around. Ten, 11 frames per second. Now, one of the reasons for
this in my scene is because of the very high definition trees we have
in our environment. If you follow the
environment class, you know where this asset lives in this procedurally
generated forest. I'm going to swap this out for a lower resolution asset so that we can work
much more quickly. This is called debugging. We want to debug our game as we play and solve any problems
we're facing as we go. Because solving this
right now we'll make everything faster later on while we're working
in the scene, which will accumulate
to a lot of time saved. I'm going to hit
"Control space bar", and I'm going to
navigate to where this asset is in my
procedurally generated folder, and I'm going to open
up the PCG graph where this asset is. Now, again, if you're using the template level,
you won't have this. This is for the
people who may have followed along with
the earlier class. I'm going to spawn a
different static mesh here, so I'll replace the
high resolution trees with a lower resolution one. I'm going to drop
down this descriptor, and this is where the static
mesh of the tree lives. I'm going to choose an asset that comes in with
the PCG assets. I'm going to type in tree, and I can see that there's
these PCG placeholder trees, which are much more
lower resolution, and that's what I'm going to use instead of the high resolution. We can see it's
already swapped in, and watch what happens to
our frames per second. We're already up to around
30 frames per second. Now, the other thing
I could do is I could reduce the number
of points as well, so I could choose the
surface sampler and instead of 0.08 points
per square meter, I could choose something
half that much, so 0.04. We can see we really
didn't gain that much, so I'm going to leave
it back at 0.08, but this is the kind of
testing you want to do to make sure that the game that you're
making is performative. Now in I press "Play", you should get a much
smoother playback, and we've gained a lot
of frames per second. In this lesson, we learned how to create a
player start from scratch in case you have your own custom
environment you've made. If you don't, you can just use the third person
template project and use the Player Start that
already exists in that level. The one thing to keep in
mind is if you do want a cinematic to start at the
beginning of your video game, then you just want
to make sure that Player Start lines up exactly
with that level sequence. Meet me in the next lesson,
where we're going to connect our custom
playable character.
4. Connect Custom Playable Character: Welcome back. In this lesson, we're going to cover
how to connect our custom MetaHuman character with our third-person
playable character. Let's get back into our
project and get started. Now I want to swap our own
custom MetaHuman character for the third person. We've covered this
in an earlier class, but I'm going to
cover again here so we can quickly
get up to speed on our own custom
MetaHuman character as the playable character. I've already shown how
to migrate characters from other projects where
we may have made them. All you need to do is
"Right-click" an asset and choose Asset
Actions, Migrate. Then choose the project you
want to migrate this to if you have a MetaHuman
from a different project. We've already done that, and
that's why this exists here. Now all I need to do is set up this character
to be playable. I need to go to the
Class Settings and choose third-person blueprint
as the parent class. The third-person character has a lot of logic already set up, so we can just use
this in all of its animations just with
our own custom character. Now I'm going to choose this. I'm going to go to the Viewport, so I can see what's happening, and I can see that
my character and the third person are
in the same scene now. Now I can move this root, click and drag it
under the mesh, and now I can reset the root, so that should match up with
the third-person character. We're all facing the
same direction now. I'm going to retarget
this custom character onto the animation that's
happening for the third person. I can do that by turning
on live retarget. I can choose the live
retarget variable and check on
UseLiveRetargetMode. Now I can see these line up, and I just need to make the third-person
character invisible. I can click on its mesh
and search for visible. I can turn off visible
and rendering. I need to turn on always
tick pose and refresh bones. We'll update the
character in real time. Now I can click
"Compile" and save. I want to open the third-person blueprint and copy and paste all the game logic and inputs
that we don't have here. Because if I look
at my event graph, which controls all
the game logic, there actually isn't any. There's nothing that says, hey, if I press this
button, then do this thing. It's just totally empty here. We have some AR and face stuff, but there's no actual inputs that are happening that
makes this playable. I want to open up
the third-person blueprint where that lives, and copy and paste
that information here. We can just steal all of that hard work that
they've already done for us. I'm going to "Double-click"
this blueprint, and I want to click and drag, select all of this information, and I want to copy and paste
it by hitting "Ctrl C", jumping back to my
blueprint and hitting "Ctrl V" in an empty area
to paste it in. So Ctrl V. Now we have all this information that they've done all the
hard work for us. Now we just need to say
when this begins playing, then cast and start doing all of the input mapping
that we want to do. I can just delete this
CustomEvent and use this event, BeginPlay, and map this into our casting onto our
playable character. Now I can compile and
save this blueprint, and now I just need
to tell my game to actually use this character, because if I press "Play" now, it's still using the
default character. To change this, I need to go to my Project Settings under Edit, Project Settings, Maps & Modes. Under the selected game mode, I need to change the
default pawn class. I can choose the
third-person game mode, and then it will
allow me to change the blueprint that we're
spawning the character as. I'm going to do BP_, and now I can find my
blueprint for my MHI_Lucas. Now when I close this
and press "Play", we should see our own
custom character, and they should be
playable by hitting the W, A, S, and D keys. As well as the jump input, you can hit "Spacebar".
Now it's your turn. Take your own custom
character and map them onto the third-person
playable character, or just use the
third-person character and hit "Play" and play around. Just remember, it's
always important to take advantage of any work
that's already done for us, and so that's why we're
going and finding things in the starter content and
copying it and pasting it. There's no shame in using work that's already
done for you. Meet me in the next lesson. We're going to create a new
state machine for crouching.
5. Set Up a State Machine: Welcome back. In this lesson, we're going to cover animation blueprints and state machines. State machines are a way
that we can transition from different states on our
character like standing idle, walking, running, and we're going to add crouching
in this lesson. It's important to know
that state machines, although its own thing, actually live inside the
animation blueprint. So, that's where we're
going to be working. Now let's get back
into our project. This lesson will give
you insight into how to create a crouch animation
for our character. So, let's imagine we have
some kind of obstacle that we actually need to crouch underneath to be able to
push one of these blocks, but we can't crouch yet. So, we need to create a crouch input so that
our character can crouch, and then push this block through to get past this
barrier in the level. So let's start that now. To begin, we need to add
an input action so we know what keystroke actually
will enable crouching. So I'm going to jump to
the input actions for my third person character
because that's really what is controlling our custom character is the third person
parent blueprint. So here we see we have
a folder called input. Inside of here, we have
this master default, which is input mapping context. This is the main group that's going to control the actions. We need a new action
called Crouch. You can see we have
jump, look, move, and we can add
whatever other kind of actions that we want
to begin to enable. And in this example, we're going to enable a new
Crouch action and input. So I need to create
an input action. So I'm going to go to input and input action by right clicking and
choosing this option. I'm going to choose I
A for input action, and I'm going to
call this Crouch. Now when we go to this kind of master data asset of
the input actions, we can have a new mapping
for the Crouch here. So I can hit the plus button and then choose Crouch
from the menu. Now in this option, this
is where I get to add what key strokes I want
this to be added to. So I can choose from
the options here, or I could just click
this button and then hit the actual keyboard
button on my keyboard. So I'm going to choose
left control because we're using a W A S and D setup. So, let's hit Save. And now we've enabled it
to receive that input. Now we just need to connect that input up to
all the events and logic to play the
correct animation and change the character
components to Crouch. So we need to go to the
blueprint for our character, which for me is the meta-human,
this custom character. For you, it might
be the third person in character if you're
choosing to use that. So now in the event graph, this is where we need to
add our own input action. You can see we have
look, we have move, we have jump, and we need to
add the crouch input action. But before we do
that, we need to tell the movement component that
we can actually crouch. So it has the
variables and things that we're looking
for when crouching. Because crouching is
a normal thing to do. This is actually
already available to us in the character
movement component, which is where all
of these kinds of playable character values
that we're interested in, like how fast we move,
what gravity is like. And so if we start typing in
and searching for crouch, you can see that
we actually cannot crouch until we check this on. This will make some built in
functions available to us, so it knows to trigger
crouching on and off. You can also change the speed that you're moving
when you're crouched. And also the height you're
going to when you're crouched. So I'm going to check this on. And now in my event graph, which tells all the logic of the inputs and what
they're going to enable. Just like the jump here,
whether we're jumping or not, we need to create an
input action for Crouch. So I'm going to
start typing Crouch, and that should
exist because we've already created this
input action event. So we want the event
and not the value, and we can choose
started and completed just like our event for
the input action for jump. So for started, we actually have this built in function
called Crouch. And that's why we're
enable crouching. So we have this
variable available to us before we began this step. So I'm going to click and
drag off of completed and typing Crouch again and choose Un Crouch for
when we're completed. And that's all we
really need to do. If we want to comment this out, just like these other ones, we can hit C, and we
can type crouch input. So now we just need
to compile and save, and we should see those
movement component aspects already affect our character. Like the Crouch speed
will be affected, even though it won't have
any animation to play yet. If I'm running and hit Crouch
or the control button, we'll actually just slow down. But we don't actually have
a crouch animation yet, and that's what we'll
need to adjust. So let's create the animation that we actually need to crouch. In this lesson, we
learned how to begin creating a new input
action for our character, so we'll be able to crouch. We ended with seeing that
it can affect our speed, and we just need to insert
the right animations now. Let's do that together
in the next lesson.
6. Finish Your State Machine: Welcome back. In this lesson, we're going to
continue to create our Crouch state machine. We're going to take
our input action that we've already made
and connect it up to an animation for crouching
idle and crouching walk. Then we're going to affect the speed at which we're
moving while crouched walking so that it syncs up with the speed that
our feet are moving. Let's dive back
into the project. Let's create the animation
we need to actually crouch. Luckily, for us, if we go into the Epic Games launcher
in the marketplace, and we search for
MCO Mocap basics. We actually have
a free asset here that has a Crouch
animation for us. Just search for the asset, and you can add it
to your project. Once it's added to your project, we can find these assets in the content browser
by going to content, and you can see a
new folder has been created called MCO Mocap Basics. Here we can find a
Crouch animation. I can just search for it in
the content browser here. You can see we have a couple different walk Crouch and idle. We basically have
an in place version and a walking off
the spot version. We want the in place version. I'm going to select the in place Crouch and in place walk, and I want to right
click and choose retarget animations because this is on an old Mannequin skeleton, and we want to retarget to
the new Mannequin skeleton. I'm going to type in Manny. Now you can see we have the
new Mannequin Skeleton here, and we can search for these
assets just by typing Crouch. If we double click it,
we can see that we have the one that's
walking off the spot. But we want the one that's
walking on the spot. Let's choose these two and
export these animations. In this MCO Mocap basics, I'm going to create a new
folder called retarget, and I'm going to right
click and choose New Folder and put it in
the retargeted folder. Now, the character
blueprint is where we told it where the
input action was. We did that on our blueprint
for our character. But where do we actually
add the animations? That's on the animation blueprint
and not this blueprint. We need to find the
animation blueprint. If I double click ours, you can see that the
animation class here is Anim Blueprint queen C, and I can browse to this asset, and I can double click it, and that is actually a
child of the Manny one. We actually want the Manny animation
Blueprint and not the queen. If I click on this
Parent class here, I can find that in
the folder as well, which is right next to the
queen and double click it. You can see we have
the event graph for the Animation Blueprint. This is different from
the character blueprint, which we just added
the input action. This is where we tell the
variable for crouching, whether we are crouching
or are not crouching, so that it knows what
animation to play. To do that, we need
to connect it up to the movement component,
which we already have. I'm going to copy
and paste a version of it here and click
and drag off of this. I'm going to type
in is crouching. You can see we already
have the variable for this because we enable
the ability to crouch. It already has this
built in variable. If I right click this, I can
promote it to a variable. We can access it in the
state machine to set this as a rule of whether to play the crouching animations or not. Now, it's not connected
up to anything, so we need to add a new
pin to this sequence, which is what updates
the values on every frame so that it can figure out if some
state has changed, like falling or
crouching or moving. We need to add this
new pin here so that we can connect it up to this new variable that we have. I can double click
anywhere on this line to create a reroute node, and if I hold Control, I can move it out of the way. We can stay a bit
organized here. I can also click and
drag these and hit C to comment and move this down. Now that we finally have
the input actions created, we have our animations ready, and we've created an
ability to see as a variable whether we are
or are not crouching. I can rename this to Crouching. Now we're ready to
actually connect the animations to
the locomotion. We can find that
in the anim graph. Right now, we're in
the event graph, which you can see in this
hierarchy directory here. I can jump over to
the Anim graph tab here or I can click
it from here. In the anim graph, we can actually see the state machines, which controls what
animations are being played. The one that we're
most concerned with is the locomotion state machine. If I double click it,
I can go inside of it, and I can see that there's an idol and there's a walk run. That's mainly the two things we can do with this character. You can see right
now it's previewing the idol animation here
in the left window. We want to add another
state called Crouching. I can right click in here
and add a new state. I'm going to call this
Crouching and it inner. I can double click
and get inside of this and now I can add
my animations here. We have two animations, one for if we're not moving, and we're just idly crouching, and one for crouching
while we're walking. I'm going to click Drag both of these animations into
the state machine, and I need to tell it when are we idle and when
are we walking. That's why we have
these variables to tell us if we are moving or
if we are not moving. That was already set
up in our event graph. Back here, you can see there was one RD setup called Should move. We can use this to know
whether or not we are crouching idle or
crouching walking. We need to blend between these two based on that variable. I can grab this variable
by saying get should move, and this will control which one of these animations
we're playing. We need another node
to determine that, and that is a blend by Boolean, which means either or, either it's on or it's off, so we can type in
blend poses by Bole, and now we have a true
pose and a false pose. It's going to get controlled
by an active value. The true state is
going to be walking, so we can plug that into true. We can plug the idle state, the idle animation into false. What's going to control
that is this variable here. Whether we should be
moving or shouldn't be is going to be
the active value. Now, we plug this
into the result. Now we go back to
our locomotion. We just need to create a rule
for when this is happening. When are we crouching? It's when the
variable that we've created is crouching is enabled, based on whether or not we're inputting the correct keystroke, which we've entered
in as a control as the input action earlier. All that's already set up. We just need to set the
rule for this variable. I can click and drag on this box and point
it to crouching. I can go from aisle to crouching now with the rule I will set. I can go from crouching back
to idle with another rule. Going from aisle to crouching, I want to double click Here. Get this variable is crouching. If we are crouching, we want to go into the crouching animation. Now, if we aren't
crouching anymore, we can just set that
rule to go back to idle. We want to say get
this variable again, but trigger this transition
if this is not happening. We can type in not and choose
the Boolean in option. Now we need to do the same thing for the walk run transitions. Walk run to crouching should be happening
when we are crouching. We should exit this
crouching state back into walk running
if we are not crouching. Now that we've created
the rules for crouching, we've created the animations and when they're going to play, we can hit Compile and save, and we should be able to see our character able to crouch. Now let's play and try it out. Now to hit Control, I'm
able to crouch down, and you can see I'm moving, but the crouch stops moving because we didn't turn on loop. We can jump back into
our animation blueprint, which we can get to
in our Mannequins, animations and Manny
in the crouching tab. We need to make sure that
the walk is set to loop. We can type in loop to find it, and we just need to
turn on loop animation. Let's compile and save. Now you can see it actually
loops while we're cuing. But we're moving a lot
faster than our feet are. If you remember, we can
adjust the crouch speed, so it matches more closely with the animation and how fast
the feet are actually moving. Let's jump into the character movement component
in our blueprint. I'm going to go into the
metahumans blueprint. I'm going to go to the
character movement component where we turned on Crouching. If I search for Crouch, I can see our Max walk
speed for Crouch is 200. Let's reduce that by half, compile and save,
and test this speed. We'll hold down Crouch
and move forward. Now you can see we're
moving a lot more closely to how fast our feet are actually moving
in the animation. It's still sliding a little bit, so I'm going to go back in and keep tweaking this value until I like how it matches up with the actual animation
that we have to play. Now we've created the ability to actually crouch under
obstacles that we create. Now, we just need to
make sure that we create these at a height that makes
sense for our character. Now, if the speed is too abrupt, we can adjust that in
the blend settings of the transitions. Let's
see how to do that. We just single click this, and we can see that there is a duration of a blend
of 0.2 seconds. We can increase this
to something like 0.5, and we can do that
for both directions. Now we've doubled the
amount of time it takes to go between each state of
crouching from the walk and run. Now I want to hit play. We can run and then crouch. Takes a lot longer for that
transition to occur now, and so hopefully
it's not as jarring. One final setting we can adjust is the camera pops
when we crouch, pops from the height
of our characters head and then jumps down to
our crouch character head. We can turn on a lag that will blend the
camera more seamlessly. Let's open up the
characters blueprint and go to the camera boom and the
components tab window. You need to stop
playing so we can actually access these functions, and we can scroll down
to enable camera lag. If we just enable this, the default settings
work pretty well. We can adjust these
settings if we want, but we can hit compile and save, and we can get back to playing and test the new camera lag out. Now it blends much
more seamlessly, and it also has a little bit of lag when we're
doing other things, but it works pretty well for solving the Crouch camera issue. In this lesson, we covered a
lot of complicated material. Congratulations for
following along. You've learned how to
take an input action and actually implement it. We retargeted animation,
and now we have a brand new state
for our character to be in, which is crouching. Feel free to replace those
animations that we used with some other animations
you find on the marketplace or elsewhere. Go in and really
tweak those values. You know, we changed
the blend animation to be from 0.2-0.5, but maybe there's a
better value there. Play around with
those values and make it as seamless as possible.
Have fun with it. Met me in the next lesson, where we're going to connect the cinematic to the
game play start.
7. Connect Cinematic to Gameplay Start: Welcome back. A big note for this lesson is the fact that
you'll want to have watched a previous class in
this series where we learned how to animate our
character in a level sequence. Where I start here, I already have that level
sequence created. If you don't know how to
make a level sequence, jump back to one of my
previous classes in this series where we learned how to create a level sequence. That class is all about
character animation. Now that that's out of the way, we're going to grab
our cinematic, and we're going to seamlessly
blend it into gameplay. When we start our video game, we can actually watch
a cinematic playout and then it will seamlessly blend so that the player
can actually take back control of that same character
and begin the level. Let's dive back
in. Let's imagine when we hit "Play" on our game, we want to actually see
a cinematic play first. I've created a level sequence, which I discussed how to
create in that previous class, and in that level sequence, I can open it up to
see the animation. I'll click "Open
level sequence", and we can see there's
immediately a couple of problems. One is my character
is through the floor, and when I scrub the
level sequence timeline, there's no animation
actually playing. We can solve these
problems one by one, and then bind this cinematic
to play exactly when we play our game and then seamlessly blend into the
gameplay animation. Let's first solve some
of these problems. The first one being,
I want this character that I brought in to
match the player start. I can select the player start, and I can copy
these attributes in the details panel for
the transform location. Then I can click the
character themselves and then paste that in by right
clicking and choosing paste. Now I just need to get
the orientation correct. By clicking the Player start, I can see that's a positive 50, I just need to go select the player and go
positive 50 as well. Now these are matching
the same orientation and direction of where the player
is actually going to start, as well as the level
sequence character. Those should match up when we blend in and out of the
cinematic to gameplay. The other issue is, I can't
see the animation playback, and that's because we've turned on livery target
for this character. Well, the character
we're looking at here is actually the spawn class
version of this character. It's a spawned version of our playable character
of our blueprint. In that blueprint, we
turned on livery targeting. For the sequence, we want
to turn that off, that way, it's not looking to play
the livery targeting, instead, we're trying to let the animation in
the sequence play. In our livery target, I
can check this off to use library target for the spawn blueprint version
of our character. I can uncheck this, and then we should be
able to scrub and see it. It'll update and play the
animation where we're egging the player on to actually
begin playing the game. That was the performance
choice I made for my cinematic. Yours
could be different. How do we have that
level sequence play and then blend seamlessly into
our gameplay animation? We want to jump
into a new kind of blueprint called the
level blueprint. We can access this level
blueprint by going to this tree icon up here and toggle this down to
open level blueprint. Typically, there's nothing
here in the event graph, and this is where we can
actually use the event begin play for this level to play
the sequence that we have. The first thing I want to do is actually select a
level sequence. Level sequence start
is the name of mine. I can choose it from the
outliner of the viewport. Now when I right-click,
I can say, create a reference
to level sequence. Without this selection,
this wouldn't be an option. Make sure you select
the level sequence first before
right-clicking here. Now that we've created this reference to
our level sequence, we need to click drag off of this to find the next
node that we need. When you click and
drag off of nodes, this is contextual to that node. If I try to find the same
thing we're going to look for here from
the event begin play, I wouldn't be able to find it. You want to make
sure that you're clicking and dragging off of the correct nodes to find the right ones
we're looking for. I want to find play
sequence player, and when I click that,
I get a couple of notes here, and we
can drag this out. Now we have a way that our
sequence is going to play, but it doesn't know
how to actually possess the character that we're going to be playing with, and that's in our sequence. We need some way to
get our character, and we can right-click
and say, get player pawn. That means get the pawn of the character that is getting spawned that we're playing with. That's this. Next, we want to create a tag for
a character so it knows which character
to possess. We can very specifically
and manually control what this level
sequence is controlling. By clicking and
dragging off again, we have to be
dragging off of this, I can look for a set
binding by tag node. Now the only thing left to
do is to connect some of these things up and also
create this tag here. I'm going to minimize this first second and go into
create our tag. If I right-click the blueprint, I can create a tag here. Now, the tricky part about
metahuman is there's actually multiple components that comprise this blueprint. We have the body, we have
the face, and specifically, what we're trying to
possess and filter by a tag is actually the body. That's where the animation is. We want to actually add
the tag to the body. I'm going to right-click
and add the tag to body. I'm going to hit "Control A" and "Control C" to select all and copy to make
sure I'm going to type it incorrectly in
our level blueprint. I'm going to hit "Enter"
to create that tag, and we can see it exists
here next to our body. If I was to hit "Play now", we can see that the
animation plays, but it spawns another character. Let's fix that by adding the tag to the character
blueprint too. I'm going to add the tag to
the blueprint itself as well, and that should fix this issue. I'm going to reopen
the level blueprint, and I can paste this binding tag right here that we just created. Now it knows what to bind to based on the actor that
we're going to give it. The actor is the player pawn, I'm going to connect this up. We're going to get a
little array thing that's going to be
created automatically. Now all we have to do is connect everything up left to right. When the game begins playing, we'll set this tag and then play the sequence
based on that tag, and I'm going to hit
"Compile" and "Save". I'm also going to close out of sequencer because
sometimes unreal gets confused whether
we're trying to play the sequence in the game
or in the timeline here. I'm going to close this
out just for safety sake. We can see it worked, and
our animation snaps back. Now the issue is we
need to blend it a bit more smoothly to
this idle animation. I'm going to go into
the level sequence, and I'm going to create a blend. I'm going to click
the level sequence, and I'm going to
open level sequence. When I look at the animation, there is this very
sneaky attribute that we can adjust,
which is the blend. Now, if I keep my
mouse low here, I'm actually changing the
length of the animation itself. But what I want to
do is actually grab the top corner where we can see this little
tiny triangle. This will control the actual
blend of the animation. Instead of popping, we'll
have about a second to blend back into
the idle animation from the end of our cinematic. Since they won't match
up exactly where our characters feet
positions are, for example, we'll have a nice
smooth blend between any mismatches
with the impose of our level sequence
and the beginning of our start idle
animation of gameplay. Now when I play, I should be able to see my animation play, and we should have a
smoother blend into idle. The one issue with this is
if I start trying to input, it's fighting the
animation here. If I'm trying to move while it's playing, it's kind
of fighting each other. I need to disable the input for a certain amount of time, I'm going to go to
the level blueprint, and I'm going to disable input. Then I want to delay it by a certain
amount of time based on the length of
the animation itself. Let's say three seconds. Then I want to be able to input again once
that's finished. The last piece of the
puzzle is telling it what the target and
player controller is. We need to get the
player controller, and then off of this
player controller, I want to find the
controlled pawn. The target is going to
be the controlled pawn. I can double-click this and control-click it so it's
a bit more organized, and the player
controller is going to be the one that
we've grabbed here. Hitting control so
I can hold that down and pull off another
version of that here. Double click, and now this should work to disable
the input during our cinematic playing back. If I press on the keyboard, I shouldn't be able to move until I'm blending
out of the delay. You can see I shifted a
little bit during that, I can actually just increase
the delay on our timer here to something like
four and compile and save, and this should prevent
us from being able to move our character
during the cinematic. I'm holding down W and
nothing's happening, and then it starts to move
once the cinematic is done. In this lesson, we learned how to create a seamless blend from a cinematic into the gameplay
mode for our character. We learned how to create a seamless blend by
tweaking some values. Feel free to make that your own and make it a seamless blend from the cinematic of your choosing to the idle
animation of our character. If you're running
into any trouble having that seamless
blend occur, just make sure that
your player start and your level sequence are
oriented in the same way. Meet me in the next lesson, where we're going to
create a start timer.
8. Create a Start Timer Trigger: Welcome back. In this lesson, we're going to create a
start timer for our player, so they know how
successful they are in the level we've designed for
them. Let's dive back in. Let's quickly create
a start line here. To create the start line, I'm going to use a trigger box. I'm going to type in trigger box at the top of the
ad button here. I want a trigger box. I don't want a trigger volume or anything else. I
want a trigger box. I'm going to use that, and I can just scale this, and make sure it covers the
entire starting line here. Of course, I could also put
some other elements here that signify to the player that this is actually
the starting line. But for now, I just want to make sure the game elements are in. Then we can always go back
in and add some artwork or static meshes to make the functional game elements
more clear to the player. I'm going to make sure that the box trigger covers
this section entirely, and that it's high
enough that you couldn't jump over
it as the player. When the player
passes through this, we're going to
trigger this volume. Let's begin setting
up this logic so that we have a
variable in seconds, and we can create a little timer that will display in the window. But we need to create a
variable for the seconds and trigger it based on us
passing through this volume. To do that, I want to
edit the game mode. The game mode is located right next to the third
person blueprint, and it's called third
person game mode. I can double click this, and we'll open settings window. What we want is the actual
full blueprint editor. We need to click
this button here to access the blueprint
editor for the game mode. Now that we have this, we can begin creating our variables
that we're going to need. The first one is seconds. We need some way
to measure time, and of course, seconds is the most common and
easy way to do that. There's different
types of variables. This is a computer science
math related stuff. If all these names don't really make any sense, don't
worry about that. You can either look that up
or just follow along with me. We just want to
choose float for now. Now we can create a custom event that's going to get triggered, so I can add a custom event by right clicking and
saying, Add custom event. I can call this Start timer. When this custom
event gets triggered, I want to set the seconds to zero because we need
to start from zero. I'm going to click and drag the variable out and
choose Set seconds. The default value
is already zero, so we just need to
connect this up. Now, I need another
variable that I can track whether the timer
is running or not. That way, I can use it later on, whether we're tracking if
the timer is on or off, and if we want to display a finish line
timer, for example. I'm going to add another
variable called B timer running, and B is for Boolean. We want to change this
to a Boolean type, which is a true or false value. If you hover over these, you can also see what these
variables are. For this one, I
just need to know, is it running or
is it not running? When we start the timer, it's going to be running. I can set the timer
running variable to be on, so I can connect these up
and then check this box. When the start timer
event happens, it's going to set the
variable seconds to zero, and it's going to set the time
or running variable to on. But how do we count the seconds? We need some way to add time to this variable called seconds. Well, we can use something
called an event tick. If I right click
and say event tick, there's an event that's already
built into Unreal engine. If I hover over it, you can
see event called every frame. It's an easy way to
get a time-based value inside of unreal engine. I want to take the
starting value of zero, and I want to add, so I can click and drag off,
and choose Add. I want to add the Delta seconds, meaning the changing
amount of seconds. Delta seconds is already tracked
in this event tick node. I can click and drag this in, and now we're adding
to this variable. But now we need to set it
after we've added to it. I can click and drag this
out and choose Set seconds. You can see we have our
custom variable down here, and now we can set the
seconds on the Event tick. But we don't want to
do this all the time. We only want to do it when the
timer is actually running. We can use this value to
branch off of this event tech. We can say branch,
and we can say, if this is true, if the timer
is running, then do this. Then set the number of seconds based on the
Delta in the event tick. If this is false, do nothing. Now we've created our
custom Start timer event, which is going to track
the number of seconds, and it's also going to set a variable that the
timer is running. Then it's going to set
those numbers of seconds that we can call into
our user interface, and actually use this value, so it'll populate itself
dynamically and procedurally. Let's create the UI element
now that the player can see. I'm going to right
click and choose User Interface,
Widget Blueprint. There's only one option,
so let's choose that. I'm going to call
this time Widget. Inside of here, we have a Canvas that we can add text to, to display things on
screen for our player like health status or in
our case, this timer. The first thing I need
to do is add a Canvas. Now I can see what is the shape of my window that I'm
adding things to. I can click and drag this in, and now we can see what the
border is of our scene. Now I can start out and just
start dragging in text. In this text block, I
want to call this timer, hit a space and a colon. Now we have our timer. I'm going to put this
up on the top left. You can put it in the
center, wherever you want. I'm going to add
another piece of text that is going
to be our seconds. That's the variable that
we've just created. I'm going to bind this
text to that variable. On this little drop down menu, I can choose Create binding. I'm going to bind the
variable to this text. Now we get this
function that's asking, what do you want to bind to? We need to get the game mode, because that's
where that variable lives, that seconds variable. I can click and drag this out, and say cast to Third
person game mode. We're basically
just trying to get this Third person
game mode blueprint, and once we have it, we
can just tell it, yes, get the game mode,
and now we can access the variable by clicking
and dragging from here, and choosing get seconds. Now you can see we have
our variable here, and we can click and
drag this into the text. It's going to convert the
float value into a string, so that can be used as text. I'm going to compile and save. I'm going to go back here
and compile and save, and just make sure
we're all set up. I need to show the
timer that we've made. I need to show it on
the actual screen. I can click the Designer
button up here, and go back and make any
adjustments I need to make, but we need some way to
actually show it on the screen. We can do it in the
character blueprint. I'm going to double click
the character blueprint. When the game begins
on Event begin play, all this stuff happens. I just want to add
something to it. I want to say when this begins, also create the widget
and display it. I can click and drag this out and choose
Widget, Create Widget. I can select the Widget
from this class, and we can try to find
our timer Widget right here. Now we've created it. Now I want to display
it in the viewport. I can click and drag this out, and say, add to viewport. Now I needs to know what
to add to the viewport, and we can just return
this value here. I can compile and save. The final step is
actually connecting the trigger box to our custom event that we've
made in the game mode. We need some way to
trigger all of this, so I can jump into
the level blueprint, and I can create a
custom event based on the trigger box
that we've made. It's easiest if I actually
select this trigger box first, and then right clicking, I get add event
for Trigger box 0. It knows what trigger
box I have selected, and I want to add
a collision event. Add on Actor begin
overlap is what we want, and when we begin to
overlap this trigger box, do something, and we're
going to tell it what to do. If you remember,
our custom event is in our third person game mode. We need to call this
third person game mode to access this custom event. I'm going to click and
drag out, and say, third person game mode, and we're just going to cast to that and get the game mode. Then all I want to do is
call this custom event, so I can start typing in the
custom event start timer. We can just click and
drag this as its target, and compile and save. Now we've hooked up everything
that we need to hook up. We've created a custom event
that will track the time. We've created a UI
element and connected that custom variable of
seconds to this text box. Then we've created
a Alt to viewport Widget at the beginning
of playing the game. We've connected all of
this to a trigger box, so it will activate
our custom event that we created in the
third person game mode. This isn't working
because we actually added everything to the
third person blueprint, not our metahuman blueprint. Let's copy and paste what we did into our
metahuman blueprint. If you're using a
custom metahuman, you need to do this step inside your custom
metahuman blueprint. I'm going to jump over
to my metahumans, and I'm going to open
up that blueprint. I'm just going to
copy and paste this on Begin play, which is up here. I can see Begin play
is happening here, and I just want to copy and
paste all of that here. Now I'll compile and save, and that should work for
our custom character. Now you can see we actually
already have the timer in the top left. We
know it's working. It's showing the display. If I run around in here, it's not doing anything, but as soon as I cross our
invisible trigger volume, it should start
displaying a time. You can see we're tracking
the time now in our game. Great job getting through this
lesson. We covered a lot. We were working in a couple
different blueprints, and we slowly connected each
one of those components up. We created a custom event, we created a custom variable. We added to that variable,
so we could track the time. Then we created our own UI so the player could actually
see all of this happening, and then we use the trigger
box as a way to actually trigger all this happening
to be visible to the player. There's a lot of
information here. Just take your time with it, and refer back to this
lesson if you need to. Meet me in the next lesson
where we're going to create an obstacle for our
character to overcome.
9. Create Obstacles with Game Logic : Welcome back. In this lesson, we're going to create
an obstacle for our playable character
to overcome. This obstacle is going
to be a rotating box, so that if the character
actually runs into it, it will stimulate
Rag Dall physics on our character and
then restart to level. It's really just a
dangerous obstacle or challenge for our player to make our level more interesting. Opening our project
back up, let's jump in. First, let's create
the obstacle. I'm going to create
a new obstacle in my metahuman Blueprint area. If I was making a
bunch of obstacles, I could be organized to
make a folder for itself. But for right now,
I'm just going to make a new blueprint class. I'm going to right click
in the Content browser, Check Blueprint class, select the Actor,
and I'm going to call this BP Underscore Danger. I'm going to double click
this empty Blueprint. Inside, we have
this blank Canvas where we can create
our obstacle. I'm going to add
a static mesh by clicking Add and
typing in Static mesh. I'm going to choose Static mesh, and I'm going to find an
obstacle for our mesh type, and I want to add that
to our Blueprint. In the VR starter content, there is a basic mesh
called SM cube 03. Because it has red outlines, I think it's going
to work well for our rotating object here. I'm going to use
this static mesh. Now I want to add a rotating
movement component. When I press simulate, we can see that it
is indeed rotating, but it's rotating in the wrong direction and
it's rotating very fast. I can just choose a different
axis to rotate it on. I'm going to choose static
mesh and hitting E, I can see that it's
either going to be Y or X and that I want to rotate
it in one of those two axes. I'm going to go to the
rotating movement component. Instead of z, I want
to turn that to zero. I don't want it to rotate in Z, and I want it to rotate in X or Y. I want to rotate it slower. I'm going to choose a
value less than 180. I want to choose 90, and now when I press simulate, I can see that it's actually rotating in another direction, something more desirable
for this object. I'm going to turn
off simulation. Now I want to create
a trigger volume that matches the size
of this obstacle. I'm going to add
a box collision. With this box collision,
I'm going to scale it up and have it match
this box size. I'm going to press
R on my keyboard to pull up the shortcut for
the scale manipulator. Now I want to make it slightly bigger than the dimensions of the static mesh so I can make sure that the player actually
can collide with this box. I'm going to compile and save, and I'm going to click and drag this blueprint directly
into our scene. I'm going to rotate it up, and I'm going to press play. Now I can see I have a
rotating object in my scene, and if I run into
it, nothing happens. I can just collide into it, and I'm not harmed in any way. What I actually want to do
is trigger a rag doll event. My character just
basically goes limp and dies and rag dolls when
it runs into this box. We need to create that game logic and connect
it to this obstacle. Also, if I want to move
this onto its side, I can just rotate this down
as well by hitting E on my keyboard and rotating
this in 90 degrees. I can also scale this object up. If I want this scale
to make it longer, I can do that and press
R on my keyboard and scale and also W to move it
down closer to the floor. This way, it's
blocking the path. Let's create the game
logic for a character to Rag Dall by going
into its blueprint. If you're using a third
person blueprint character, you'll go into that blueprint and do everything
we're about to do. But I'm using a
custom metahuman, so I'm going to jump in here and create this custom event. We want our character
to Rag Dall, so I'm going to call my
custom event Rag Dall. I'm going to right click on the Blueprint event graph and
start typing custom event. I'm going to add a custom event and call it Rag Dall event. For this custom event, I want to simulate the physics
of this character. I'm going to click
and drag off of this and start typing simulate. I want to set the simulate
physics to the mesh. I'm going to set simulate
physics to the mesh. We can see it already
mapped it up. If I chose the wrong one, or if I wanted to
change it later, I can always click and drag the component in and then
map it to the target. I'm going to turn on
simulate because that's the reason why we're creating this node is to simulate it. Then I want to
restart the level. I'm going to create a
delay first because I want to see the simulation
occur for a few seconds. I'm going to delay this so we
can actually see the effect take place by maybe 2 seconds. Then I want to load
the level up again. I want to get my
current level name. I'll type in get
current level name, and off of this, then I want to load this level by its name. I'm going to say
open level by name. Then I can just pipe in
the return value here. It'll create a little connector
conversion node for us. Now we have a custom event
that triggers the physics of our mesh and delays the next
event by a few seconds, and then it loads the same
level again that we're in. We basically start over after
we collide with the box. But we need to set
that relationship up. All we've done is create
the custom event, but nothing is
triggering it right now. Now, there's one final
thing we want to do under mesh is go down to the
collision section, and under collision section, we want to make sure we
choose Physics actor. By default, this
is character mesh, and we want to change
this to Physics actor. Now that we've done that,
we can compile and save. Now we can connect
this custom event to the obstacle itself. I'm going to open the
blueprint for the obstacle by hitting control space bar and then opening the blueprint. Inside this Blueprint,
I want to say event actor begin overlap. But I want to do this for
the box specifically. I'm going to right click and say at event on component,
begin overlap. I want to grab the custom
event that we just created and that lives in the
blueprint of my metahuman, or your third person character,
if you're using that. We want to cast to that so we
can get that custom event. I'm just going to
pipe in our Actor, and I'm going to call
this custom event. I remember I named it Rag Dall, so I'm going to
type in Rag Dall, and here we have
that custom event. The target here is itself,
what we're casting to. Now I can compile and save, and we can test this out. I just need to run
into this barrier, and it should trigger the rag
Dall, and you can see it. It worked. It created a rag Dall effect and it
simulated the physics, and it restarted the level. Now I'm back at the beginning. But there was a
couple of odd things. The capsule that contains
the character was still colliding with this obstacle after the Rag Dall is initiated, and it's moving
my camera around. Things get a little
bit too chaotic there. What we can do is go back into the blueprint for
this Bag Dall event, and we can add a
few more things. After we begin
simulating physics, let's destroy the
capsule component so it's no longer colliding
with the obstacle. I'm going to click and
drag off of here and start typing destroy component and choose the capsule component. What this is is if we
look in the viewport, the capsule component
is this wire cage, and that's what
is colliding with the obstacle after
we've already Rag Dall. We want to turn that
off after we've triggered to simulate
the Rag Dall on the mesh of the character. We want to turn off
the capsule component, so it's no longer colliding with the obstacle
after we've died. We've destroyed that component after we've simulated
the physics, we've delayed the next
step by 2 seconds, so we can actually see
the physics take place, and then I want to create a little better death transition into the opening level again. Let's create a camera fade. But to do that, we can't just
click and drag off of here. We first need to get
the camera manager and click and drag off of that. We first need to get
the camera manager. Now I can click and
drag off of this and say, start camera fade. This is only available
to us if we're clicking and dragging off of the
player camera manager. The camera is going to begin
fading after the delay has happened and right before
our level loads again. I'm going to set this
into the process. We want to let's say fade from a color of
red because we died. We're making it a bit of
a dark red just so we know that it's fading
because we've died. I want the duration to
occur over 2 seconds. You can play with this
value and make it more, something like 5 seconds. I want to fade 0 -1. I want to turn on the effect
completely, which is one. I'm going to type into one here. Now, to see this happened, to see this fade happen, we need another delay here. I'm going to copy and
paste this delay, and I'm going to
put it in here so we can actually see
the fade taking place. You want to make this
delay to be as long as the transition and the camera
fade should be happening. Now we have a custom event. It's going to get called when
we collide with the box. It's going to
stimulate the physics, it's going to
destroy the capsule, so we're no longer
colliding with the obstacle itself after
we've already died, and we're going to be able to watch that for a few seconds, and then we're going
to start fitting the camera out and reload
the level that we're in. I'm going to compile and save
and test out those changes. That worked, we're no longer
colliding with the obstacle after the simulation gets triggered and the level reloads. Now that we made this
obstacle for our player, we can take this
Blueprint underscored danger or whatever you call
it your own Blueprint, and we'd actually just
click and drag it into our scene as many
times as we want. We don't have to keep creating this obstacle over and
over in the Blueprints. We've made it once,
and we can use it over and over again wherever
we want it in our level. One step you want to
make sure is to make the box collision bigger
than the obstacle itself. Otherwise, the player can
never actually collide with it because it's
inside the obstacle. We want to make the box
collision bigger than the obstacle so we can actually trigger all of
these events happening. Have a play around with it, make obstacles of different
shapes and sizes, choose different static meshes, and place them
around your level. Me in the next lesson, I'll show you another way
we can use this blueprint.
10. Finish Up Danger Areas : Welcome back. In this lesson, we're going to take that
obstacle blueprint, and we're going to add
an explosion to it. We're also going to add a sound, and then we're going
to repurpose it, so we can use it more places
in our level. Let's begin. So I'm going to make some
room for this ragdoll event, and I'm going to
click and drag off and start typing
in spawn emitter. I'm going to say spawn
emitter to attached. The attached is going to be
the actual capsule component. So we're going to attach it
to the capsule component. But we need to do this
before it's destroyed. So I'm just going to move
this one level forward. So I can say attach
to this component. What we want to emit is a stock explosion that actually
comes with unreal engine. So we're going to emit an explosion at the capsule
component location. I also want to play a
sound with the explosion. I'm going to move this
down and I'm going to pull out and
say, play sound 2D. I can preview these sounds
by pressing the play button. So let's find an explosion. All these sounds come
with unreal engine. So I'm going to choose
the explosion one, and I'm going to
compile and save. Now when we run
into this object, we should see an explosion
and hear a sound. Now, if we wanted to
have the same effect for our fire obstacle
or any other obstacle, we don't have to have
the static mesh. We can create a new
obstacle blueprint. So I'm going to right-click
and duplicate this, and I'm going to call
this danger trigger. Because what we can actually do is just remove
the static mesh, and we can just have
this trigger component. We can turn off rotating because we don't
need it to rotate. I can just reset the scale, so when we bring in
this danger component, we can resize it
to what we need. I'm going to click and
drag it into the fire pit, and I'm going to scale this so that it covers
the whole fire pit. But I want to keep it
low enough so that it doesn't go higher
than the box itself. I'm just going to move
this down a little bit. Now I'm going to test
this trigger volume. That's how you create obstacles and respawn at
the beginning of your game. In this lesson, we created an explosion for our obstacle,
as well as the sound, and we repurposed that
obstacle blueprint in different ways so we can pepper it
throughout our level. Meaning the next lesson, where we're going to take
this whole video game and actually package it up so we can share it
with our friends.
11. Package and Share Your Game: Welcome back. In this lesson, we're going to learn
how we can package up the video game you've made
and share with friends. That way you can tell who's the fastest player in your
video game. Let's begin. First things first is we
want to make sure that the game loads the correct level for the player
when they open it. We need to set that in
the project settings. Let's go to edit
project settings, and in maps and modes, we can select the
game default map. Currently, it's set to the
default Open World Map, which is not the level
that we've created. The level I've made is
called New Landscape 01. The level you choose will be whatever you chose to name it. I just need to drop this menu down and click my
level that I created. Now when we package up our game, it's going to actually
load up the correct map when we begin playing the game. I'm just going to
close this down and to begin packaging our
game for our friends to play, we can go to
platforms and choose the platform that we
want to publish to. I'm going to choose Windows and package project. But
we get an error here. It's because we don't have the
STK for Windows installed, so I'm going to click Cancel. If I go back to
platforms, windows, and I look at the
very bottom here, I can see what
versions are allowed. So all I need to do
is Google Windows, STK and download the installer and install the STK for Windows. That'll take a little while to install and then
once it's finished, you can jump back into
real and go to platforms. Then click Refresh
Platform status first unless you've already
closed and reopened unreal. Now it should update
and be able to use the STK package that
we've installed. Now we'll go to platforms, windows, and package project. Now we don't get an error,
and it's just asking us where we want to save
this package project. We were greeted with
a failed error, and I can open the output
log and see why it failed. It looks like we're still
missing one component, which is the Visual Studio 2022. I'm going to find it online
and install it and try again. If your installer
is stuck at zero, then you can cancel and
make sure that you run as administrator by right clicking and select run as administrator. Make sure you include the C++ stuff in the install
as well, so check this box. Now we can jump back
into platforms, windows, and try
package project again. If we get this warning, we want to make sure
that we allow access. This step is going to
take a little while, so just let it run. It's finished
packaging our game, so we have a windows
folder right here, and inside that folder, we can see the
unreal engine icon. All I need to do to play
our game is click on this unreal engine icon that's
an executable application. Now we have our game
and it's ready to go. Now, if we want
to quit our game, all we have to do is
hit the tilda key, which is in the top left of most keyboards right
under the escape key, and we can type in
quit and hit "Enter." If you want to share this
game with your friends, you can click and
drag everything, and in windows, you can
right click this and choose S two
compressed zip folder. This will create one
file that you can share with your friends
that they can zip, and just keep in mind that this can be quite a large file. I think Mine is
around 4 gigabytes. You'll want to use some
file transfer service like wetransfer.com or Google Drive to share it with your friends. In this lesson, we
covered how to actually package the game we've made so that we can share
it with our friends. There's two things that we
had to install for Windows. We had the Windows STK as
well as the visual studio. You may have some of this
stuff already installed if you're some big
computer programmer type, but I'm not, so I
had to install it. Those take a little while, mine got hung up on
0% for a long time, so just try to be patient
with those installs. Remember the file size can
be quite large for these. You'll want to find a
file transfer service that allows for
large file sizes. I like to use transfer.com or Google Drive and
there you have it. You have your game, you
can download and share.
12. Final Thoughts : Congratulations for
finishing this class. If you've been following all
the classes in the series and even bigger congratulations because it's a lot of material. Now that you've
finished this class, you have an amazing skill set. We learned how to add a
state to a state machine. We learned how to
create obstacles for our characters and
time their movements through a level so we can create a competitive video game and even be able to share
it with our friends. I'd love to see what you made. Please take a screen
capture video of your game and share it
in the project gallery. If you're interested in
taking this even further, go play your
favorite video game. See what kind of features
and components exist in those and try to recreate
them in your own video game. Now, consider all
the complexities of your favorite video games, and think about how you can take your video game to
the next level. You could add a jet
pack to your character. You could add an enemy system, a combat system, a
weapon inventory system. There's so many
different ways that you could level up your game. You can go get inspiration
from your favorite games. Once you've gone down each
one of these avenues, recognize that each one is
its own career discipline. If you like creating enemies and figuring
out AI behavior, that's its own discipline
in a game company. Or if you like to do the
level design and figuring out the game logic of how the player interacts
with the environment, that's its own discipline. Continue to explore
as much as you can, because each way has its own
path to a fulfilling career. Thank you so much for
taking this class. I can't wait to play your game when it's
out in the world.