Here is my module script:
function Module:NewBoid(Origin, Environment)
local NewBoid = setmetatable(Classes.Boid, {})
NewBoid.Environment = Environment
NewBoid.Body = Templates.Body:Clone();
NewBoid.Speed = 1;
NewBoid.Range = 15;
NewBoid.Fov = 0.5;
NewBoid.Enabled = true;
-- Body
NewBoid.Body.Parent = NewBoid.Environment
NewBoid.Body.Position = Origin
return NewBoid
end
function Classes.Boid:Update()
local LookDirection = self.Body.CFrame.LookVector
local BoidsInRange = {}
for BoidI, Boid in pairs(self.Environment:GetChildren()) do
if Boid:IsA("BasePart") then
local Sub = Boid.Position - self.Body.Position
local Distance = Sub.Magnitude
local LookDot = LookDirection:Dot(Boid.CFrame.LookVector)
if Distance <= self.Range and LookDot > self.Fov then
table.insert(BoidsInRange, Boid)
end
end
end
for BoidI, Boid in pairs(BoidsInRange) do
local Sub = Boid.Position - self.Body.Position
local Distance = Sub.Magnitude
local Ratio = math.clamp(Distance / 4, 0, 1)
LookDirection -= Ratio * Sub
end
self.Body.Position += (LookDirection / 4) * self.Speed
self.Body.CFrame = CFrame.lookAt(self.Body.Position, self.Body.Position + LookDirection)
end
function Classes.Boid:Destroy()
self.Body:Destroy();
self.Range = nil;
self.Enabled = nil;
self = nil
end
return Module
If you can’t tell, I am trying to simulate boids/birds, It’s not finished though.