What engine/scripts.js actually is
In a folder-mode Playworks/Luna export, index.html is a thin shell. It doesn't contain the playable's logic itself — it loads it from a separate file with a line like <script src="engine/scripts.js" defer="defer"></script>. That one file is the compiled Unity runtime: the WebGL/asm.js code that boots the engine and starts your scene. Without it, the HTML shell has nothing to run — there's no fallback, no partial mode, no degraded experience. Either the runtime loads, or the playable is just a blank page.
This is different from a missing image or sound clip, which affects one asset. engine/scripts.js gone means the entire build is inert.
Why its absence breaks conversion
Turning a folder-mode export into a single self-contained creative (what AppLovin, Meta, Unity Ads, and Vungle all require) means reading engine/scripts.js off disk and inlining it directly into the output HTML in place of that <script src="engine/scripts.js"> tag. If the file isn't where the export says it should be, that read fails outright — there's nothing to inline. The equivalent problem exists on the other export shape too: a single-HTML/cache-mode export doesn't have engine/scripts.js at all, but needs a complete cache/<id>/{scripts,jsons,blobs}.js triplet in its place, and if even one of those three files is missing, the same kind of failure happens for a different reason.
The good part: this fails cleanly rather than quietly. PlayableKit's converter processes each ad network independently, so a missing engine file on one network doesn't abort the whole batch or the other networks that don't need that path — it's reported as a specific, per-network error instead of a silently broken package with a dead script reference inside it. If you're looking at the raw export in a browser rather than through a converter, the failure mode is a blank white or black screen with a 404 for engine/scripts.js sitting in the console — see Unity Playworks/Luna export won't open for that side of it.
Real causes
- A partial or interrupted export from Unity. If the Playworks/Luna export was cancelled, the Unity Editor crashed mid-write, or the ZIP was copied before Unity finished generating it,
engine/scripts.jscan simply never get written — the export folder looks complete at a glance (index.html is there, the asset folders are there) but the one file that matters most is the one that didn't make it. - A mode mismatch between how the export was built and how it's being read. Playworks/Luna can produce two different shapes: a folder-mode export with a plain
engine/scripts.js, or a single-HTML/cache-mode export where everything is baked into acache/<id>/folder instead and there's noengine/folder by design. If you're expecting one shape and got the other — or a tool downstream is checking for the wrong one — you'll see exactly this "engine/scripts.js missing" result even though the export itself might be perfectly complete, just built as the other shape. Unity Playworks vs Luna export format covers how to tell the two apart in about ten seconds. - A ZIP that dropped files during transfer or re-packaging. Email attachment limits, a cloud-sync upload that got interrupted partway, or someone manually re-zipping just the files that "look" necessary (index.html and the visible images, skipping the
engine/folder because it doesn't look like game content) will all produce a ZIP that opens fine and looks plausible, but is missing the one file the whole build depends on.
How to check which export mode you actually have
Don't guess — open the ZIP and look:
index.htmlsitting next to anengine/folder with its ownscripts.js, plus a visible spread of separate asset files, means folder mode. Ifscripts.jsisn't inside that folder, that's the problem, full stop.- A
cache/<id>/folder containingscripts.js,jsons.js, andblobs.jstogether means single-HTML/cache mode — and in that case, noengine/scripts.jsis expected to exist at all. What matters there is whether all three cache files are present for the same id.
How to fix it
- Re-export cleanly from Unity Playworks/Luna. Let the export finish completely without touching the output folder while it's writing, confirm there's enough disk space, and check that no antivirus or sync tool is quarantining or locking files mid-write. Then re-zip the entire output folder as-is — don't hand-pick files out of it.
- Confirm you're using the right mode for the shape you have. If your export has a
cache/<id>/folder, that's the complete build — there's no separate engine file to go looking for. If it has anengine/folder, make surescripts.jsis actually inside it and wasn't excluded by whatever zipped or transferred the export. - Verify the ZIP itself, not just the export. If Unity's own output folder has
engine/scripts.jsbut your uploaded ZIP doesn't, the file was lost somewhere between the export and the upload — re-zip directly from the original export folder rather than a copy that's already passed through email, chat, or a shared drive.
engine/scripts.js is present but the build still fails, the more common issue is a partial Luna cache rather than the engine script itself — see Unity Playworks vs Luna export format for how the two export shapes differ and what each one actually needs to be complete.
How the free Validator surfaces this instead of a cryptic failure
PlayableKit's Playable Ad Validator checks a raw export ZIP for exactly this before you spend a conversion attempt or a network review cycle finding out the hard way. Its "Engine / cache assets" check looks for engine/scripts.js or a complete cache/<id>/{scripts,jsons,blobs}.js set, and if neither is present it says so directly: no engine script and no complete cache set found, so this doesn't look like a usable Unity Playworks/Luna export. That's the specific, actionable version of the problem — not a generic "conversion failed," not a blank screen with no explanation, and no signup required to check it.
| Where you'd see it | What it looks like |
|---|---|
| Free Validator | "Engine / cache assets" check fails with a direct explanation, before any conversion runs. |
| Conversion pipeline | That one network fails with a specific error; other requested networks still convert. |
| Opening the export raw in a browser | Blank canvas, with a 404 for engine/scripts.js visible in the console. |