Hello. Since i can make linear interpolation on one segment, i need your help how to make an object to go to other segment. There’s an image:
and the code:
local RunService = game:GetService("RunService")
local part = script.Parent
local trackNetwork = {}
local NodeSegments = {
seg1 = {
Vector3.new(-130, 0.5, -70),
Vector3.new(-130, 0.5, -20),
Vector3.new(-151.75, 0.5, 18),
Vector3.new(-151.75, 0.5, 68),
},
seg2 = {
Vector3.new(-151.75, 0.5, 68),
Vector3.new(-151.75, 0.5, 113),
Vector3.new(-151.75, 0.5, 163),
Vector3.new(-136.75, 0.5, 213),
Vector3.new(-96.75, 0.5, 248),
},
seg3 = {
Vector3.new(-96.75, 0.5, 248),
Vector3.new(-46.75, 0.5, 263),
Vector3.new(3.25, 0.5, 263),
Vector3.new(53.25, 0.5, 263),
Vector3.new(103.25, 0.5, 263),
}
}
trackNetwork[1] = NodeSegments.seg1
trackNetwork[2] = NodeSegments.seg2
trackNetwork[3] = NodeSegments.seg3
local nodes = trackNetwork[1]
local segmentLengths = {}
local totalTrackLength = 0
for i = 1, #nodes - 1 do
local len = (nodes[i+1] - nodes[i]).Magnitude
segmentLengths[i] = len
totalTrackLength = totalTrackLength + len
end
local triggers =
{
distance = 50,
name = "Ograniczenie_40",
}
local function getPositionAtDistance(targetDist)
targetDist = math.clamp(targetDist, 0, totalTrackLength)
local run = 0
for i = 1, #segmentLengths do
local segLen = segmentLengths[i]
if run + segLen >= targetDist then
targetDist -= run
local a = targetDist/segLen
return nodes[i]:Lerp(nodes[i+1], a)
end
run += segLen
end
return nodes[#nodes] --safety reasons if the table returns nil
end
local speed = 20
local currentDist = 0
local function checkTriggers(prevDist, currDist)
--print(prevDist, currDist)
for _, trigger in pairs(triggers) do
-- Sprawdzamy, czy w tej klatce minęliśmy pozycję wyzwalacza (jazda do przodu)
if prevDist < triggers.distance and currDist >= triggers.distance then
print("test")
end
end
end
wait(5)
print(3)
wait(1)
print(2)
wait(1)
print(1)
wait(1)
RunService.Heartbeat:Connect(function(dt)
if totalTrackLength == 0 then return end
local previousDist = currentDist - 10
currentDist = math.clamp(currentDist + speed * dt, 0, totalTrackLength)
part.Position = getPositionAtDistance(currentDist)
checkTriggers(previousDist, currentDist)
end)
How to make an object to go to next segment (from segment 1 to segment 2, from segment 2 to segment 3 etc.)?
I tried to use this code inside Hearbeat:
for i = 1, #trackNetwork do
print(trackNetwork[i])
if currentDist >= totalTrackLength then
currentDist=0
nodes = trackNetwork[i]
end
end
At first, it seems okay, object moves to segment 2, but when the object is inside segment 2, instead of going to segment 3, it loops inside segment 2. Should I convert a for loop of totalTrackLength into function?
