This tutorial demonstrates how to create a reusable conveyor belt blueprint in Unreal Engine that pushes actors within its collision volume in a specified direction. The system uses a box collider for actor detection and an arrow component to determine push direction. Key implementation details include using instance-editable vector variables with 3D widget gizmos for intuitive size adjustment, clamping the Z-axis for thin collision planes, and implementing frame-rate independent movement using delta time. The blueprint checks actor mobility before pushing and includes an active boolean for performance optimization when multiple conveyor belts exist in a level.
Deep Dive
Prerequisite Knowledge
- No data available.
Where to go next
- No data available.
Deep Dive
How to Easy : Make a CONVEYOR BELT in Unreal Engine!Added:
a second look at this conveyor belt that I have here. It is super easy to construct and works on any actor that is set to be movable. It works as you would expect a conveyor belt to work and it is remarkably easy to set up. We're going to work on just the functionality for today. The material is a whole thing in and of itself, which we might take a look at in a separate video, maybe a week after this one. And for that, we'll start with an entirely clean project, the finished version of which will be, as always, down below in the description for you to check out if you're a YouTube member or a patron. To get started right away, let's make a blueprint class here, BP, and we'll call this just pusher. I showed it as a conveyor belt, you can use this as a air current. You can use it as a water current. Anything that pushes the player or any actor that falls within it into a certain direction, it can do that, of course.
For the functionality, we need two basic things. Number one is a box collider. Uh number two is, if we just select the default scene root so that we know that we're attaching it to the right thing, is an arrow as well.
The box is going to drive what's will be getting pushed. The arrow will drive in which direction we're pushing it. But before we get started with the functionality of pushing things around, I personally really, really hate having to set up box colliders like this with all these specific numbers and then I need to move it into place and all that kind of stuff. I want to just have one gizmo in the editor that takes care of all that for me. So, we're going to do that first. It's a super quick thing to do. We'll make a variable and call that size and make that a vector variable. Make sure it is instance editable and then once it is, we can set it to show 3D widgets. Vector variables have this very nice property that if you have them exposed on spawn with a, well, did I call it a widget? I going to get my enabled you have this movable gizmo in the editor that will update the value of the variable as you move it around. We can use that to drive the location and the size of this box through the construction script without too much work. First, I'm going to get the size by holding down control and dragging it in and then I'm going to be setting the size as well because I want to clamp the Z to always be in the same value. It should just be a very very narrow little bit of collision that really only triggers when your character's feet are on top of it or inside of it. Of course, if you want to do something like creating a wind tunnel or a river that pushes back on the player with this, you might not want to clamp that Z in the same way I'm going to do it here though.
We break the vector on one side and then we make a vector on the other side. The X and the Y we can just pull through and the Z which is going to give in a hardcoded value. Let's call that 40. And with that you will see that our size thing here, we can't even move it up anymore at all because it's just going to be stuck at being 40 but we can still freely move it in the other two directions as much as we want. Given this size that we now have, we can set this box to a certain size and a certain location to have that all taken care of.
We'll do that with set relative location and then also set box extent. We'll get started with the box extent and then relative location later because you'll see why we're doing the relative location a little bit more clearly. For now, we can just put this size into the box extent. We're going to need to adjust this a little bit in a moment but for now, this is good enough. And for the most part, that works fine because you can now see that this size gizmo is stuck to the corner of our box and as we adjust it, the box changes. But I don't I the box to change into this direction.
I only want it to change into this direction. I want the back of the box to just be stuck to our origin point here.
Because now we need to adjust the relative location of this thing based on our size as well. And for this we're going to split the structure pin. I also want the bottom of the box that we have here. And we should probably set the default size for this to be like 250, 250 something. But I want the bottom of this box also to be flat with the Z zero, the floor of this actor so to speak. So the first thing we do is we just set this Z value to whatever we gave in here as well. And with just that we can easily see that there we go. Now this thing is laying flat on what is essentially the floor of our actor, Z equals zero. Then the Y location we can leave all alone. Don't need to do anything with that. And the X location is relatively simple as well. We just break this vector and instead of putting this X right into here, which is going to be a total mess. As well that does work putting this thing at the very back of where we want it to be. Now our size and our gizmo don't match up at all anymore.
What we do instead is both the X in the box extent and the X in our location that we're giving, we need to divide by two.
So you divide both of these by two and then set this box extends to be a make vector where the X is also just divided by two. And then for the Z we take whatever value we had in there and just also put in half of it. Reason that we're doing that by the way is this box extent isn't the size of the box as a whole. It is how far the box will extends in any given direction. That means that when we set this to be a extend of a hundred, this thing is now not a hundred units wide. It's actually 200 units wide. We're saying here that we want the relative location to be 40 units up, which means that we want the box to be 40 units tall. And in order to get it to be 40 units tall, we need to extend it 20 up and 20 down. That's why this is halved. And that means that we also only need to put this thing up 20 units instead of the full 40.
Now I think about it. And with that, this is going to be the default size of this. And now we can use this gizmo to make this thing as big or as small as we want it to be. With that out of the way, let's make the functionality of this, which is a lot easier and a lot quicker even than what we just did. We're going to do this in event tick. Don't need any of the other code here, so I'm going to just remove that. And because we're going to be doing this in event tick, it's probably a good idea to have a just bool in here on whether or not this code is going to actually actively run. So, I'm making a variable here called active. Make it a boolean. The default value for this probably should be false in most scenarios, and then you manually activate it when you enter a trigger volume that just activates all the conveyor belts in the area. If you have a lot of them in a level, it's good to only have the ones that are near you running. For now, the default value I'm going to set to true. And we just drag that in. And right click this, convert to branch. And only if this is true, will we run the rest of the code. The rest of the code being first getting the box components and getting the overlapping actors from it. You could manually keep track of this with begin overlap and end overlap instead if you really wanted to. I'm just going to do it for this way. Uh for now, it's just a little bit more robust without actually being majorly more expensive. And we'll for each loop over that. Before we start moving things around, we want to make sure that the actor that we're moving around is set to being movable. If it is a static or even a stationary actor, we're going to just leave it alone. And for that, we'll get the root components because the root component has a mobility enum on it. That mobility enum, we can just check equal equal. Use the top one here. Equals enum instead of the normal equal operator because this gives you the nice little drop down menu. And we just check whether or not it is movable.
If it is not movable, we are just going to ignore it. Which means that we set this thing itself also to being non-movable, either static or stationary. Doesn't really matter. Going to go for static right now. And we also set the box itself to being static. This way, it prevents you from having it move around the floor that you put it on or even have it move around itself. Which And then in that for each loop, after we've made sure that whatever we're interacting with here is movable, we just add actor world offset. And that's going to move whatever actors are overlapping with that collider, just like that. We need to give it a delta location. And that delta location we get from the arrow. This arrow represents the direction that whatever is going to be moving will be moved. And we get that from the forward of vector from this arrow. We simply then multiply that with the delta time from event tick to make it frame rate independent. And then we right click the last pin that we just added, convert it to a float, and we promote that to a variable, call that just speed. And let's expose that to make it instance editable as well. And that will be our delta location. And believe it or not, we have the entire pusher just working now. Set the speed value by default to something like 500.
And if we just uh I think it was right over here, we will get pushed around when we're inside of that volume. Just like that. It's nice to have a bit of a visualization for that though. And I'm going to just give you that as a bonus.
Again, we're not going to worry too much about the material for it. We'll make that in a separate video, but I still want to just add a quick little cube to it so that you can just see where this thing is. Because we pretty much have all of the logic already set up for it in the construction script. We just need to kind of do what we did here for the cube as well. Pull in the cube and we're going to set the relative 3D scale. We're going to set the relative location. And the relative 3D scale is the one that takes the most effort. We just from our cube, which is nothing more than a static mesh component by the way, you can replace your own static meshes into this at some point in the future. And they might have different dimensions. They might be a different size from the cube that we're putting in now. And that is why we want to get the static mesh from that component because from that we can get the bounds of this thing.
And if you just split the structure pin at that outputs, we can get the box extend that represents our static mesh.
This is just a bounding box of how big the whole mesh is considered to be. And if we just take our size that we have here and we divide it by that box extend, we essentially just get a normalized value that we can use to set the relative 3D scale of this thing. And if we do that, you will see that in the event graph now in the viewports, it now is scaled properly. It's a little bit on the big side because obviously it's very, very thick. So, what we're going to do instead is I'm going to split both of the structure pins. X, Y, and Z are just going to get pulled through and the Z I'm just going to put in 0.05 to make it a very thin flat little thing. Just like we did before, the X needs to be divided by two before it goes in so that it is the proper actual size. And then we just need to offset it by half X as well.
Which means that side relative location X, Y, and Z going to be split.
Z and Y left alone and the X will just be our size split as well. X divided by two going into the X. And now we have a very temporary, very ugly, but still properly scaling and working white plane that scales and grows with the size that it needs to be.
And a very big thank you to all my patrons. You can see them on screen right now. If you want to help support the channel or get any of the project files in any of my tutorials, there's a link down below to the Patreon page to support me or alternatively as a YouTube member. With a special thanks to my cave students here supporters Oiku and Earl Montville Erno and my cave digger tier supporters Mauricio Ferrias, Cheng the dude and Joshua Mater.
Related Videos
Agentforce NOW AMA: Build with React and Salesforce Multi-Framework
SalesforceDevs
490 viewsβ’2026-05-28
How agent o11y differs from traditional o11y β Phil Hetzel, Braintrust
aiDotEngineer
450 viewsβ’2026-05-28
Re: π£οΈπthepropheduπ2026 GST 103 CLASS (E-EXAM REVISION)
theprophedu
636 viewsβ’2026-06-04
WEB TECHNOLOGIES UNIT-2 | Degree 4th sem BCOM Computers web technologies unit-2 full explanationπ―β
LearnwithSahera
1K viewsβ’2026-05-29
More tests are always better? How to use AI to identify tests that bring little value
Alliance4Qualification
335 viewsβ’2026-05-29
Search Algorithms Explained in 60 Seconds! π€π¨
samarthtuliofficial
218 viewsβ’2026-06-01
People of Game of Thrones using JavaScript DOM
AltCampus
296 viewsβ’2026-05-30
Instagram accounts got PWNed
EricParker
13K viewsβ’2026-06-03











