I need help to create PaperZD Sprite in a 3D World Camera (Billboarding)

Hi guys,

I’ve been trying to create a PaperZD- 2D character inside a full 3D world, and my objective is to find a way to use a camera to always rotate and face the direction of my 2D sprites multi-directions and I’ve been following a guide by Fofuxo here: How to create 2D characters in 3D World like Ragnarok Online/Boomer Shooter.

but I’m not able to replicate what he did and I come accoss many trials and shortcoming on my end. I’ve started my 2.5D project from a unreal course playlist:

My knowledge and understanding of configuring Blueprint is very limited so it doesn’t cover the advanced or specific that I was looking for. Here is my event of my PaperZD Sprite BP and materials which I duplicate from Default from the PaperZD Sprite engine that I have set up for my character movement:

Foruxo suggested to enable all three: Orient Rotation, Inherit Yaw, and Pawn Control Rotation. I’ve started enabling one by one for incremental steps below what I’m showing here.

I’m not able to quite grasp the logic of the 3D axis between my characters and the springboard camera. I know that my sprite character moves in the position of the input controller for top-down game based on the world axis. My Camera is facing in negative Y direction of my Sprite so Y is forward and X is Right vector. I already have Orient Rotation for Character Movement component enabled:

Next, under the SpringArm property, I enabled only the inheri Yaw but as soon as I play for testing, not only my character sprite moves in the opposite direction of my key input control but also the camera flips as well and doesn’t synchronise the character movement.

I’ve tried playing around between World Rotation and Relative Rotation of the springarms both of these times.

With Orient Rotation and Inherit Yaw is enabled, that left me to enable the Use Pawn Control rotation, and the result was that my spring arm snapped to the X axis:

This follows my problem with my character movement. A and D key which is suppossed to be the horizonal of the X axis have instead moved forward direction and the W and S key for Forward in Y axis have instead moved horizonally. Also another problem is that the camera is not moving and orbiting around the degree angle of my character when moving in multi-direction like before when I only enabled just with Inherit Yaw without the Pawn.

I followed exactly what Fofuxo have laid out in the graph atleast when it comes to setting up a formula to calculate the distance and angles to define a variable for directionality and then use that reference in the Anim Graph of my PaperZD AnimBP. Quite frankly, he probably set it differently for his sprite BP character to make it work outs for the math that helps the character’s animation logic.

With this logic, I don’t know what I have to change or add to functionally act between the camera’s and Character’s position and angle to make it work.

I have my Sprite character material with a Plane mesh set in the viewport which was able too Align to the Camera,

Anyway I don’t know what I’m missing or what changes I have to make?

Anyone? Please, I need some lifting :persevering_face:

Hey @ZodiacWarlock how are you?

I’m reviewing your case and trying to find an answer for you!

As soon as I find a solution, I’ll let you know!

Thank you for letting me know. I’m putting on hold until someone can find me the answers, so I appreciate you looking into this

Hello again @ZodiacWarlock ! How are you doing?

I’ve been testing a lot of things here and I found a way to make it work! I completely ignored the materials part suggested by Fofuxo and directly made the Sprite rotates towards the camera every frame, which is easier to do (I will show you how to do it at the end of the post!).

I’m gonna show you how I implemented it!

First of all I implemented the sprites and character BP as in the official UE tutorial but added a coupla changes to make it work with camera rotation.

This is my IMC for movement:


As you can see, I “negate” the S instead of W, as I will be implementing the movement slightly different.

This is my Input and IMC config for camera rotation:


This is how I handle the movement and camera rotation:

The next thing to modify is the Spring Arm component and the Sprite rotation, so you can rotate it without any issues.

This is my Spring Arm component settings:

But to make it work perfectly, you will need to rotate the sprit so it faces the same direction as the arrow component, like this:

Keep in mind that, in this method, you don’t need to change the initial rotation of the Spring Arm component, as you will rotate the Sprite instead!

Now the last two things to do! The first one is to make the Sprite face the camera, and the second one is to calculate the directionality for the animations! For both things I created two different functions adn added them to the Event Tick:

The “Make Sprite Face Camera” function is this one:

And for the “Get Directionality” function I created a “Directionality” variable of type Vector 2D in mycharacter BP and used it this way:
image

That “Directionality” variable is used within the Animation Blueprint, replacing the official tutorial calculations:

And that’s it!

With this you will have a sprite that always faces the camera and changes the animation depending of movement direction and camera rotation!

Here is a video of it working:

Hope this helps you and let me know if you need more help!

1 Like

Sorry it took me a while to get back to you — but wow! I’m genuinely impressed by how you constructed your method and arrived at that solution. Thankfully, I was able to get mine working in the end too.

I still don’t know enough Blueprint to fully explain everything cleanly, but here’s what I figured out while troubleshooting. In my original project, I kept running into problems with how the Blueprint classes were connected — specifically between my MasterZD, my Player BP, and the PaperZD AnimBP. My sprite wasn’t reading direction properly, and the camera-based rotation kept breaking

It turned out that some of the reference variables and functions weren’t being assigned correctly. In your example, you created functions like Directionality and MakeSpriteFaceCamera inside the BP_Player, and then cast from the PaperZD AnimBP (in AnimGraph) to BP_Master2D to read those variables. But in my setup, the AnimBP was only referencing my BP_Player, so I wasn’t able to connect them where the types didn’t match because the references were pointing to different BP classes.

[!] Blueprint Runtime Error: “Accessed None trying to read property Sprite_Adventurer”. Node: Set World Rotation Graph: MakeSpriteFaceCamera Function: Make Sprite Face Camera Blueprint: BPC_Adventurer_Player

I realized I was grabbing the wrong target for Set World Rotation inside the MakeSpriteFaceCamera function. I was pulling the sprite component that belonged to the Master2D component hierarchy instead of the actual Sprite component inside BP_Player. That mismatch broke the whole chain.

At some point (I honestly lost track of when), I also added a Directionality variable under Master_BP’s component list, even though the event graph stayed empty and that finally allowed the references to sync up properly somehow…

Another factor was that I had “Use Controller Rotation Yaw” enabled on my BP_Player (Self). Once I turned it off — since you left that disabled in your setup — the sprite finally started matching the camera angle correctly and animating in the right direction.

So the complete functionality now works:
✓ Sprite rotates correctly according to the camera angle
✓ Directionality updates properly
✓ AnimBP receives the right actor reference
✓ No more hierarchy conflicts between Player BP → Master2D → Sprite component

Thank you again for taking the time to explain your method. I really appreciate it.

1 Like