PcoWSkbVqDnWTu_dm2ix
We use cookies on this site to enhance your user experience

Homing Projectiles

Homing Projectiles

Jun 29 2018, 4:51 PM PST

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.

Tags:
  • gameplay
  • script