So my personal project this week was recreating Tracer’s Blink mechanic from Overwatch. There’s a million tutorials on youtube of this, but 90% of them only do blinking in the direction you’re facing, and a handful do the actual 8-directional blink. I have figured out the directional blink in two different ways that both seem to work okay in any situation where I am running around normally.
My issue is dealing with inclines. Currently, my BP finds the blink destination and uses a Move Component To node over .1sec to take me there. I had originally set up a Line Trace to make this conditional on not hitting something (and if hitting something, move me to the 100 units from the collision), but have since deleted that to figure out how to deal with inclines. This behavior makes it so I can’t blink up things like stairs or slopes, since the stairs will trigger the line trace and set the blink distance short.
I also tried using Launch Character instead of Move To but it was not really what I wanted at all.
The current iteration that I’ll post below is very basic, with no collision testing or anything, just showing you how the basic blink I have is set up, and it teleports me inside of things since I’m not checking. How would you guys deal with moving up and down walkable slopes with a teleport-style ability while also preventing myself from going inside of things that aren’t walkable?
Here’s my BP:
I get velocity, remove any z-axis motion, normalize it to make sure it’s still length one vector (when I didn’t do this, looking straight up or straight down killed my blink distance), and then select either my movement direction or just a default forward direction based on if I am moving or not (if I am not moving at all I just go forward), then multiply it by blink distance (750), add to location, set that as blink location, and move my component.
how about working with the navigation data to find a location near where your trying to get to. basically do a line trace then if theres a hit you try again but instead of a trace you try finding pathing. then you just do some checks to be sure you didnt teleport through a wall and set location.
heres a little test setup i was working with to try it. of course this is a rough example so it would need to be dialed in and values tweaked. also this is just an idea to add to the mix.
I am fairly new to navigation and UE4 in general, can you explain what you did here?
Does that “find path to location synchronously” node require a nav mesh or anything along those lines? I’ve set up nothing in terms of defining navigable areas.
Is the branch checking for path length just making sure the character didn’t take a roundabout path to get there?
Adding 88 to the Z-location?
Sorry, again I’m fairly new, so I’m not sure exactly what some of these nodes are doing in this context!
let me preface with this is not a 100% solution just an idea i had that could merit exploration.
Does that “find path to location synchronously” node require a nav mesh
yes it does require a nav mesh since thats how the location will be calculated.
Is the branch checking for path length just making sure the character didn’t take a roundabout path to get there?
i put that in to prevent moving through walls. for example lets say you were outside a castle and the nearest entrance was 10,000uu from the character. it wouldnt make much sense if the character could just blink through the wall and in, my understanding of tracer is shes just fast but in a little sprint kind of way (never played overwatch).
Adding 88 to the Z-location?
the add to the z location was to compensate for the capsule halfheight. basically when i was playing around with it i noticed that i was sometimes going into stairs due to the navmesh being wonky / not calculated correctly (the nav mesh was going through the stairs a bit). the origin for the character is actually right in the middle of the capsule so if i want their feet to be at the location on the nav mesh i had to offset by half the capsule height. the engine actually has some compensation built in for this but it wasnt quite enough in this instance.