원클릭으로
sloparena-build-export
Build, export, and release SlopArena — Godot export presets, CI/CD pipeline, and common export failure fixes.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Build, export, and release SlopArena — Godot export presets, CI/CD pipeline, and common export failure fixes.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Show status of all local feature branches vs main — commits ahead/behind, last message, open PR if any. Also helps draft a squash-merge PR description. Run at session start or before switching branches.
Run SlopArena Shared.Tests with an optional filter. Rebuilds Shared DLL first. Usage — user types "/sim-test" or "/sim-test knockback" or "/sim-test MankiKit". Call this whenever testing sim behavior after a Shared change.
SlopArena — Smash/DKO-style 3D platform fighter movement & combat. ACTIVE: Unity 2022.3 C# (main branch). Camera-relative 8-direction movement, Smash-style % system, 1s dash with invincibility, double jump.
Full pipeline for adding a new character to SlopArena: concept, kit, 3daistudio prompt, model import, AnimationTree setup, and C# code wiring. Covers embedded GLB animations + .tscn wrapper approach.
SlopArena entity architecture — NPCs, hitboxes, entity IDs, processing order, bone attachments, and per-character components
SlopArena server-authoritative netcode — UDP localhost, tick system, client-side prediction, rollback, bone-accurate hurtboxes
| name | sloparena-build-export |
| description | Build, export, and release SlopArena — Godot export presets, CI/CD pipeline, and common export failure fixes. |
Located in export_presets.cfg. Current presets:
| Preset | Platform | Path | Single-file |
|---|---|---|---|
| 0 | Windows Desktop | build/windows/SlopArena.exe | Yes |
| 1 | Linux | build/linux/SlopArena.x86_64 | Yes |
Key settings for single-file distribution:
binary_format/embed_pck=true — embeds .pck in .exedotnet/embed_build_outputs=true — embeds .NET runtime DLLs in .exeexport_filter="all_resources" — include everythinginclude_filter="data/*.bin" — force-include raw .bin filesexclude_filter="tools/*" — exclude dev toolsSymptom: GDEExtention: failed to copy shared object during Windows export. Linux works fine.
Cause: Roslynator analyzers with IncludeAssets=runtime;native — Godot tries to copy their native DLLs.
Fix: Change to IncludeAssets=analyzers only in SlopArena.csproj:
<PackageReference Include="Roslynator.Analyzers" Version="4.15.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>analyzers</IncludeAssets>
</PackageReference>
Symptom: Baked skeleton data loads in editor but not in exported build. Hurtboxes fall back to inaccurate capsules.
Cause: .bin files have no .import metadata — Godot skips them even with export_filter="all_resources".
Fix A (export filter): Add include_filter="data/*.bin" in export presets. Works when .pck is separate.
Fix B (embedded resource): Add <EmbeddedResource Include="data/*.bin" /> to .csproj, then load from assembly manifest as fallback. Works with single-file exports. See references/embedded-resource-loading.md.
Symptom: Parse error on tools/bake_arenas.tscn:4 during export e.g. Parse Error. [Resource file res://tools/bake_arenas.tscn:4]
Cause: Two possibilities:
[ext_resource] declarations to come BEFORE [node] blocks that reference them. If out of order, ExtResource() ID can't be resolved..godot/ cache references it.
Fix:[ext_resource] lines appear above all [node] blocks..godot/ cache.exclude_filter="tools/*" to export presets as safety net. Note: Godot still parses excluded files during resource scanning, so a broken tscn can crash the export even with the exclude filter in place. The tscn must be valid regardless.Symptom: StartLocalServer() tries to launch ServerApp.dll from the filesystem. ProjectSettings.GlobalizePath("res://") doesn't resolve in exported builds.
Fix: Guard with OS.HasFeature("editor"):
private void StartLocalServer(CharacterClass playerClass)
{
if (!OS.HasFeature("editor")) return;
// ... launch process
}
The sandbox uses local ServerSimulation — no external process needed.
Symptom: You edit export_presets.cfg by hand, then open Export → Presets in Godot to change one option. All your manual edits vanish — Godot rewrites the entire file on save.
Root cause: Godot treats export_presets.cfg as its own file. Opening the Export dialog and clicking OK rewrites every section, discarding anything not in the UI.
Fix: Either:
grep embed_build_outputs export_presets.cfg should show true for both presets.data_SlopArena_* folder persists — MAY be required at runtimeSymptom: After export with dotnet/embed_build_outputs=true, a data_SlopArena_windows_x86_64/ folder full of DLLs appears. Looks like the setting didn't work.
⚠️ BEHAVIOR DIFFERS BY EXPORT HOST:
| Export host | Assemblies embedded? | Runtime requires data_* folder? |
|---|---|---|
| Native Windows | ✅ Yes (into .pck) | ❌ Can delete — harmless artifact |
| Linux → Windows (cross-compile) | ❌ NOT embedded (Godot 4.6 bug on Linux host) | ✅ MUST keep — only copy of 77 MB assemblies |
| GitHub Actions (ubuntu) | ❌ NOT embedded — CI succeeded with official Godot binary but data_* folder was still produced and zipped alongside .exe | ✅ MUST keep — ship zip as-is, folder required at runtime |
Verification: Check whether assemblies are actually inside the .exe's embedded .pck. See references/pck-forensics.md for the full procedure, but quick check:
du -sh build/windows/data_SlopArena_*/ (~77 MB) vs stat --format=%s build/windows/SlopArena.exe (~101 MB). If PCK is only 5-6 MB when assemblies are 77 MB, they're NOT embedded.Root cause: dotnet publish always produces the data_* folder. On native Windows, Godot also embeds a copy into the .pck. On Linux→Windows cross-compile, the embedding fails silently — the data_* folder is the ONLY copy.
Fix:
.exe + data_SlopArena_windows_x86_64/ together. The data_* folder is required at runtime.Action type not found in MankiAbilities.csSymptom: Friend clones the repo, opens in Godot 4.6.3 .NET with .NET 8 SDK, gets compile error on private readonly Action _onFinished; — "The type or namespace name 'Action' could not be found."
Cause: Action is System.Action (the standard .NET delegate type). The file only has using Godot; and using SlopArena.Shared; — missing using System;. Some .NET SDK configurations have implicit usings enabled, others don't, depending on how Godot .NET was installed.
Fix: Add using System; to the file:
#nullable enable
using System;
using Godot;
using SlopArena.Shared;
Prevention: Always add explicit using System; in files that use Action, Func, Task, or other System-namespace types. Don't rely on implicit usings — they're inconsistent across Godot .NET installations.
Workflow: .github/workflows/release.yml
Trigger: Push to release branch, or manual dispatch (workflow_dispatch).
Uses firebelley/godot-export@v8.0.0 — downloads official Godot .NET binary from GitHub releases.
⚠️ Critical pitfalls with this action:
- Must use full SemVer tag (
@v8.0.0, not@v8or@v6). GitHub Actions looks for the exact tag.- No mono headless build exists — Godot doesn't ship a headless mono binary. Use the full editor URL:
Godot_v4.6.3-stable_mono_linux_x86_64.zip- The v8 API is completely different from v6 — see
references/firebelley-godot-export.mdfor details.
The v8 action exports ALL presets in one job using presets_to_export:
- uses: firebelley/godot-export@v8.0.0
with:
godot_executable_download_url: https://github.com/godotengine/godot/releases/download/4.6.3-stable/Godot_v4.6.3-stable_mono_linux_x86_64.zip
godot_export_templates_download_url: https://github.com/godotengine/godot/releases/download/4.6.3-stable/Godot_v4.6.3-stable_mono_export_templates.tpz
relative_project_path: ./
use_preset_export_path: true # respect export_path in presets
archive_output: true # auto-zips each preset's output
cache: true # cache Godot binary between runs
presets_to_export: "Windows Desktop,Linux"
Key differences from v6:
godot_version, godot_dotnet, platform, preset_name, project_path inputspresets_to_export is a comma-separated list of preset NAMESarchive_output: true creates zips automaticallyPush to release branch:
git push --force origin main:release
Or trigger manually: GitHub → Actions → "Export & Release" → "Run workflow".
The release zip contains SlopArena.exe + data_SlopArena_windows_x86_64/ folder. Keep the data_* folder — it's required at runtime on Windows unless native Windows export verified the .exe is standalone.
build/ is gitignored. Export outputs go here:
build/windows/SlopArena.exe — single-file Windows buildbuild/linux/SlopArena.x86_64 — single-file Linux buildWithout single-file settings, Godot creates a data_SlopArena_* folder with .NET runtime DLLs alongside the .exe.
After any change to export presets or .csproj:
dotnet build --nologo # must pass with 0 errors
Before pushing to release branch:
grep embed_build_outputs export_presets.cfg — both presets should show truegrep export_filter export_presets.cfg — should be "all_resources", not "scenes"dotnet build --nologo — 0 errorsAction/Func/Task has using System; at top.csproj Roslynator packages have IncludeAssets=analyzers (not runtime; build; native; ...)Then export in Godot or push to CI:
data_* folder — required at runtime