--- id: wiki-2026-0508-skybound-skill-asset-integration title: Skybound Skill Asset Integration category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Skybound Skill Pipeline, Skill Asset Pipeline, Faction Skill Integration] duplicate_of: none source_trust_level: B confidence_score: 0.85 verification_status: applied tags: [game-design, asset-pipeline, skill-system, war-commander, skybound] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: typescript framework: asset-pipeline --- # Skybound Skill Asset Integration ## 매 한 줄 > **"매 skill 은 매 asset bundle 의 contract 다."**. Skybound Skill Asset Integration 은 War Commander 의 Skybound faction 새로운 skill 추가 시, design data (json), VFX (particle), audio, animation, UI icon 의 5 개 asset 을 단일 manifest 로 묶고 매 client 가 atomic 으로 load 하도록 하는 pipeline. 매 2026 LiveOps 의 hot-patch skill drop 의 표준 패턴 — skill 추가 시 client 강제 update 없이 OTA 적용 가능. ## 매 핵심 ### 매 Pipeline Stages 1. **Design**: skill stat json (cooldown, damage, type) 2. **VFX**: particle effect bundle (Unity/Unreal addressable) 3. **Audio**: SFX wav + mixer routing 4. **Animation**: skeletal anim clip + state machine entry 5. **UI**: icon, tooltip locale strings ### 매 Manifest Contract - 매 skill = 매 unique skillId - manifest 는 asset hash + version + dependencies - client 가 매 skill 사용 시 manifest verify → fallback to default if missing - 매 OTA delivery: CDN-backed, signed manifest ### 매 응용 1. War Commander Skybound expansion: monthly new skill drop. 2. Generic faction-DLC pipeline. 3. Live event one-shot skills. ## 💻 패턴 ### Pattern 1 — Manifest schema ```typescript interface SkillManifest { skillId: string; version: string; designJson: AssetRef; vfxBundle: AssetRef; audioBundle: AssetRef; animClip: AssetRef; uiIcon: AssetRef; signature: string; // 매 server-signed } interface AssetRef { url: string; hash: string; sizeBytes: number; } ``` ### Pattern 2 — Atomic loader ```typescript async function loadSkill(manifest: SkillManifest): Promise { await verifySignature(manifest); const [design, vfx, audio, anim, icon] = await Promise.all([ fetchAsset(manifest.designJson), fetchAsset(manifest.vfxBundle), fetchAsset(manifest.audioBundle), fetchAsset(manifest.animClip), fetchAsset(manifest.uiIcon), ]); for (const [a, ref] of [ [design, manifest.designJson], [vfx, manifest.vfxBundle], [audio, manifest.audioBundle], [anim, manifest.animClip], [icon, manifest.uiIcon], ] as const) { if (sha256(a) !== ref.hash) throw new Error('HASH_MISMATCH'); } return assembleSkill(design, vfx, audio, anim, icon); } ``` ### Pattern 3 — Fallback to default ```typescript async function loadSkillSafe(skillId: string): Promise { try { const manifest = await fetchManifest(skillId); return await loadSkill(manifest); } catch (e) { logger.warn('Skill load failed; falling back', { skillId, err: e }); return loadDefaultSkill(); } } ``` ### Pattern 4 — Hot-patch detection ```typescript async function checkForSkillUpdate(skillId: string, currentVersion: string): Promise { const remote = await fetchManifestHead(skillId); return remote.version !== currentVersion; } ``` ### Pattern 5 — Server-side signing ```typescript function signManifest(manifest: Omit, key: PrivateKey): string { const payload = canonicalJson(manifest); return ed25519.sign(key, payload).toString('hex'); } ``` ### Pattern 6 — CDN cache prewarming ```typescript async function prewarmManifests(skillIds: string[]): Promise { const manifests = await Promise.all(skillIds.map(fetchManifest)); const refs = manifests.flatMap(m => [m.designJson, m.vfxBundle, m.audioBundle, m.animClip, m.uiIcon]); await Promise.all(refs.map(r => prefetch(r.url))); } ``` ### Pattern 7 — Localization fallback ```typescript function resolveTooltip(localeStrings: Record, locale: string): string { return localeStrings[locale] ?? localeStrings['en'] ?? ''; } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Mobile + bandwidth concern | Lazy-load: only fetch on first use | | Frequent hot-drop skill | Prewarm all active manifests on app start | | Dev/testing | Local override manifest | | Highly competitive PvP | Mandatory pre-load to prevent visual desync | **기본값**: lazy-load + prewarm popular skills, mandatory hash verify, ed25519 signature, fallback to default skill. ## 🔗 Graph - 부모: [[Live Operations (LiveOps)]] · [[CI_CD_Pipeline|CI_CD Pipeline]] - 변형: [[Sarkis-Cloning-Technology]] · [[Beresnev Studio]] - 응용: [[War-Commander-Combat-Ecosystem]] · [[War-Commander-Event-Operations]] - Adjacent: [[Code Splitting Lazy Loading (코드 분할 및 지연 로딩)]] · [[Server Architecture]] ## 🤖 LLM 활용 **언제**: skill OTA 파이프라인 설계, manifest schema 검토, asset versioning. **언제 X**: built-in only static skill 게임 — pipeline overhead 불필요. ## ❌ 안티패턴 - **No signature verify**: 매 client 가 매 임의 manifest 로 skill replace 가능 → cheat. - **No hash check**: 매 corrupted asset → 매 silent crash. - **All-or-nothing load**: 매 single asset 실패 → 매 entire skill 사용 불가 (fallback 누락). - **Cache poisoning**: CDN edge 의 stale manifest → version drift. ## 🧪 검증 / 중복 - Verified (Unity Addressables docs, Unreal Pak system, Skybound expansion notes). - 신뢰도 B. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — manifest schema + 7 patterns + OTA flow |