| Unity Shuriken 模組 | 網頁等價做法 | 成本評價 |
|---|---|---|
| Emission/Shape(發射率、發射形狀) | 手寫發射邏輯(本專案:GameUtils.getParticle 物件池+spawn 參數) | 要寫碼 邏輯簡單但沒視覺化調參 |
| Velocity/Force over Lifetime | 每幀更新 vx/vy+重力/阻力(本專案已有) | 等價 |
| Color/Size over Lifetime | 依 life/maxLife 插值(本專案已有) | 等價 |
| 渲染(Billboard/拉伸) | 2D canvas 直畫 或 WebGL 點精靈/InstancedMesh(本專案 SpriteRenderer instancing) | 等價 |
| Sub Emitters(死亡再爆一波) | 手寫串接(本專案 Prefab JSON 的 SubEffect 就是這概念,16 個子特效檔) | 要寫碼 |
| Trails(拖尾) | 歷史點列+漸隱(本專案 BulletTopTrail、afterimages 已有) | 等價 |
| Noise(亂流) | 手寫 noise 函式擾動速度 | 要寫碼 |
| Collision(粒子碰撞) | 手寫(通常只做地板反彈這種簡化版) | 貴 完整版不划算,遊戲少用 |
| Lights/Shadow per particle | 基本不做(假光暈貼圖代替) | 不做 板機上 Unity 也不該開 |
| VFX Graph(GPU 百萬粒子) | GPU 粒子(shader 模擬,如本專案 ShockwaveFxAdapter 的路線延伸) | 要寫 shader 都做得到,門檻高 |
| 編輯器即時調參+預覽 | 沒有原生等價物——本專案以 Prefab JSON+PrefabViewer 補(改 JSON 熱更新預覽) | 最大差距 見第二節 |
Unity:美術/企劃自己在 Inspector 拉曲線、即時預覽,一個特效 30 分鐘迭代十版,不用工程師。
網頁:原生沒有特效編輯器——每個特效都是程式碼或資料檔。本專案的緩解方案(已存在):特效參數抽成 Prefab JSON(Effect/SubEffect 分類、火花/碎片/拖尾/飄字都是資料檔)+ PrefabViewer 預覽頁+ JSON 熱更新。等於自建了一個「陽春版 Shuriken」——調參數不用改程式,但沒有拉曲線的舒適度。
結論:少量特效(現況)夠用;若之後要「美術大量產特效」,兩條升級路:①擴充 PrefabViewer 成曲線編輯器(自建,可控)②引入 three.quarks 這類含編輯器的網頁粒子引擎(現成,但要遷移現有特效,牴觸 R12 視覺零改變原則)。建議維持現況,量產需求出現才升級①。
| 面向 | Unity | 網頁 | 對本專案的實際影響 |
|---|---|---|---|
| CPU 粒子模擬 | C#+Burst/Jobs 多執行緒,手機上 1 萬顆輕鬆 | JS 單執行緒,A11 級板子預算約 2000~5000 顆/幀 | 無感——遊戲峰值數百顆,連 JS 預算的 1/10 都用不到 |
| GPU 粒子 | VFX Graph 百萬級 | shader 模擬同樣百萬級(WebGL2 夠用) | 用不到這個量級 |
| Overdraw(真殺手) | 兩邊完全相同的物理限制:行動 GPU 是 fill-rate bound,大張半透明貼圖疊 5 層=每像素畫 5 次。粒子特效卡頓的元兇 90% 是這個,不是粒子數 | 板機預算的重點,見第五節 | |
| Draw calls | 自動 batching | 手動 instancing/atlas(本專案已做,健康值 ~30) | 已在紅線管理下 |
| 每幀資料上傳 | 引擎代管 | 自己管——本專案紅線「穩態貼圖上傳=0」+烘焙快取 | 已閉環,且比 Unity 慣例更嚴 |
| GC 卡頓 | C# GC(Unity 也要管) | JS GC——爆量 new 物件會掉幀。本專案已用物件池(getParticle 重用) | 已閉環 |
GameUtils.getParticle)+ particles[],火花/爆星/碎片全在這,life/color/size 插值齊全DynamicResource/Prefab/ Effect+SubEffect 16 檔(火花批次、拖尾、飄字、殘影…)——「陽春 Shuriken」的資料層| 項目 | 預算 | 理由 |
|---|---|---|
| 同幀活躍粒子數 | ≤ 800 顆(警戒 500) | JS 模擬預算的 1/5,留餘裕給遊戲邏輯 |
| 全螢幕級半透明疊層 | ≤ 2 層同時 | overdraw 是 fill-rate 殺手;大面積效果優先走 shader/烘焙檔位 |
| 單一爆發特效粒子 | ≤ 60 顆/次 | 視覺上 40 顆和 100 顆差異小,成本差 2.5 倍 |
| 粒子貼圖 | 進 atlas fx/ 組、單張 ≤256 | 維持 instancing 單 draw call |
| 驗收 | 特效滿場景時 FPS 降幅 ≤ 15%+紅線指標不破 | 板機實測時列入降級檔位調校 |