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.
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.
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…
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.
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
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.