Homing Projectiles
Homing Projectiles
Problem
You want to create a projectile that when fired, will aim at a target.
Solution
Setting up the Part
Create the RocketPropulsion and the Part
object. Alternatively, you could make a missile with rocketpropulsion without a target, and put it in Lighting
, then Instance/Clone
the rocket.
Defining the target
This requires a Script
. The script will define the target’s BasePart/Position
, the thing you want to home in on!
Example:
game.Workspace.Part.RocketPropulsion.Target = game.Workspace.yourusernamehere.Head
Firing The Part
This also requires a Script
, this will set off your part (If BasePart/Anchored
) after The Target:
Example:
game.Workspace.Part.RocketPropulsion:fire()
Additional Features
The CartoonFactor property sets whether your part should head Directly towards it, ignoring the point its facing, or whether it faces straight at you. 1 Would be always facing at you. 0.5 Would be sort of facing you. 0 would be no effort to face you.
The RocketPropulsion/Abort
method, as its name suggests, aborts the RocketPropulsion’s mission to get to you, you could use this if your objects need fuel, and when the fuel is 0 they drop out of the sky.
Connecting The Event
You would need to do something like:
script.Parent.Touched:connect(function(hit) local a = hit.Parent and hit.Parent:findFirstChild("Humanoid") if a ~= nil then local rocket = game.Lighting.Rocket:clone() rocket.Position = Vector3.new(0, 200, 0) -- drop out of sky rocket.RocketPropulsion.Target = hit rocket.Parent = game.Workspace wait(0.01) rocket.RocketPropulsion:fire() end end)
This is what you might use in some place:
a = Instance.new("RocketPropulsion") a.Target = game.Players.PERSONNAME.Character.Torso a.Parent = game.Players.Name.Character.Torso
Discussion
In the example above, we create part, choose a target, and then fire. The projectile is assigned a target that will direct its aim. Let’s evolve that solution to create a smart projectile that will seek out the nearest player and follow them.
Insert a Part with the following:
- NumberValue { Name =
Speed
, Value =0.2
} - BodyGyro
- BodyPosition
- Script
In the Script, insert the following:
local part = script.Parent function moveTo(target) local dir = (target.Position - part.Position).unit part.BodyGyro.cframe = CFrame.new(0, dir) part.BodyGyro.maxTorque = Vector3.new(9000, 9000, 9000) part.BodyPosition.position = target.Position part.BodyPosition.maxForce = Vector3.new(10000, 10000, 10000) * part.Speed.Value end function findNearestTorso(pos) local nearest = { torso = nil, distance = math.inf } for _, object in ipairs(game.Workspace:GetChildren()) do if object:isA("Model") and object ~= script.Parent then local torso = object:findFirstChild("Torso") local human = object:findFirstChild("Humanoid") if torso and human and human.Health > 0 then local this = { torso = torso, distance = (torso.Position - pos).magnitude } if this.distance < nearest.distance then nearest = this end end end end return nearest.torso, nearest.distance end while true do local torso = findNearestTorso(part.Position) if torso ~= nil then moveTo(torso) end wait() end
This will make a brick that will follow you. In this example, a loop is attached to the projectile and is constantly looking for the nearest player. Whatever player is returned by findNearestTorso
becomes the projectile’s new target.