Assets and content¶
Nova resolves content through the deployment's asset proxy. Asset IDs use the
same rbxassetid:// form as Roblox, and the Content datatype is supported.
Common asset properties¶
local decal = Instance.new("Decal")
decal.Texture = "rbxassetid://123456789"
decal.Face = Enum.NormalId.Front
decal.Parent = workspace:WaitForChild("Poster")
local mesh = Instance.new("SpecialMesh")
mesh.MeshType = Enum.MeshType.FileMesh
mesh.MeshId = "rbxassetid://987654321"
mesh.TextureId = "rbxassetid://123456780"
mesh.Parent = workspace:WaitForChild("Statue")
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://555555555"
sound.Parent = workspace:WaitForChild("Speaker")
Properties that accept content use the Content type: Decal.Texture,
Sound.SoundId, MeshPart.MeshId, MeshPart.TextureID, Animation.AnimationId,
and similar. Assigning a plain string with the same rbxassetid:// form works.
Where assets come from¶
The official platform serves assets through its own proxy. The client does not talk to Roblox's asset CDN. That means:
- Assets uploaded to the Nova deployment resolve.
- Assets that exist only on Roblox may not resolve unless the deployment has imported or proxied them.
- A place that depends on a specific Roblox marketplace asset may show a placeholder or fail to load that asset.
If you are porting a place, inventory the assets it uses and confirm they exist on the target deployment before debugging the place logic.
Preloading¶
local ContentProvider = game:GetService("ContentProvider")
local assets = {
"rbxassetid://123456789",
"rbxassetid://987654321",
}
ContentProvider:PreloadAsync(assets)
Preload images, meshes, and sounds that must be ready on the first frame. Large places should preload during a loading screen rather than during gameplay.
Meshes and CSG¶
MeshPartis supported, including modern mesh formats v1–v5.SpecialMeshis supported.- CSG unions (
UnionOperation,NegateOperation,PartOperation) load, render, collide, and can be selected in Studio. - Mesh v4/v5 skinning data is parsed but not rendered; use non-skinned meshes.
AssetService and InsertService¶
AssetService and InsertService exist, but their modern methods are limited.
AssetService:LoadAsset is not part of Nova's surface. InsertService exposes
legacy insert/approval methods; it does not provide the modern asset-loading
API.
For runtime content, prefer:
- Store the asset IDs in a
ModuleScriptor configuration instance. - Preload them with
ContentProvider. - Create the instances (
Decal,Sound,MeshPart) yourself.
Common problems¶
| Symptom | Fix |
|---|---|
| Image is blank | The asset is not present on the deployment, or the ID is wrong. |
| Mesh is invisible | The mesh asset did not load; check MeshId and the Output window. |
| Sound is silent | Check SoundId, IsLoaded, and whether the sound is 3D-parented. |
| Texture looks flat | SurfaceAppearance is not supported; bake the texture into TextureID. |
| CSG union is missing | Check that the union asset loaded; re-import the place if needed. |