Add formal enemies, remaining formal partners and synthesized UI SFX
- UI SFX v3: procedurally synthesized one-shots (Tools/synth_ui_sfx.py) wired to buttons, rewards, errors and red dots via UiSfx, gated by the SFX setting. - Five formal enemies (Hornlet, Dashlet, Shellhorn, HornCaptain, GreatHorn): Hunyuan 50k -> 2000-tri XPbr, DGXA TokenRig, Idle/Walk/Attack, nested per type in PrototypeArena; PrototypeBattle.Enemy gains presentation-only Moving/Strikes. - Formal partners for all ten pets in the arena and portraits, including new VineSprite, ThunderLeopard and TideWhale. - Pipeline fixes: reject local TokenRig fallback, drop loose mesh islands, configurable Unity run_script timeout, companion static stage. - Also includes concurrent work from another tool in this working tree (FlameLion, enemy combat FX, challenge mode, home explorer, server updates). - Resources registered in Doc/ResDesc_*.md; verified on isolated :18081. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# 敌人攻击与受击特效/音效标准制作方案
|
||||
|
||||
2026-10-21。已接入当前 PrototypeArena;本批制作五类敌人的攻击表现,以及普通受击、硬甲受击、护盾格挡。五类敌人共用稳定的播放接口,资产和参数持久化在 Prefab 中。
|
||||
|
||||
## 资源与映射
|
||||
|
||||
| 类型 | 画面表现 | TangoFlux 音效 |
|
||||
| --- | --- | --- |
|
||||
| 0 · 小角怪(Hornlet) | 金色短弧/接触闪光 | Enemy_HornletAttack.wav · 0.48s |
|
||||
| 1 · 疾跑怪(Dashlet) | 青白色狭长斜掠 | Enemy_DashletAttack.wav · 0.42s |
|
||||
| 2 · 硬壳怪(Shellhorn) | 石甲冲击环/碎屑 | Enemy_ShellhornAttack.wav · 0.60s |
|
||||
| 3 · 角怪队长(HornCaptain) | 橙红交叉双弧 | Enemy_HornCaptainAttack.wav · 0.58s |
|
||||
| 4 · 大角首领(GreatHorn) | 大范围红金重击/贴地冲击环 | Enemy_GreatHornAttack.wav · 0.82s |
|
||||
| 普通受击(敌人类型0/1,以及敌人击中伙伴) | 暖白闪光、短促碎光和小冲击环 | Enemy_HitSoft.wav · 0.34s |
|
||||
| 硬甲受击(敌人类型2/3/4) | 金橙碎光、石甲冲击环 | Enemy_HitArmor.wav · 0.42s |
|
||||
| 伙伴护盾完全吸收敌人攻击 | 青色闪光/格挡环 | Enemy_HitShield.wav · 0.55s |
|
||||
|
||||
特效根目录:`AIClient/Assets/Bundles/Effects/EnemyCombat/`。八个 `Vfx_Enemy_{名称}.prefab` 分别配套五种 Attack 与 HitSoft/HitArmor/HitShield。`CombatSoft.png` 为 Pipeline 制作的径向透明软粒子贴图;`CombatArc.asset`/`CombatRing.asset` 为弧带/环带网格;`CombatGlow.mat` 使用 `AIGame/EnemyCombatParticle` 加法透明着色器。
|
||||
|
||||
音效目录:`AIClient/Assets/Bundles/Sound/SFX/EnemyCombat/`。`EnemyCombatPresentation.prefab` 包含八类特效各四实例(共32),八条PCM音频及八个非循环AudioSource;已作为嵌套Prefab放入现有战场。通过战场资源依赖加载,无需另行动态查找特效地址。`BuildPrototype.MakeArena` 重建时会恢复该嵌套Prefab。
|
||||
|
||||
## 制作与运行标准
|
||||
|
||||
1. 先用固定英文声学描述、seed及请求内容哈希建立音效配方。`Tools/generate_enemy_sfx.py` 按 `D:/UD/AI/XModel/TangoFlux_AI调用指南.md` 检查服务ready;调用本机8012,最多两个并发任务;duration=2s、steps=50、guidance=4.5,异步提交和0.8秒轮询。队列满最多等待120秒,不停其它服务。缓存同时检查请求哈希与原稿哈希。
|
||||
2. 保存服务job、提示词、原稿、参数与SHA256至 `Tools/output/enemy_combat_sfx/`,制作记录在 `Doc/Design/Sound/EnemyCombat/generation.json`。原稿保持44.1kHz立体声;后期做65Hz高通、最强起音截取、5ms淡入、50ms淡出和峰值约-1.94dBFS,输出0.34~0.82秒PCM16立体声短音效。连续试听为同目录 `preview.wav`,按上表五种攻击、普通受击、硬甲受击、格挡排列,每段间隔0.3秒。
|
||||
3. Unity序列化资源、外部资源导入与导入设置全部经Pipeline。`BuildEnemyCombatFx.Build` 可重建材质、贴图、网格、八套特效及播放池,然后仅替换战场的反馈节点,保留其他战场内容。AudioClip采用PCM/DecompressOnLoad/预加载。
|
||||
4. `PrototypeBattle` 在真实扣血和敌人出手处追加不可变 `CombatCue`;`PrototypeFlow` 在每次固定步长后消费队列。既有Pulse仍只用于缩放/状态提示,减速不冒充受击。死亡命中先记录再缩小角色;漏怪和无目标不创建命中。敌人出手弧光位于自身前方,目标命中反馈朝固定战斗相机方向偏移,避免被网格遮挡。
|
||||
5. `EnemyCombatPresentation` 仅消费表现事实。五种敌人攻击各播放自身攻击效果和声音,并为伙伴播放普通受击或护盾格挡;敌人受击按类型选择软体或石甲。每类型4实例循环复用,声音8路轮转、同音75ms抑制、单音音量上限0.40,所有当前活动音源增益之和不超过0.70,防止多敌同时出手叠加失控。对象数与音源数固定。
|
||||
6. 暂停冻结粒子和音源,恢复不重复发射;2倍速改变粒子速度,声音保留原音高。SFX开关关闭立即停战斗音,开启不会补播旧事件。离开战场时禁用反馈节点并停止/清空粒子与声音;新战斗清空旧表现。
|
||||
7. 仍沿用当前 battleRules=1/2 的即时伤害时间。没有把扣血迁移到动画的 OnEnemyAttackImpact,也没有启用 SkillSystem 的 battleRules=3 前摇/投射物协议;正式技能时序迁移仍按 SkillSystem.md 进行。当前动画的蓄力和视觉冲击相位可能晚于即时命中,本次不改变战斗数值、节奏、服务端结算和奖励。
|
||||
|
||||
## 验证与复用
|
||||
|
||||
- `python Tools/verify_enemy_sfx.py`:八条音效的请求/原稿/输出哈希、成功任务、采样格式、短时长、前100ms起音、尾部淡出、零削波及有效电平通过。`audio_validation.json` 只声明自动检测,音色的主观听感需通过 `preview.wav` 试听,不将自动检查当成人工听审结论。
|
||||
- Pipeline `BuildEnemyCombatFx.Verify`:八类映射、32实例、8音源、音频规格、非循环/无自动播放、着色器无编译错误、战场嵌套通过。
|
||||
- Pipeline `VerifyEnemyCombatFx.Simulation`:两种规则×五类敌人,出手事件数与Strikes完全一致;有受击事件;完全护盾吸收;九个致命命中各一次;消费表现队列不影响战斗结果。报告 `simulation.json`。
|
||||
- Pipeline `VerifyEnemyCombatFx.Play`:真实粒子和音源播放、五类攻击/受击/格挡、暂停恢复、2倍速、SFX静音、100次连续触发后的有界池、0.70总增益预算及退出清理通过。报告 `play.json`。
|
||||
- Pipeline `VerifyEnemyCombatFx.PlayBattle`:用真实PrototypeFlow.Update/RefreshBattle驱动隔离内存战斗,五类敌人全部出手、九个敌人击败,事件消费与反馈通过;不登录测试账号、不请求奖励、不改玩家存档。报告 `battle.json`。
|
||||
- `VerifyEnemyCombatFx.BuildReview` 生成独立 `Assets/Bundles/Scenes/Review/EnemyCombatFx_Review.unity`,`Capture` 在Additive场景采样后截图并关闭。截图 `Assets/Screenshots/enemy_combat_fx_review.png` 和 `enemy_combat_fx_battle.png`。没有覆盖角色总验收场景,原Boot和烈焰狮场景保持未修改。
|
||||
|
||||
Unity调用必须显式指定项目,例如:
|
||||
|
||||
```powershell
|
||||
unity --json command --project-path D:/UD/AI/AIGame/AIClient set_autotick --enable true
|
||||
unity --json command --project-path D:/UD/AI/AIGame/AIClient run_script --file AgentScripts/BuildEnemyCombatFx.cs --entry BuildEnemyCombatFx.Build
|
||||
unity --json command --project-path D:/UD/AI/AIGame/AIClient run_script --file AgentScripts/VerifyEnemyCombatFx.cs --entry VerifyEnemyCombatFx.Simulation
|
||||
```
|
||||
|
||||
本次验证为开发机Editor/Play,未做微信目标设备性能验收或Player资源包构建。TangoFlux指南注明模型权重为非商业研究用途;生成记录保留该来源信息,未认定音频已获得商用许可。
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "pass",
|
||||
"realFlow": true,
|
||||
"isolatedInMemory": true,
|
||||
"networkRewardRequests": false,
|
||||
"allFiveTypes": true,
|
||||
"effects": 68,
|
||||
"sounds": 56,
|
||||
"captured": true,
|
||||
"Defeated": 9
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"status": "pass",
|
||||
"allFiveTypes": true,
|
||||
"muting": true,
|
||||
"pause": true,
|
||||
"doubleSpeed": true,
|
||||
"boundedPool": true,
|
||||
"mixGainBudget": 0.7,
|
||||
"exitCleanup": true
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"status": "pass",
|
||||
"rows": [
|
||||
{
|
||||
"rules": 1,
|
||||
"type": 0,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 1,
|
||||
"type": 1,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 1,
|
||||
"type": 2,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 1,
|
||||
"type": 3,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 1,
|
||||
"type": 4,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 2,
|
||||
"type": 0,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 2,
|
||||
"type": 1,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 2,
|
||||
"type": 2,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 2,
|
||||
"type": 3,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
},
|
||||
{
|
||||
"rules": 2,
|
||||
"type": 4,
|
||||
"strikes": 315,
|
||||
"hits": 40
|
||||
}
|
||||
],
|
||||
"blocked": 30,
|
||||
"lethalImpacts": 9,
|
||||
"presentationConsumptionDoesNotChangeResults": true
|
||||
}
|
||||
Reference in New Issue
Block a user