Video Game Design in Unreal Engine: Build, Customize and Play Your World | Lucas Ridley | Skillshare
Search

Playback Speed


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Video Game Design in Unreal Engine: Build, Customize and Play Your World

teacher avatar Lucas Ridley, Professional Animator

Watch this class and thousands more

Get unlimited access to every class
Taught by industry leaders & working professionals
Topics include illustration, design, photography, and more

Watch this class and thousands more

Get unlimited access to every class
Taught by industry leaders & working professionals
Topics include illustration, design, photography, and more

Lessons in This Class

    • 1.

      Introduction

      1:33

    • 2.

      Getting Started

      1:28

    • 3.

      Create the Player Start

      4:53

    • 4.

      Connect Custom Playable Character

      4:35

    • 5.

      Set Up a State Machine

      5:07

    • 6.

      Finish Your State Machine

      13:44

    • 7.

      Connect Cinematic to Gameplay Start

      10:35

    • 8.

      Create a Start Timer Trigger

      12:02

    • 9.

      Create Obstacles with Game Logic

      12:02

    • 10.

      Finish Up Danger Areas

      3:53

    • 11.

      Package and Share Your Game

      4:51

    • 12.

      Final Thoughts

      1:41

  • --
  • Beginner level
  • Intermediate level
  • Advanced level
  • All levels

Community Generated

The level is determined by a majority opinion of students who have reviewed this class. The teacher's recommendation is shown until at least 5 student responses are collected.

203

Students

--

Projects

About This Class

Create your own custom video game that you can share and play with friends.

One of Skillshare’s most popular animation teachers, Lucas Ridley first got into 3D animation when searching for a way to work on film projects with realistic characters, captivating settings and riveting storylines without needing to scout a location, get filming permits, hire actors and rent expensive equipment. Now a professional 3D animator and filmmaker, Lucas has been able to work on movies like Avengers Infinity War and Disney’s Aladdin as well as video games like The Last Of Us Part 2 and Suicide Squad: Kill the Justice League—right from his desk. After building a successful career, Lucas wants to share how you can use 3D animation to create your own films or video games. 

In this class, Lucas will teach you how to use Unreal Engine to make an entire video game using game logic, a timer and obstacles for any video game character to try to conquer. Created for animators who are ready to dive into the deep end of video game creation, each lesson will bring you closer to a finished video game that you can share and play with your friends in a timed obstacle course.

With Lucas as your guide, you’ll:

  • Create a player start from scratch 
  • Connect a custom Metahuman player to your game
  • Set up state machines for your character like crouching 
  • Add an intro cinematic, timer and obstacles like rotating objects and danger areas

 Plus, you’ll get a behind the scenes look at how Lucas would design a short obstacle course video game as a full-time 3D animator. 

Whether you’ve always dreamed of creating video games for a living or just want to put your 3D animation skills to the test with an interactive and shareable project, you’ll leave this class with a customized video game that you can share in your portfolio, with a potential employer or just with your friends. 

To take this class, you should have intermediate knowledge of Unreal Engine so that you can navigate the software with ease. In addition to the Unreal Engine software, you’ll also need a computer and a three button mouse. To continue learning more about Video Game Animation in Unreal Engine, explore Lucas’ full Learning Path.

Meet Your Teacher

Teacher Profile Image

Lucas Ridley

Professional Animator

Teacher
Level: Advanced

Class Ratings

Expectations Met?
    Exceeded!
  • 0%
  • Yes
  • 0%
  • Somewhat
  • 0%
  • Not really
  • 0%

Why Join Skillshare?

Take award-winning Skillshare Original Classes

Each class has short lessons, hands-on projects

Your membership supports Skillshare teachers

Learn From Anywhere

Take classes on the go with the Skillshare app. Stream or download to watch on the plane, the subway, or wherever you learn best.

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.