local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Настройки
local config = {
MaxSegments = 20, -- Переменная количества плит
PartsFolder = ReplicatedStorage:WaitForChild("Parts"),
SpawnModel = workspace:WaitForChild("Spawn")
}
-- Функция для получения случайной точки выхода из предыдущей модели
local function getRandomExit(pointFolder)
local points = pointFolder:GetChildren()
return points[math.random(1, #points)]
end
local function generateLevel()
local lastExitPoint = getRandomExit(config.SpawnModel.Points)
local allParts = config.PartsFolder:GetChildren()
for i = 1, config.MaxSegments do
-- Выбираем случайную модель из папки Parts
local randomModelTemplate = allParts[math.random(1, #allParts)]
local newPart = randomModelTemplate:Clone()
-- Находим точки в новой модели
local startPoint = newPart.Points:FindFirstChild("Start")
local endPointsFolder = newPart.Points
if startPoint then
-- Устанавливаем PrimaryPart для корректного перемещения
newPart.Parent = workspace
-- Магия позиционирования:
-- Мы вычисляем смещение новой модели так, чтобы её Start совпал с lastExitPoint прошлого объекта
local currentPivot = newPart:GetPivot()
local startRelativeCFrame = startPoint.WorldCFrame:ToObjectSpace(currentPivot)
local targetCFrame = lastExitPoint.WorldCFrame:ToWorldSpace(startRelativeCFrame)
newPart:PivotTo(targetCFrame)
-- Обновляем последнюю точку выхода для следующей итерации
lastExitPoint = getRandomExit(endPointsFolder)
-- Если в папке есть Start, его не считаем за выход
if lastExitPoint.Name == "Start" and #endPointsFolder:GetChildren() > 1 then
repeat lastExitPoint = getRandomExit(endPointsFolder)
until lastExitPoint.Name ~= "Start"
end
else
warn("В модели " .. newPart.Name .. " не найдена точка Start!")
newPart:Destroy()
end
end
end
-- Запуск генерации
generateLevel()