March 13, 2026
The Ultimate 2D Top Down Unreal Engine Course
Title:
The Ultimate 2D Top Down Unreal Engine Course
By:
Cobra Code
https://www.udemy.com/course/unreal-2d-top-down/
Udemy Course Link
Description:
Section 4 focuses on creating a small project similar to an old school Pokemon game using Paper 2D.
Overview:
This section really gets you started on using Paper2D within Unreal. Everything from handling Sprite assets to tile maps to basic animations and layer sorting are covered.
My Notes Breakdown by Sub-Sections:
16. Monster World Overview
Overview of what is covered in this section.
Shows it’s similar to an older Pokemon style game.
Sprite importing and asset management, tiles, layering.
Text box setup.
================================
17. Setting Up the Project and Importing Assets
Starting with Blank project:
- Blueprint
- Target Platform: Desktop
Created “New Level”
- Empty level option
Saved this new level as its own Level asset in a folder named “Maps”
- like Unity’s Scene assets somewhat
Project assets’ license is: CC0
- free to use in your own games
Asset Type Conversion Rundown
- Characters > Flipbook
- Environment Tiles > Tilemap
- Environment Flowers > Flipbook
- Environment Other > Static Sprites
Creating Static Sprites
Example:
On Chest sprite:
– RMB
– Sprite Actions > Create Sprite
- this creates a Sprite asset from the Texture asset
Importing Sprite Assets
By default, sprite assets usually look off on initial import.
After importing:
- Right click and select: Sprite Action > Apply Paper2D Texture Settings
This changes some of the direct art asset settings:
- Mip Gen Setting: NoMipmaps
- Texture Group: 2D Pixels (unfiltered)
- Editor Show Final Encode: TRUE
- Compression Settings: UserInterface2D (RGBA)
- Filter: Default (from Texture Group)
- NOT Bilinear or Trilinear
UI:
- also applied the Paper2D Texture Settings since it is pixel art.
================================
18. Making a Tile Set and Tile Map
Tile Set is like a palette of brushes you can use to create a Tile Map.
After placing the Tile Map into the Viewport, they rotated it 270 along the x-axis to lay it “flat” in the world.
- They mentioned this is helpful with having the NavMesh setup work properly.
To prevent tearing between tiles, they generated a padded version of the Tile Set asset.
- this creates another Texture asset with some padding effect to prevent them from bleeding into each other.
- it looks like this just very literally duplicates the edge pixel all around the border of each tile a couple times and expands the tiles outward to fit them.
- so assume this is to prevent those weird super tiny “gaps” you can get between exact sized tiles sometimes?
Creating Tile Set
Select Texture Asset
RMB
Sprite Actions > Create Tile Set
Tile Set Settings
Modify Tile Size to fit your individual tile sprite dimensions:
i.e. 16 px x 16 px
Setting Collision
- Select Tile
- Click “Add Box”
Removing Collider:
- Under Single Tile Editor, click Reset next to Index [0] – 2 members.
- * This is not very intuitive, seems very complex for section handling collider.
Tile Map
Create Tile Map:
- Select Tile Set asset
- RMB
- Create Tile Map
Active Tile Set:
- Tile Set assets to select tiles from.
- Can add multiple Tile Set assets at once.
Can “stamp” an area of selected tiles by holding Shift to create a selection for the stamp.
Tile Layer List:
- allows for layering of tile layers
Setup:
- where you set the full width and height of the map (in tiles)
================================
19. Preparing the Character Sprites
General
Modifying parameters of several assets at once.
- Shift select all the assets.
- RMB
- Asset Actions > Edit Selection in Property Matrix
Converting a Sprite Sheet to Flipbook
Select sprite Texture Asset and:
- Sprite Actions > Extract Sprites
Extract Sprites generally defaults to Sprite Extract Mode : Auto.
- but you generally change it to Sprite Extract Mode : Grid.
- because you want the sprites to fit a general grid size, and not the smallest space possible.
Creating Flipbook Asset:
- Select multiple Sprite Asset
- RMB
- Create Flipbook
Working with Flipbook
Flipbook asset has a Frames Per Second parameter that can be modified to change the speed the Flipbook is played.
- controls the general speed the animation is played
Making Character Flipbooks
They made separate Flipbook assets for each direction of the walking animation.
They also made separate Flipbook assets for the Idle of each direction.
- each of these was just a single Spirte asset converted into a Flipbook
Folder Organization
Example for Character sprite assets:
PaperAssets > Characters > Red
- this is the parent path to all sprite assets for this single character, Red.
- this is also used to contain assets used directly by the game as they described.
- so it contains all the Paper Flipbook assets (the animation assets)
PaperAssets > Characters > Red > Frames
- placed all the individual extracted Sprite assets here.
- (after extracting them from the Sprite sheet)
PaperAssets > Characters > Red > Textures
- Sprite sheet placed in here (Since it is a Texture asset)
Naming Conventions
Flipbook Assets examples:
FB_Red_Walk_D
- FB for Flipbook
- Red is the character
- Walk describes the animation
- D is for down, which is the specific walking animation of that Flipbook.
FB_Red_Idle_R
- FB for Flipbook
- Red is the character.
- Idle describes the animation.
- R is for right.
================================
20. Best Project Settings for 2D Games
Common Problems:
- motion blur and anti-aliasing can cause visual problems.
Link for “Best 2D Settings for Unreal Engine 5”:
https://cobracode.notion.site/Best-2D-Settings-for-Unreal-Engine-5-0895133a56924f1ca7f2149cf111983b
- They just go through this list and set these settings any time they do a new 2D project.
Selecting All Assets in Project of a certain Type:
- can use the Filter in the Content Drawer.
- After selecting the Filter, can just enter the asset type you are interested in, and it’ll display all assets of that type in the project.
** They created Project Templates that just have all these settings set for 2D games immediately.
Project Settings
Turn OFF Auto Exposure.
- having this can cause dark scenes to get brighter over time.
- I saw this happening when I was tinkering with settings before and thought something was broken!
Motion Blur = OFF
Post Processing Settings
Access through Quick Add Menu.
PostProcessVolume default only applies if camera is within the volume.
Can make the PostProcessVolume affect everything by setting Infinite Extent (Unbound) to TRUE.
Texture Settings
- For some reason for 2D Sprite Texture assets, if you set the Filter to Default (from Texture Group), it can look correct in editor but reverts to an option like Bilinear in builds which makes them blurry again.
- to solve this, they select the Filter: Nearest.
================================
21. Character Blueprint and Pixels Per Unit
Blueprint for character:
- created as Paper Character Blueprint
With a discrepancy between the Sprite asset and the Paper Character Blueprint size, they recommend making the Sprite larger.
- the Paper Character makes assumptions about the general size of the character, which is what it is approximately sized at by default, so better to get closer to that instead of the other way around.
*** 1 Unreal Engine Unit = 1 cm
– this is DIFFERENT from Unity, which generally considers 1 unit as 1 m.
– this technically isn’t “real” but is a universally accepted approximation.
** There is a project wide setting to have a default Pixels per Unit set for all imported assets.
Pixels Per Unit
Sets scaling of pixels to 1 Unreal Engine Unit.
- This is their recommended way of scaling pixel art assets.
- this is similar to Unity.
- this is done on the Sprite assets
They changed all their Sprite assets across the board to the same Pixels per Unit value.
- I think this might be the ideal practice, but not positive.
Also need to change Tile Map assets Pixels per Unit values.
================================
22. Setting up the Camera and Possessing the Character
Added Player Start actor to Viewport.
- appears to be a sort of spawn point that connects to a Game Mode (like a Game Manager)
Created new Game Mode Blueprint
- think this is like a manager class in Unity?
*** FIXED EDITOR CAMERA ROTATION PROBLEM:
– Somehow my camera in Editor started rotating abnormally (directions were very backwards).
– You can fully reset the Editor camera by entering this command in the Console Commands:
BUGITGO 0 0 0 0 0 0
Settings Cameras to Orthographic helps ignore “height” differences along the z-axis.
- including preventing character from “falling” into place at game start if it spawns above the ground.
- They disabled Do Collision Test on SpringArm.
- not needed for 2D games.
Character Blueprint
Added a Spring Arm.
- with a Camera.
Setting the Default Game Mode
Go to:
- Edit > Project Settings… > Project > Maps & Modes
- set Default GameMode to the newly created one: GM_TopDown
- Here you can also set the Map that opens on Editor Startup and the Game Default.
- This feels like setting Scenes in the Build Settings for Unity.
================================
23. Enhanced Input and Character Movement
Uses new Enhanced Input Actions setup from Unreal Engine 5.1 on.
Input Actions setup requires two main parts:
- Input Actions
- seems to be individual inputs.
- Input Mapping Context
- the full mapping of all the inputs to their output game behaviors.
- They noted in the character controller Blueprint Event Graph setup that using Get Controller and casting to Player Controller is nicer for multiplayer setup.
- Directly getting the Player Controller requires setting a player index for multiplayer.
Input Actions
Created a single Input Action, Move.
Set its Value Type to: Axis2D (Vector 2D)
Input Mapping Context
This is where you associate an input (i.e. a keyboard key press of “A”) with a specific Input Action.
Can also apply Modifiers to these values based on different inputs.
- i.e. Lets you use a single Input Action but different inputs (i.e. W and S) to go different directions based on the Modifiers.
For the IMC_TopDown (primary player controller for this project):
- set W, A, S, and D as 4 separate input mappings all under the single IA_Move Input Action.
- used modifiers to apply this in the different directions
- combinations of Negate and Swizzle
- Negate reverses direction.
- Swizzle changes axis.
Folder Organization
Content > Input
- main folder for all input assets
- Input Mapping Context assets at this level
Content > Input > Actions
- put Input Action assets here.
Player Blueprint Event Graph Setup
Need to initialize Input Mapping Context.
- Get Controller > Cast to PlayerController > Enhanced Input Local Player Subsystem > Add Mapping Context
Created an Enhanced Action Event from our Input Action asset, IA_Move.
- Triggered: occurs constantly multiple times as this input as held down.
- like Unity Input.GetKey
- Started: occurs once right when input is entered.
- like Unity Input.GetKeyDown
- Action Value: the return value of this input.
In this case, the Action Value would return a Vector2D based on our Input Mapping Context, including the Negates and Swizzles.
- used this with a Break Vector2D node to separate out the X and Y values.
Add Movement Input node:
- inherited from Pawn class
- could take broken down x and y values as input in Scale Value along with appropriate directional World Direction values to move player in correct directions based on input.
================================
24. Directional Character Animations from Scratch
Promoted Action Value of Enhanced Action Event to Variable.
- makes it a variable in the Blueprint you have access to.
Renamed the Action Value variable to Directionality.
- used the values of this Vector2D to determine the direction of the player to update the sprite accordingly (with many bool checks).
- changed Sprite by using Set Flipbook node, with the Blueprint Sprite dragged in as reference.
- Set Flipbook seems to work somewhat like Unity when playing an animation, if using sprite assets.
Creating a Function:
- collapsed a bunch of added nodes into a single function.
- Select all nodes.
- RMB
- Collapse to Function
- then just renamed the Function to UpdateAnimation.
Enhanced Input Event > Completed
- happens a single time when input is released.
- like Unity Input.GetKeyUp
Branch node:
- if else statement node
================================
25. Adjusting the map and collisions
Removed all the individual tile colliders from our Tile Set asset.
Replaced those with a single Plane in our Map with a single collider.
- still using a collider to keep player from falling through floor.
Game is still using 3D collision for collision detection.
Changed CharacterMovement component’s Max Step Height from 45 to 10.
- ** They recommend not using 0 because even as a 2D game where that could make sense, it can cause weird issues even walking over flat terrain and doesn’t even work for collision well anyway.
Modified the Sprite assets to make their colliders thicker.
- thickened from 10 to 100 on the sign and tree Sprites.
================================
26. Foreground and Background sorting
- They don’t include the individual Sprite assets in the environment Tile Map because it restricts your options for layer sorting this way with Unreal Paper.
Keys:
- Made all Sprites use Material: TranslucentUnlitSpriteMaterial
- Edited colliders of all Sprite assets we wanted to be able to walk behind to about 1/3 their full height.
- Moved Sprite privots to Bottom Center.
- In Unreal Project Settings > Engine – Rendering
- set Translucent Sort Policy to: Sort Along Axis
- the default axis to sort along was correct (0, -1, 0)
Shrunk player collider radius so top doesn’t have as much collision area.
Make sure Material changes apply to Sprites in Blueprints.
- Blueprint Material settings will override base Sprite settings, so have to go into them individually to check and update if needed.
================================
27. Project files with layer sorting
- Just a checkpoint to download a new project file if you messed up earlier steps.
================================
28. Creating a simple message UI with custom fonts
2 main parts:
- Widget for entire screen
- Modular part for message box
Widgets = UI elements in Unreal Engine
** Want to minimize use of Canvases in Unreal for optimization purposes.
Created two new Widget Blueprints:
- WBP_MessageBox
- simple text containing message box.
- Modified: padding, Screen Size – Desired, font, Auto Wrap Text to TRUE.
- WBP_MainHUD
- has our singular Canvas.
- contains the Message Box.
- anchored and positioned to bottom center of screen
In BP_Red (Player Blueprint) we generate the WBP_MainHUD on start, and set it as a variable reference useable later.
================================
29. Making a pickup
- They recommend creating a separate collider for interactions.
- like separating the trigger / interactive collider from the physicsl obstacle layer collider.
Created a Blueprint for the item itself, BP_Pickup.
- in this Blueprint, created a GetPicked function.
In the player Blueprint (BP_Red):
- added new Input Action event for Interact
- on Started of this action, do check
- so it only happens a single time on input
- when interacting, do a Overlapping Actors collision check to find in range colliders.
- check by cast if any are BP_Pickup
- if so, invoke GetPicked function
Blueprints
Events cannot have a return type.
================================
30. Showing the item message
Shortcuts:
Ctrl + P = brings up search window for assets
Created function within the WBP_MainHUD to change visibility.
BP_Red (player controller) invokes control of message display using collision detection with interact Input Action.
Setup simple Retriggerable Delay to have message go away after some time.
Made BP_Pickup ItemName string and ItemID int Instance Editable so we could have different BP_Pickup actors in Viewport with different ItemName and ItemID.
================================
31. NPC Dialogue and Interfaces
Technical
Casts are a hard reference.
- So if you load a Blueprint with a cast, it must also load any casted Blueprint types.
- increases load times.
** Can use Reference Viewer to see dependency chains.
They setup a Blueprint Interface.
- reduces hard references.
- more scalable Blueprint setup in BP_Red (player controller).