I’m trying to create a single, clean-looking projectile in studio just for practice and I want it to behave similarly to what’s shown in this video linked below. I’m looking for the best approach to make the projectile move smoothly and hit targets accurately. I’ve seen different methods mentioned like CFrame updates, LinearVelocity, Raycasting, and FastCast, but I’m unsure which would give the most consistent and polished results for this type of effect. If anyone has experience making something like this or has tips on what method works best, I’d really appreciate the help. Thanks!
Thanks for the reply! I’ve seen FastCast mentioned a lot and I appreciate the link, but I’ll be honest, using a full module like FastCast kind of feels like cheating to me. I know it’s super efficient and widely used, but I was hoping to learn how to build something like this myself, even if it’s more work. It just feels more satisfying to understand and control the entire system, especially for a unique projectile that isn’t meant to be hitscan or gun-like. Or is there a reason FastCast is really the best option even for slower, more magical type of projectiles?
I use Raycasting for my projectile system, any given projectile has a set Speed, the Speed value is actually the distance of each Raycast per step (basically a task.wait() loop).
I set this up in a module with a single function that handles this for all projectiles
the function takes in these as arguments
a base part
a data table {Speed: number,ForceHit: bool} (its a table so the value can be modified as the projectile moves)
an instance ignore table for the raycast
It creates a loop and each step 1 of 4 things can happen, the ray either hits something, hits nothing, the ForceHit value was set true, or the projectile was removed
if the ray hits something, it stops the loop, moves the object to the hit position, and ends the loop
if the ray hits nothing, the object moves in its lookVector by Speed
if the ForceHit is set the loop ends
if the projectile was removed the loop ends
when the loop ends it returns a few values
if the ray hits it returns true, HitPart, HitPosition, HitNormal
otherwise it returns false, nil, nil, nil
You can of course experiment with different ideas to make something that works best for your use case, but hope this helps!
Thanks a lot for the breakdown — this is actually super helpful and a lot closer to what I was hoping to build. I really like how straightforward the setup is with just a part, some basic data, and a loop with raycasting. It sounds lightweight and pretty flexible. I was honestly worried I’d need something overly complex or end up relying on something like FastCast by default, but this gives me some confidence that I can roll my own version.
I don’t use any tweens, adds extra cost to the projectiles. they simply have their CFrame updated once per frame. since its once per frame anyway a tween would do nothing besides waste CPU time.