Skip to main content

Build and Runtime Troubleshooting

Use this page when the editor validates incorrectly, the PS1 build fails, or the runtime reports a load error.

Fast Triage

  1. Run Build > Validate Project.
  2. Open Problems and fix hard errors first.
  3. Open Build > Show PS1 Budget and inspect hard limits.
  4. Check Build/ps1/logs/ after a failed build.
  5. Inspect Build/ps1/disc_root/DATA/MANIFEST.JSN when a runtime asset cannot load.
  6. Test the generated .cue from Build/ps1/package/.

Common Build Issues

SymptomLikely causeFix
Missing runtime compiler toolsPrivate/source build selected without its toolchainUse the installed binary runtime or open Build > Tool Paths...
Missing Ninja pathPrivate/source runtime build selected without its build runnerConfigure Ninja for that source build; binary releases use the bundled runtime
Missing mkpsxiso pathTool path not configuredSet mkpsxiso executable path
Build & Run failsDuckStation path missing or invalidConfigure DuckStation path
Controller works in menus but not in 3D sceneDuckStation pad is mapped as digital, analog mode is off, or the emulator has no Port 1 mappingConfigure Port 1 as Analog Controller / DualShock and enable Automatically Enable Analog Mode, or press the mapped Analog/Guide button
Startup scene missingBuild Settings points to a missing sceneOpen Build > Build Settings...
Scene load fails at runtimeScene not included in Scenes In BuildAdd the scene to Build Settings
Package Disc Only failsNo available runtime or stale staged filesRun full Build PS1 (Release)

Runtime Load Errors

failed to load MANIFEST.JSN

Check:

  • Build/ps1/disc_root/DATA/MANIFEST.JSN exists,
  • packaging completed successfully,
  • the .cue points to the expected .bin,
  • the runtime is launched from the latest build output.

Missing script or script load error

Check:

  • the Lua Behaviour Script field points to an existing .lua file,
  • the script is under the project and staged into compact runtime folder DATA/L,
  • the script does not exceed the configured size limit,
  • the target callback function exists if a UI button or Interactable calls it.

Missing mesh, texture, material, or audio

Check:

  • the asset exists in Library/asset_db.json,
  • the source asset still exists under Assets/,
  • the imported output exists under Library/,
  • the staged file exists under the compact Build/ps1/disc_root/DATA runtime folders (S, L, M, R, T, A, or X),
  • Validate Project does not report missing GUIDs or files.

Streaming music does not play

Check:

  • the source WAV has Streaming Music (CD-XA) enabled,
  • no more than 8 streaming tracks are enabled,
  • Build/ps1/disc_root/DATA/X/ contains the encoded track,
  • the name passed to Music.Play() matches the WAV filename stem; comparison is case-insensitive,
  • the script checks the boolean returned by Music.Play().

Gameplay Issues

SymptomCheck
Player walks through an objectObject has Collider, Collider is not trigger, Level Builder placement created collider
Trigger does not fireCollider exists, Is Trigger is enabled, and the Lua Behaviour defines OnTriggerEnter
Interact does nothingPlayer has Interaction Ray, target has Interactable, and the configured function name matches exactly
UI button does nothingButton On Click target GameObject/function is set and the Lua Behaviour defines that function
SceneManager.LoadScene() does nothingTarget scene path is correct and included in Build Settings
Audio does not playGameObject has Audio Source, clip GUID exists, and the resident clip fits the SPU budget
Music does not playStreaming flag is enabled, track is staged in DATA/X, and Music.Play() uses the source filename stem
Save/load does not persistUse PlayerPrefs.Save() for typed preferences or SaveData.Flush() for raw values; use SaveData.Reload() before expecting fresh device data
Game uses the wrong refresh rateSelect NTSC or PAL under Project Settings, save, then run a full Release build instead of Package Disc Only
Progress Bar does not changeResolve it with UI.Find(), then check the boolean returned by ProgressBar.SetValue()
Navigation destination returns falseGameObject has an enabled root NavMesh Agent, referenced surface exists, preview bake has a connected path on that surface, and the complete route fits within 32 points
Agent crosses a dynamic obstacleRuntime navigation has no dynamic avoidance; use authored colliders in the bake or stop/replan from script
Portal room disappearsRenderer Room assignment, camera inside expected Room, Portal enabled/open and direction/two-sided state, non-zero opening size, and valid Portal transform
Timeline.Play() returns falseClip name matches exactly and the clip exists in the active scene
Native player still moves in a cutsceneEnable Disable Player Controls on the clip; custom Lua movement must be gated separately
Rumble is unavailableUse Rumble.IsSupported(); verify an analog/DualShock pad, DuckStation vibration mapping, and that the active BIOS handler supports the fail-closed optional output patch

Rendering and Performance Issues

SymptomCheck
Wall disappears very close to cameraNear-plane clipping, collider placement, oversized wall primitive
Polygons overlap incorrectlyLarge surfaces, far distance above safe range, transparent/double-sided materials
Scene is slowTriangle count, packet estimate, texture count, audio clips, active scripts
UI draws over world unexpectedlyUI element sort/order and foreground OT reservation
Transparent object sorts badlyKeep transparent surfaces small and isolated
VRAM packing conflictOpen VRAM Inspector, select the red region, reveal the texture, then change format/size and reimport
Mesh colors are missingImported mesh contains vertex colors and Mesh Renderer uses Mesh Vertex Colors
GTE lighting is flatMesh contains usable normals, scene lighting is active, and Mesh Renderer uses GTE Vertex Lighting
Distance fog band looks coarseIncrease geometry subdivision where a large triangle spans much of the fog range; PS1 fog is interpolated from per-vertex factors, not evaluated per pixel

For live runtime measurements, hold L1 + R1 and tap Select to toggle the hidden overlay. A frame value above 1, an increasing slow-frame count, packet drops, or Lua errors indicates a runtime issue worth investigating. Test both gameplay and scene transitions; loading frames are part of the observed session.

What to Save When Reporting a Bug

Include:

  • project name and active scene,
  • exact build command,
  • Problems panel output,
  • Console build/runtime logs,
  • Build/ps1/logs/ps1_budget_current_scene.json,
  • Build/ps1/logs/build_summary.json,
  • relevant script file,
  • screenshot or short video of the runtime issue,
  • whether the issue happens in editor Play Mode, DuckStation, or hardware.

Script, memory, and loading problems

SymptomWhat to try
Lua instruction or memory limit exceededShorten callbacks, avoid creating strings and tables every frame, and review the Lua budgets in Project Settings. Use a Debug build for source line information.
RAM budget exceeded after an updateBuild again to refresh the report, then reduce scene or asset size using the Budget Dashboard. Check scene transitions as well as individual scenes.
Music restarts after loadingXA playback resumes from the beginning of the track. Plan transitions with that behavior in mind.
Diagnostic text disappearsCheck packet-drop counters in the runtime overlay and reduce geometry or UI load.
Saving or loading failsOpen Save Data Simulator, check the selected failure mode, and inspect SaveData.GetLastError(). Show a failure message and a retry option in your game.