Simultaneously export multiple models separately (e.g Studio -> Blender)

As a Roblox developer, it is currently hard to export multiple models as separate .obj or .fbx files in one click from Studio to another software. The only alternative way is by separately exporting each model or object one-by-one, which is time consuming, especially when having to export a large amount.

The issue I am currently facing is that I have to export 800+ objects (both Models and MeshParts) to convert the same amount of assets found in multiple ViewportFrames (which appears to be demanding on the memory usage) to imagery such as .PNG or .JPG for performance improvements in the game I work for.
This is a rare case scenario with the amount, but I’m sure that even for smaller counts it’d still improve the workflow of exporting multiple separate things to e.g Blender.

If Roblox is able to address this issue, it would improve my development experience because I won’t have to individually export 800+ assets right now and I’m sure it’ll be of great use later on as well, in case a similar issue confronts me like this. :sweat_smile:

24 Likes

Up! I really want this feature to be added even after all the time.

2 Likes

Necrobump because same.

Surely it’s easy to add this to the already existing framework? Instead of exporting a Model and converting that into the .obj why not seperately export each Child so that they can be imported as seperate instances.

Studio allows us to import in bulk, it’s far past time to allow us to export in bulk.

1 Like

A engineer noted that the exporting system is very hard coded into the rendering system and making changes to it can be difficult, so I would take their word for it…

1 Like

I get that :confused:

I’ve tried making a Plugin that does exactly this - I’ve got it so far to the point it opens X amount of windows for the parts to be exported however once a single window is closed they all then close in unison. :face_with_peeking_eye:

1 Like

bump because i need this very much

4 days later I’m going to bump, because I’m trying to export a gun and all the textures don’t export correctly.

1 Like

I’m also gonna rebump so theres constant interest :eyes:

USE CASE:

We currently export all our furniture items in Restaurant Tycoon 2 as .obj files in order to render a nice thumbnail of them (which we then upload as a decal)
Since the game has 1000+ furniture items, its very time consuming to export every furniture item as an .obj file, so some way to export many furniture items in bulk would be very useful

Roblox. Please.

I have spent over 5 days writing a serializer to port my Luau data files to TypeScript. I have over 3000 files. I wrote a plugin to do this, actually:

Plugin
local pluginModule = {}
local plugin: Plugin -- Local plugin reference

-- Initialize the plugin reference if not already set
function pluginModule:Initialize(pluginReference: Plugin)
	if plugin ~= pluginReference then
		plugin = pluginReference;
	else
		error("Plugin is already initialized");
	end
	
	self.menuItem = plugin:CreatePluginMenu("noire-utils", "Noire's Utils");
	local action = plugin:CreatePluginAction("nu-save", "Save Individually to Disk", "Save selected items to disk.", "rbxassetid://0");
			
	action.Triggered:Connect(function()
		if (self.isSaving) then
			return warn("Save process is already in progress. Please finish the current routine before trying again.")
		end

		self:Save();
	end)	
	
	
	game:GetService("UserInputService").InputBegan:Connect(function(io)
		if (io.KeyCode == Enum.KeyCode.RightControl) then
			print('hey')
			self.menuItem:ShowAsync()
		end
	end)

	self.menuItem:AddAction(action)
end

function pluginModule:IsInitialized()
	return not not plugin;
end

-- Check if the plugin reference is set and print out appropriate info
function pluginModule:CheckForPluginGlobal()
	if plugin ~= nil then
		print("Plugin reference is set!");
	else
		warn("Plugin reference is missing!");
	end
end

function pluginModule:Save(what: Instance | {Instance})
	if (not self:IsInitialized()) then
		return error("Plugin is not initialized.");
	end	
	
	self.isSaving = true;
	warn("Save started.");
	if (not what) then
		what = game:GetService("Selection"):Get();
	elseif (typeof(what) ~= "table") then
		what = { what };
	end
	
	if (not plugin) then
		return;
	end
	
	for idx, item in what do
		local fixedName = item.Name:gsub("[!\\/:%?%^%[%]%$]", "-")
		warn(`Saving {item:GetFullName()} as {fixedName}. ({idx}/{#what})`);
		game.Selection:Set({item});
		if (not plugin:PromptSaveSelection(fixedName)) then
			warn(`User did not save {fixedName} to file. Cancelling operation.`);
			self.isSaving = false;
			return;
		end
	end
	
	warn("Save completed.");
	self.isSaving = false;
end

return pluginModule;

But I still have to spam enter for over 20 minutes straight if I want to export all character, generic, and passive data scripts because it’s only achievable individually. And, what’s worse is as I’m a Linux/NixOS user, I have to use Wine with Vinegar. The file explorer with Wine gets exponentially slower with every file which means that I have to constantly navigate to different folders during the exporting process in order to get anything done.

It would be nice if we were given a “folder lock” with a max size constraint which would deem an empty output (or temporary) folder to be deemed trustworthy, allowing us to do operations on the folder (mostly) freely. It achieves a balance where the control lies in the developer’s hands and the safety in the user’s hand.

Please, we still need this in big 2026 :frowning:

Bumping this, it would be EXTREMELY useful