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:
udx
2026-10-21 12:23:55 +08:00
co-authored by Claude Opus 5.5
parent 6c64210331
commit 89e0fa246f
780 changed files with 7117051 additions and 15906 deletions
@@ -0,0 +1,61 @@
# 泡泡龟 BubbleTurtle · T1 伙伴制作记录
2026-10-21完成。伙伴ID=4,水元素守护,现行技能“缓流泡泡”。青蓝厚壳/宽奶油壳缘、四条短腿和短尾,沿用火喵/芽芽/闪闪雀的成品风格。仅交付正式角色视觉,不改变Config/Gameplay/greenfield.json玩法数值。
## 交付
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/BubbleTurtle/BubbleTurtle.prefab` |
| 动画伙伴入口 | 同目录 `BubbleTurtle_Companion.prefab` |
| 骨架中间Prefab | 同目录 `BubbleTurtle_Rigged.prefab` |
| 独立验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_BubbleTurtle_Review.unity` |
| 并排/Play截图 | `AIClient/Assets/Screenshots/companion_bubbleturtle_{review,play}.png` |
| 正式配方 | `Config/Art/Companions/BubbleTurtle.json` |
| 来源与状态 | `Tools/output/companions/BubbleTurtle/production_manifest.json`,status=validated |
0.35m、2000三角面/988原始顶点,1024² base/mix、Test/XPbr,每顶点最多4个归一化权重。Y-up、底面中心、局部-Z正面;外层逻辑根单位缩放/旋转identity,Root Motion关闭。保持水平四足体态,不转成双足站立。
## 来源与朝向
内置imagegen参考proto_pet_4身份与火喵风格生成 `bubbleturtle.png`,1536×1024,白底四角RGB最小253;完整提示词、内置生成模式与参考见 `design_prompt.txt`。用户明确授权图像提交腾讯混元3D及随后模型/骨架发送项目DGXA,官方网页50k得到 `Tools/output/bubbleturtle_3d/bubbleturtle.glb`,实测50002 tris,内嵌贴图解码通过。
混元将三分之四设计图重建成斜向龟体。离线校准首次-135°尝试在Unity中前后相反,原因是FBX到Unity的左右手转换未计入;保留该诊断版本,最终从原高模绕Blender Z +45°刚性旋转,得到 `bubbleturtle_forward.glb`,Unity正侧背图确认脸朝-Z。形状/UV仅作刚性变换,无运行时补转。前后判断以Unity实际视图和头/前脚相对后脚的位置门禁为准。
正式烘焙目录 `Tools/output/bubbleturtle_game_forward/`,Blender5减面/UV/烘焙到2000 tris/1024 XPbr,Pipeline只导入FBX/两张PNG,在Unity创建材质/Prefab。原斜向及反向的高模、烘焙、17骨/11骨和反向Walk只留诊断,不作正式来源。
## 同源骨架与权重
最终forward高模经DGXA TokenRig original得到自身26骨,保留 `Tools/output/bubbleturtle_dgx/high_rig/rigged.glb` 与 `rig_request.json`。rig SHA256:`b913d91b8596ee5a3e6358d3332c416bfac363240455972d46bcd03a126216d5`。三段正式UniMate源动作均在该rig上新生成,CUDA成功,回执保留英文提示词、任务号和rig/FBX哈希;先通过单Walk再补Idle/Attack。
自身映射:root0、shell1、neck2、head3(头链继续至4);前右踝7/脚尖8、前左踝12/脚尖13、后右踝16/脚尖17、后左踝20/脚尖21,尾链22..25。所有编号只属于本次26骨,不能沿用诊断版或其它伙伴。
静态低模Y-up→Blender Z-up,对齐底面中心/等比尺寸后转权重,保留网格/UV。表面距离最大0.005086/RMS0.001701(源高约0.529),绑定后相对静态模最大顶点误差0.000034m。原自动权重让后左脚实际步幅不足,离线区域修正壳体及四脚,未降低验收门槛:壳区影响467个源顶点,其中402个全权重到shell1;四脚分别影响63/68/58/70个源顶点,平滑绑定各自踝骨。范围和几何信息见.skin.json。
skinRegions使用原低模FBX顶点坐标/高度归一化;其Z与Unity世界Z相反。shellRegionMin/Max使用Unity归一化空间供独立QA选择壳区。两者不能直接混用。壳体刚性检查覆盖860个Unity顶点;四脚分别采样76/96/92/117个实际蒙皮顶点,不能只看骨点移动。
## 动作与验收
| 动作 | 行为 | 各121帧实际蒙皮结果 |
| --- | --- | --- |
| Idle | 2.0秒循环,4%源变化+轻微头部呼吸,四脚固定,壳稳定 | 最大形变0.00636m;身体倾角0.040°;四脚支撑 |
| Walk | 1.6秒循环,12%源变化+四拍短步,摆动窗口20%,每次一脚抬起 | 四脚实际步幅0.03499/0.03472/0.03413/0.03371m;抬脚0.00769/0.00799/0.00888/0.00921m;至少三脚支撑;身体倾角0.201° |
| Attack | 1.2秒单次,8%源变化+缩颈蓄力/探头释放/恢复,四脚撑地 | 最大形变0.03919m;探头约0.02409m/回缩0.00797m;身体倾角2.731°;四脚支撑;0.6秒释放事件 |
三段端点顶点差均为0,逻辑根XZ漂移为0;Walk整段脚底误差≤0.238mm,Idle/Attack≤0.003mm。壳区扣除壳骨刚性变换后的变形误差在报告精度0.000000m,门槛1mm。身体倾角测量可见壳体相对绑定姿态,不用被固定的根骨代替身体,也不要求水平龟体的骨轴朝世界Y。
控制器验证Idle↔Walk、两状态进入Attack、单触发一次、恢复请求状态和过渡不穿地通过;真实10秒Play观察Idle/Walk/Attack,最大身体倾角2.714°,根固定,完成后已退出Play。静态/Walk五相位/Idle中段/Attack蓄力、出手、恢复的四向近景已检查,龟壳、脚部、头颈和尾部未见明显拉扯或塌陷。
独立场景为Static/Idle/Walk/Attack/Cycle五组,X=100。通过Pipeline Additive构建,不改写其他场景资产。宽体隔离相机改为按实际顶点投影的宽高取景,避免裁切龟头与尾部。资源总清单追加静态及伙伴两项,仅ValidateOnly,不重建总验收场景。
## 调用与复现
Animator在Model节点:Motion Int 0=Idle、1=Walk;Attack Trigger触发一次吐泡泡动作。Attack在0.6秒发送OnCompanionAttackImpact,接收器应位于Animator节点或转发。当前只有动作释放接口,实际泡泡投射物、缓速结算、特效/音效及正式关卡简模替换由技能系统接入。
```powershell
python Tools/character_animation_pipeline.py --recipe Config/Art/Companions/BubbleTurtle.json --build-review --play-check
```
标准流程新增quadruped_turtle/turtle_bubble分支,未知四足仍不得套用;完整入口最终代码已执行通过。6项Python流程保护测试、4个C#制作/验收脚本编译通过。初始BubbleTurtle.draft.json继续boneMappingReady=false,不作完成资产。
报告位于 `Tools/output/companions/BubbleTurtle/`:production_manifest.json、verification.txt、walk_verification.txt、play_verification.txt、walk_processing.txt、motion_processing.txt、BubbleTurtle_Rigged.skin.json。近景为static_audit、walk_audit、idle_audit、attack_audit。当前使用用户已有AIClient GUI实例,保留Editor开启。
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

@@ -0,0 +1,13 @@
Use case: stylized-concept.
Asset type: a single production character concept image for image-to-3D, BubbleTurtle (泡泡龟), T1 water-element guardian companion for the same polished cute fantasy mobile game.
Input images: image 1 proto_pet_4 is ONLY the identity reference: turquoise/aqua domed turtle shell, aqua rounded head, four short cream feet, low four-legged turtle silhouette. Image 2 FireCat is ONLY the established polished 3D art style, collectible proportions and high-quality expressive eyes reference. Create a turtle, never a cat and never a standing biped.
Primary request: an appealing little fantasy land turtle, sturdy rounded squat quadruped with a thick smooth domed turquoise shell on its back, a few broad simple hexagonal scutes in slightly darker aqua, broad solid cream shell rim, large friendly aqua-blue head with a short visible neck projecting clearly out in front of the shell, expressive glossy deep-blue eyes with small readable whites, tiny happy mouth appropriate for blowing a bubble spell. Cream pale-yellow chin and underside. FOUR separate short stout legs, cream rounded feet with only two or three broad subtle toe divisions; all four legs support a normal horizontal quadruped turtle body. A tiny compact aqua tail, subtle pale water-drop-shaped mark integrated into the central shell scute, no detached ornaments. No clothing, fur or cat features. Friendly steadfast guardian personality, basic T1 form.
Materials/style: polished stylized 3D studio character render matching FireCat's quality, smooth gently textured reptile skin and softly satin shell with clear solid volumes; strong clean silhouette, no realistic harsh reptile scales, no plastic toy seams, no see-through shell.
Composition: ONE creature, whole body centered in an informative front three-quarter view, camera slightly above eye level so the shell dome and the friendly face are both visible; four feet clearly separated and as readable as possible, spaced naturally with visible gaps between legs and shell so joints can be rigged, not fused flippers. Head faces toward the viewer and slightly to one side without twisting the neck, body naturally horizontal and all feet grounded. Full shell, head, feet and small tail in frame, generous pure-white margins. Landscape 3:2 framing appropriate for a broad low turtle.
Lighting/backdrop: soft neutral studio lighting, PURE SOLID WHITE RGB255 background including all four corners, minimal soft contact shadow immediately under feet.
Constraints: suitable for a clean 2000-triangle game model, a single rigid thick shell, broad scutes rather than many tiny pieces, thick connected forms, no floating bubbles, water jets, particles, transparent effects, puddle, pedestal, props, environment, text, labels, multiple views, watermark, weapons or armor. Do not turn the turtle into a humanoid, a sea turtle with flippers, a spiky tortoise, or a shell-less animal.
Mode: built-in image_gen, new character concept using reference images.
Identity reference: AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_4.png
Style reference: Doc/Design/Character/FireCat/firecat.png
Output: Doc/Design/Character/BubbleTurtle/bubbleturtle.png (1536x1024).
@@ -0,0 +1,63 @@
# 芽芽 BudBud · T1 伙伴制作记录
2026-10-20完成正式版本。伙伴ID=2,草元素支援/治疗定位;奶油圆脸、五片绿叶瓣、头顶黄花苞、短叶臂和双足,与火喵保持相同美术风格。本次交付角色视觉资产,不改变战斗数值。
## 交付
| 项目 | 结果 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/BudBud/BudBud.prefab` |
| 动画伙伴入口 | `AIClient/Assets/Bundles/Characters/Animal/BudBud/BudBud_Companion.prefab` |
| 骨架中间Prefab | 同目录 `BudBud_Rigged.prefab` |
| 验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_BudBud_Review.unity` |
| 并排/Play截图 | `AIClient/Assets/Screenshots/companion_budbud_{review,play}.png` |
| 正式配方 | `Config/Art/Companions/BudBud.json` |
| 来源与状态 | `Tools/output/companions/BudBud/production_manifest.json`,status=validated |
尺寸0.50m,2000三角面、1002原始顶点,1024² base/mix贴图,Test/XPbr材质,每顶点最多4个归一化权重。Y-up、底面中心原点、局部-Z正面;逻辑外层根缩放1/旋转identity,Root Motion关闭。
## 来源与制作
1. 内置imagegen参考 `FireCat/firecat.png` 风格与 `proto_pet_2.png` 身份生成 `budbud.png`,1024×1536,白底四角RGB最小253。完整提示词/模式/参考见 `design_prompt_formal.txt`。
2. 用户明确授权后提交腾讯混元3D官方网页50k图生3D,得到 `Tools/output/budbud_3d/budbud.glb`(50000 tris),内嵌贴图解码通过。任务回执 `hunyuan_status.json`。
3. Blender5减面、UV、烘焙到2000 tris/1024 XPbr;产物 `Tools/output/budbud_game/budbud_xpbr/`。Pipeline只导入FBX和两张PNG,在Unity创建材质/Prefab,不复制离线mat/meta。
4. 同一混元高模经项目DGXA TokenRig original模板得到自身22骨,保存在 `Tools/output/budbud_dgx/high_rig/`。rig SHA256:`729fbbd33dee63977da22ae809762a2d4894882da04df9c0512291b27e44af98`。
5. 已验收低模Y-up转Blender Z-up,再等比尺寸/底面中心对齐后转权重,保留网格与UV。对齐距离最大0.004639、RMS0.001779(源模型高约1.131);本角色无需额外skinOverrides。绑定后对静态模最大顶点误差0.000026m。
6. 先生成并验收单Walk的121帧蒙皮和四个相位的正侧背面,再补Idle与治疗施法Attack。三段均为同一rig的UniMate新生成源动作,本次均CUDA成功,回执记录rig/源FBX哈希、原始英文提示词和远程任务号。
7. 源动作经离线绑定空间校准、贴地、循环闭合与语义编辑保存为正式.anim;不依赖运行时反向旋转或临时生成动画。统一入口完成Edit及实际Play验收。
自身骨骼检查:root=bone_0、chest=bone_3、头部链bone_4/5;X正侧手臂bone_7/踝bone_16/脚尖bone_17,X负侧手臂bone_11/踝bone_20/脚尖bone_21。正面参考使用不同的左右踝骨16/20;编号只适用于本次芽芽rig。花瓣与花苞随头部链运动,无独立花瓣次级骨。
## 动作与验收
| 动作 | 正式行为 | 121帧实际蒙皮结果 |
| --- | --- | --- |
| Idle | 1.6秒循环,8%源变化+轻呼吸,首尾绑定参考 | 最大形变0.01614m;根倾角1.539°;脚底误差≤0.019mm |
| Walk | 1.1秒原地循环,35%源变化+交替短步 | 左右步幅0.05763/0.05558m;根倾角7.950°;脚底误差≤0.137mm |
| Attack | 1.1秒单次,12%源变化+双叶手抬起前推治疗施法,恢复Idle | 最大形变0.10955m;根倾角2.199°;脚底误差≤0.156mm;内部视觉位移0.002m |
Walk原始根倾角65.349°,并非静态模up改变;用全骨骼源首帧相对绑定姿态校准,保留相对运动后离线收尾。仅改Armature +90°X不能解决,正式资产保留正确绑定空间。
三段首尾顶点误差均为0;Idle/Walk逻辑根水平不漂移。控制器通过Idle↔Walk、两状态进入Attack、单触发一次及恢复请求状态;实际10秒Play观察到Idle、Walk、Attack,最大根倾角7.915°,根位置固定,结束已退出Play。
正侧背静态、Walk四相位、施法蓄力/出手/恢复近景已目视检查;花瓣头与花苞、叶臂和背部小叶无明显拉扯或塌陷。预览可在验收场景的Static/Idle/Walk/Attack/Cycle五组查看,X=60,与火喵X=40隔开。该场景未接入正式关卡。
## 调用与复现
Animator在Model节点:`Motion` Int,0=Idle、1=Walk;`Attack` Trigger触发一次治疗施法。Attack在0.55秒发送 `OnCompanionAttackImpact`,事件接收器应在Animator所在节点或由该处转发。该事件仅提供表现时机,实际回血、范围选取、治疗特效和音效由技能系统接入。
```powershell
python Tools/character_animation_pipeline.py --recipe Config/Art/Companions/BudBud.json --build-review --play-check
```
默认使用哈希校验后的本地来源;显式 `--generate Idle Walk Attack` 才请求新动作。初始 `BudBud.formal.draft.json` 继续保持boneMappingReady=false,仅作禁用草稿记录。
验收报告位于 `Tools/output/companions/BudBud/`:`verification.txt`、`walk_verification.txt`、`play_verification.txt`、`walk_processing.txt`、`motion_processing.txt`、`BudBud_Rigged.skin.json`。近景在 `static_audit/`、`walk_audit/`、`idle_audit/`、`attack_audit/`。
## 旧草稿留档
原Blender程序化1804 tris/8骨版本未通过Unity验收,已由本正式版本替换。原离线文件、配方与文档在 `Tools/output/budbud_offline_draft_20261020/`;原Unity资产通过Pipeline复制至 `AIClient/Assets/Temp/BudBud_OfflineDraft_20261020/`,新GUID且不进入Bundles。旧记录仅作历史,不作为正式来源。
AIClient使用图形batchmode+Unity Pipeline完成本次制作;启动时空白未命名场景(0对象、无修改)已通过Pipeline保存在 `Assets/Temp/BudBud_BatchStartup_20261020.unity`,以允许Additive创建验收场景,未丢弃任何场景内容。
制作结束后,已确认仅打开本次两个已保存场景,并通过Pipeline正常退出本次启动的batch Editor,释放项目锁供人工打开。其他Unity项目未操作。
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

@@ -0,0 +1 @@
Create BudBud (芽芽), the next companion after FireCat: a friendly small grass-element support creature for a polished stylized 3D mobile game. Use a rounded mint-green leaf-bud body, cream muzzle and belly, cream feet, a tiny pink nose, dark glossy eyes, three broad leaf sprouts on the crown and a small yellow flower center. Upright biped, short separate legs and arms, one full body, no props, no text, no scenery, clean studio white background, gentle welcoming expression, front and slight three-quarter views suitable for a 1500-2000 triangle low-poly model. Preserve Y-up game coordinates, grounded bottom-center origin and local -Z front. Avoid armor, weapons, floating particles, stone, fire, blue crystals, fur strands and humanoid anatomy.
@@ -0,0 +1,7 @@
Use case: stylized-concept. Asset type: a single full-body production concept image for image-to-3D of BudBud (芽芽), a grass-element healing companion in a polished cute mobile fantasy game. Input image 1 FireCat is ONLY the established polished 3D rendering style, scale language and large glossy eye quality reference; input image 2 proto_pet_2 is the BudBud identity reference, especially the cheerful cream round flower face surrounded by rounded green leaf petals. Create a new character, not a green cat. Subject: a small upright bipedal botanical flower-bud creature, large cream-colored round friendly face, expressive dark green glossy eyes, tiny warm smile, a crown/halo of five thick rounded fresh green leaf petals around the head, compact mint-green torso with a cream belly, two short separate legs with small cream feet, two short leaf-like arms held slightly away from torso for rigging, small fresh seedling sprout on top with a tiny warm yellow bud accent. Friendly healer expression. Thick connected fleshy leaves with subtle natural veins, smooth softly textured botanical surface, rich but restrained colors; no fur, animal ears, tail, clothing, pot or weapons. Forms must be solid volumes suitable for clean 2000-triangle game mesh, avoid paper-thin leaves or detached ornaments. Stand neutrally upright, both feet visibly grounded, both arms and full leaf crown visible, clear silhouettes and joint separation. One character only, one front-biased very slight three-quarter view, centered full body, comfortable 12% white margin on all sides. High quality stylized 3D studio render matching FireCat's polish, soft neutral lighting, pure solid white RGB255 background including all four corners, only a minimal soft contact shadow at feet, no gradient background, no text, no layout or labels, no props, no floating particles, no scenery. Portrait 2:3 framing. This is the T1 basic form, understated botanical design, warm appealing collectible companion.
Mode: built-in image_gen, new character concept using reference images.
Style reference: Doc/Design/Character/FireCat/firecat.png
Identity reference: AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_2.png
Output: Doc/Design/Character/BudBud/budbud.png (1024x1536).
Existing procedural offline draft preserved under Tools/output/budbud_offline_draft_20261020.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

@@ -0,0 +1,27 @@
{
"id": "Dashlet",
"name": "疾跑怪",
"role": "fast",
"jobId": "f008d3d9c4314d159d5af5b22d70df25",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 62001,
"styleReferences": [
"Doc/Design/Character/FireCat/firecat.png",
"Doc/Design/Character/RockRhino/rockrhino.png"
],
"prompt": "Image 1 and image 2 are STYLE ONLY: match their friendly polished chibi 3D mobile-game render, glossy expressive eyes, rounded appealing volumes and clean readable shapes; do not copy their species, colors or features. Subject family: small mischievous 'horn imp' monsters that invade a cozy meadow camp in a cute tower-defense game; cheeky and naughty, never scary, gory or realistic. Base palette violet / lilac skin with cream-ivory horns. Body plan for rigging: a SHORT-LEGGED BIPED standing upright, two short stubby legs with flat round feet both grounded, two short separate arms held slightly away from the body, bilaterally symmetrical, neutral calm standing pose, head facing the viewer. Composition: single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), whole body including horns and feet in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Simple smooth matte surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props held in hands, no weapons, no floor base, no scenery, no particles, no glow, no extra limbs, no wings. Dashlet, the fast runner: a slimmer, lighter lilac imp with a narrow teardrop body leaning slightly forward, one sleek swept-back cream horn, long pointed ears swept back like it is in a hurry, eager grinning face, slightly longer but still short legs with springy feet, thin tail; reads as quick and light.",
"drafts": [
"Doc/Design/Character/Enemy/Dashlet/drafts/Dashlet_62001.png",
"Doc/Design/Character/Enemy/Dashlet/drafts/Dashlet_62002.png",
"Doc/Design/Character/Enemy/Dashlet/drafts/Dashlet_62003.png",
"Doc/Design/Character/Enemy/Dashlet/drafts/Dashlet_62004.png"
],
"generatedUtc": "2026-10-21T01:47:28Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 KiB

@@ -0,0 +1,27 @@
{
"id": "GreatHorn",
"name": "大角首领",
"role": "boss",
"jobId": "fc87f702414745eaaa5fe20e384a076a",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 65001,
"styleReferences": [
"Doc/Design/Character/FireCat/firecat.png",
"Doc/Design/Character/RockRhino/rockrhino.png"
],
"prompt": "Image 1 and image 2 are STYLE ONLY: match their friendly polished chibi 3D mobile-game render, glossy expressive eyes, rounded appealing volumes and clean readable shapes; do not copy their species, colors or features. Subject family: small mischievous 'horn imp' monsters that invade a cozy meadow camp in a cute tower-defense game; cheeky and naughty, never scary, gory or realistic. Base palette violet / lilac skin with cream-ivory horns. Body plan for rigging: a SHORT-LEGGED BIPED standing upright, two short stubby legs with flat round feet both grounded, two short separate arms held slightly away from the body, bilaterally symmetrical, neutral calm standing pose, head facing the viewer. Composition: single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), whole body including horns and feet in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Simple smooth matte surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props held in hands, no weapons, no floor base, no scenery, no particles, no glow, no extra limbs, no wings. Great Horn, the boss: a big heavy dark plum-violet imp chief with a round belly, two large curved ram-like cream horns and a small crown-like ridge of three tiny horns between them, thick bushy eyebrows, proud bossy grin with fangs, a short dark purple cape draped over the shoulders, chunky short legs and big round feet; imposing but still cute.",
"drafts": [
"Doc/Design/Character/Enemy/GreatHorn/drafts/GreatHorn_65001.png",
"Doc/Design/Character/Enemy/GreatHorn/drafts/GreatHorn_65002.png",
"Doc/Design/Character/Enemy/GreatHorn/drafts/GreatHorn_65003.png",
"Doc/Design/Character/Enemy/GreatHorn/drafts/GreatHorn_65004.png"
],
"generatedUtc": "2026-10-21T01:58:10Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@@ -0,0 +1,27 @@
{
"id": "HornCaptain",
"name": "角怪队长",
"role": "elite",
"jobId": "8e196dbec4d24b14b2c05d14ca9bcfb3",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 64001,
"styleReferences": [
"Doc/Design/Character/FireCat/firecat.png",
"Doc/Design/Character/RockRhino/rockrhino.png"
],
"prompt": "Image 1 and image 2 are STYLE ONLY: match their friendly polished chibi 3D mobile-game render, glossy expressive eyes, rounded appealing volumes and clean readable shapes; do not copy their species, colors or features. Subject family: small mischievous 'horn imp' monsters that invade a cozy meadow camp in a cute tower-defense game; cheeky and naughty, never scary, gory or realistic. Base palette violet / lilac skin with cream-ivory horns. Body plan for rigging: a SHORT-LEGGED BIPED standing upright, two short stubby legs with flat round feet both grounded, two short separate arms held slightly away from the body, bilaterally symmetrical, neutral calm standing pose, head facing the viewer. Composition: single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), whole body including horns and feet in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Simple smooth matte surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props held in hands, no weapons, no floor base, no scenery, no particles, no glow, no extra limbs, no wings. Horn Captain, the elite squad leader: a taller, chunkier deep-violet imp with TWO curved cream horns, a short red scarf tied around the neck with the knot at the front, confident smug grin with two small fangs, small spiky tuft on the head, broader shoulders and slightly bigger fists; still short-legged and cute.",
"drafts": [
"Doc/Design/Character/Enemy/HornCaptain/drafts/HornCaptain_64001.png",
"Doc/Design/Character/Enemy/HornCaptain/drafts/HornCaptain_64002.png",
"Doc/Design/Character/Enemy/HornCaptain/drafts/HornCaptain_64003.png",
"Doc/Design/Character/Enemy/HornCaptain/drafts/HornCaptain_64004.png"
],
"generatedUtc": "2026-10-21T01:54:36Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 KiB

@@ -0,0 +1,27 @@
{
"id": "Hornlet",
"name": "小角怪",
"role": "normal",
"jobId": "3f06195bc39e47e4af0bd289d570cae0",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 61001,
"styleReferences": [
"Doc/Design/Character/FireCat/firecat.png",
"Doc/Design/Character/RockRhino/rockrhino.png"
],
"prompt": "Image 1 and image 2 are STYLE ONLY: match their friendly polished chibi 3D mobile-game render, glossy expressive eyes, rounded appealing volumes and clean readable shapes; do not copy their species, colors or features. Subject family: small mischievous 'horn imp' monsters that invade a cozy meadow camp in a cute tower-defense game; cheeky and naughty, never scary, gory or realistic. Base palette violet / lilac skin with cream-ivory horns. Body plan for rigging: a SHORT-LEGGED BIPED standing upright, two short stubby legs with flat round feet both grounded, two short separate arms held slightly away from the body, bilaterally symmetrical, neutral calm standing pose, head facing the viewer. Composition: single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), whole body including horns and feet in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Simple smooth matte surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props held in hands, no weapons, no floor base, no scenery, no particles, no glow, no extra limbs, no wings. Hornlet, the basic grunt: a small round violet imp, egg-shaped body, one short stubby cream horn on top of the head, big round eyes and a toothy cheeky grin with one small fang, tiny pointed ears, short tail stub.",
"drafts": [
"Doc/Design/Character/Enemy/Hornlet/drafts/Hornlet_61001.png",
"Doc/Design/Character/Enemy/Hornlet/drafts/Hornlet_61002.png",
"Doc/Design/Character/Enemy/Hornlet/drafts/Hornlet_61003.png",
"Doc/Design/Character/Enemy/Hornlet/drafts/Hornlet_61004.png"
],
"generatedUtc": "2026-10-21T01:43:57Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 970 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 978 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 KiB

@@ -0,0 +1,27 @@
{
"id": "Shellhorn",
"name": "硬壳怪",
"role": "armored",
"jobId": "23af7751485442409d075ccf3bb60ce2",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 63101,
"styleReferences": [
"Doc/Design/Character/FireCat/firecat.png",
"Doc/Design/Character/RockRhino/rockrhino.png"
],
"prompt": "Image 1 and image 2 are STYLE ONLY: match their friendly polished chibi 3D mobile-game render, glossy expressive eyes, rounded appealing volumes and clean readable shapes; do not copy their species, colors or features. Subject family: small mischievous 'horn imp' monsters that invade a cozy meadow camp in a cute tower-defense game; cheeky and naughty, never scary, gory or realistic. Base palette violet / lilac skin with cream-ivory horns. Body plan for rigging: a SHORT-LEGGED BIPED standing upright, two short stubby legs with flat round feet both grounded, two short separate arms held slightly away from the body, bilaterally symmetrical, neutral calm standing pose, head facing the viewer. Composition: single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), whole body including horns and feet in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Simple smooth matte surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props held in hands, no weapons, no floor base, no scenery, no particles, no glow, no extra limbs, no wings. Shellhorn, the armored one: an UPRIGHT standing two-legged violet imp, same upright body plan as a small chubby person, standing on its two short hind legs only, two short arms hanging at its sides, NOT on all fours, not a turtle, not a quadruped. Stocky wide body; a compact rounded gray-brown stone plate covers its back like a small backpack-sized shell, staying behind the body and not wider than the shoulders, plus a smooth stone brow plate on its forehead with one short blunt cream horn poking out of it; stubborn frowning but cute face. The stone plates are solid attached armor with shallow seams, not floating rocks.",
"drafts": [
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63101.png",
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63102.png",
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63103.png",
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63104.png"
],
"generatedUtc": "2026-10-21T02:04:36Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

@@ -0,0 +1,27 @@
{
"id": "Shellhorn",
"name": "硬壳怪",
"role": "armored",
"jobId": "ccf90d9c2ada4aeb9c630d49894399df",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 63001,
"styleReferences": [
"Doc/Design/Character/FireCat/firecat.png",
"Doc/Design/Character/RockRhino/rockrhino.png"
],
"prompt": "Image 1 and image 2 are STYLE ONLY: match their friendly polished chibi 3D mobile-game render, glossy expressive eyes, rounded appealing volumes and clean readable shapes; do not copy their species, colors or features. Subject family: small mischievous 'horn imp' monsters that invade a cozy meadow camp in a cute tower-defense game; cheeky and naughty, never scary, gory or realistic. Base palette violet / lilac skin with cream-ivory horns. Body plan for rigging: a SHORT-LEGGED BIPED standing upright, two short stubby legs with flat round feet both grounded, two short separate arms held slightly away from the body, bilaterally symmetrical, neutral calm standing pose, head facing the viewer. Composition: single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), whole body including horns and feet in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Simple smooth matte surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props held in hands, no weapons, no floor base, no scenery, no particles, no glow, no extra limbs, no wings. Shellhorn, the armored one: a stocky wide violet imp wearing a thick rounded gray-brown stone shell plate fused on its back and a stone brow plate on its head, one short blunt cream horn poking out of the brow plate, sturdy short legs, stubborn frowning but cute face; the stone plates are solid attached armor with shallow seams, not floating rocks.",
"drafts": [
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63001.png",
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63002.png",
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63003.png",
"Doc/Design/Character/Enemy/Shellhorn/drafts/Shellhorn_63004.png"
],
"generatedUtc": "2026-10-21T01:51:02Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

@@ -30,9 +30,9 @@
## 3. 解剖类型与动作生成
已实现并验证的适配器为 `biped_short`:短腿双足、两侧短臂,岩团团12骨。配方显式记录root/chest/左右臂/脚根/脚尖/正面参考骨;12骨和bone_8等名称只属于样例。
已实现并验证 `biped_short`(短腿双足、两侧短臂,岩团团12骨)、`avian_grounded`(地面鸟型,闪闪雀28骨)、`quadruped_turtle`(四足龟,泡泡龟26骨)及 `quadruped_heavy`(重型四足,岩甲犀29骨)。各自配方记录自身身体/前肢或四脚/脚尖/头颈与正面参考骨;骨数与bone编号只属于各自样例,不能跨角色套用。
其它短腿双足敌人需换成自己的骨名、尺寸和节奏并完整验收。四足、长腿人形、飞行或无脚敌人需要对应解剖适配器,当前入口拒绝未知profile;不能直接套双足步幅。标准人形可沿用Mixamo/Kimodo动作来源,仍需同源绑定和三动作验收。
其它短腿双足敌人需换成自己的骨名、尺寸和节奏并完整验收。其它四足、长腿人形、飞行或无脚敌人需要对应解剖适配器,当前入口拒绝未知profile;不能直接套双足步幅。标准人形可沿用Mixamo/Kimodo动作来源,仍需同源绑定和三动作验收。
非人动作在同一TokenRig上用UniMate生成。英文提示词写清体型与单一动作,Walk不混jump,Attack不只写move;显式指定左右正面骨,保留实际提交文本、任务号和哈希。三个动作顺序生成。
@@ -116,3 +116,76 @@ DGXA显存不足时,可对指定动作加 `--generation-device cpu`(统一
对新角色先完成单Walk数值门禁(`VerifyEnemyMotions.Walk(recipePath)`)及多个相位目视,再交付完整三动作。数值门禁不能代替动作语义检查:施法必须能看出双爪前推,Idle不能大幅摇摆。最终配方支持 `idleSourceWeight` / `attackSourceWeight` 调整源运动幅度。
## 地面鸟型伙伴适配(2026-10-20)
闪闪雀配方 `Config/Art/Companions/SparkBird.json` 与制作记录 `SparkBird/ProductionBrief.md` 为 `avian_grounded` 已验收样例。它有自身28骨,不能复用短臂生物的骨名或把飞行作为Walk。该适配仅覆盖双足地面行走及挥翼施法;持续飞行、悬停与飞行切换需另建适配器。
`attackStyle=wing_cast` 与avian_grounded必须成对使用。通用rightArm/leftArm字段表示各自翼根,额外提供rightWingTip/leftWingTip;检查左右骨独立、翼根分居身体两侧。离线负X旋转把初始向外/向上的鸟翼向局部-Z扫出,两侧相反的Z旋转按wingSpreadDegrees展翼,attackReach可加小幅前伸。抬翼不能用身体前倾冒充;VerifyEnemyMotions扣除根骨转动后检查每侧翼尖相对身体前挥>1cm,并仍通过完整蒙皮/脚底/高度/循环/恢复/事件/控制器及Play门禁。
闪闪雀先完成单Walk再生成Idle/Attack,均同rig且CUDA成功;0.9秒Walk,1.4秒Idle,1.0秒Attack,0.45秒OnCompanionAttackImpact。双翼实际相对前挥约3.4/3.7cm,尾羽/冠羽无独立次级骨但峰值形状目视通过。伙伴Prefab、X=80独立场景、Edit/Play均已交付;5项流程保护测试和2个C#脚本编译通过。参数只属于该角色,复制到其它鸟型时须重查自身解剖和重新验收。
## 四足龟伙伴适配(2026-10-21)
泡泡龟 `Config/Art/Companions/BubbleTurtle.json` 为已验收quadruped_turtle/turtle_bubble样例,最终26骨、0.35m/2000tris;详情见BubbleTurtle/ProductionBrief.md。该适配覆盖水平四足龟和缩颈探头施法,其它四足仍需检查解剖与动作类型,不能直接套用。
前右/前左/后右/后左踝及脚尖全部独立映射,FinalizeAnimalWalk.RunQuadruped将源变化校准到绑定姿态,四拍20%摆动窗口保证每次一脚抬起,固定脚部朝向并烘焙实际蒙皮贴地。VerifyQuadrupedMotions每段121帧计算四只脚各自的实际网格步幅/抬脚/支撑,Walk至少三脚支撑,Idle/Attack四脚撑地。骨点移动不能代替实际网格移动;泡泡龟后左脚原步幅不足,经离线paw权重区域修正后四脚均达约3.4~3.5cm,门槛未放宽。
shellRegionMin/Max在Unity归一化空间选取壳区,扣除shellBone刚性变换后检查≤1mm形变;可见身体倾角使用壳体相对绑定姿态的世界up,不能用固定根骨掩盖身体倾斜。skinRegions在原静态FBX顶点/高度空间控制权重,两者Z方向转换必须明确;每个区域保留影响数和范围,保持几何/UV不变。
静态三分之四设计图可能生成斜向躯干。先离线统一高模和后续绑定源,再在Unity前/侧/背面确认;glTF相机约定不能代替游戏朝向检查,须计入FBX左右手转换。新增绑定门禁要求头及前脚位于后脚的-Z方向,泡泡龟最终采用原高模Blender Z +45°;17骨斜向/11骨反向均留诊断,正式动作只用26骨同一rig哈希。
标准入口自动选择四足Walk与专用验证器,Idle/Attack使用离线turtle_bubble收尾:四脚固定、缩颈→探头→恢复,0.6秒OnCompanionAttackImpact。三动作/壳刚性/接缝/控制器/实际Play均通过,6项Python保护测试和4个C#脚本编译通过;真实泡泡投射物/缓速/音效仍由技能系统接入。
## 重型四足伙伴适配(2026-10-21)
岩甲犀 `Config/Art/Companions/RockRhino.json` 为quadruped_heavy/braced_bash已验收样例:0.55m/2000tris/自身29骨。先离线统一高模朝向,再静态Unity三视图确认-Z;检查本角色胸背、头颈及四蹄映射,禁止套用龟的探头施法或其它角色bone编号。
重型四足复用RunQuadruped四拍步态;Attack独立编辑胸背前送、头颈短促推进和低头,四蹄撑地,逻辑根固定。配方必须给出armorRegion与hornRegion及各自≤2mm刚性预算(样例均1mm),对应chestBone/headBone;QA扣除各自刚性变换后检查实际顶点,另检查肩部前送和角区相对头枢轴降低,不能用根骨运动或纯转向冒充冲撞。区域坐标与蒙皮源空间的Z转换沿用明确登记原则。
岩甲犀先通过单Walk,再生成Idle/Attack。Attack源变化8%时后蹄离地4.08mm失败,调整为4%后降至1.77mm,通过原3mm门槛;头前送4.15cm、肩前送2.51cm、可见头转约11.21°,岩甲/头角区域刚性通过。四脚步幅约5.96~5.98cm、抬脚约1.47~1.60cm,至少三脚支撑;三段首尾与根XZ误差0,Edit/控制器/实际Play通过,0.6秒伙伴事件。详情见RockRhino/ProductionBrief.md。
入口run_script显式使用服务器timeout_ms=90000、CLI --timeout 120,覆盖现场Editor刷新后的调度延迟;不自动重试结果未知的写入。四足验证失败另存last_failure.txt后仍抛错,不能以旧失败文件或CLI外层成功替代当前verification与validated状态。7项Python流程保护测试覆盖重型分支错误配对、缺失刚性区域、共享头胸和四蹄映射;泡泡龟只读回归验收通过。
## P0 五类正式敌人(2026-10-21)
5 类敌人都按短腿双足 `biped_short`/`body_slam` 制作,共用一个已验证的解剖适配器,不需要新的四足或飞行适配器。设计、来源与验收结果见 `Doc/ResDesc_Model.md`「P0 五类正式敌人」;配方在 `Config/Art/EnemyCharacters/`。
| type | 敌人 | 配方 | 高度 | 骨数 | Walk/Idle/Attack |
| --- | --- | --- | --- | --- | --- |
| 0 | 小角怪 | Hornlet.json | 0.50m | 22 | 1.0/1.6/1.0s |
| 1 | 疾跑怪 | Dashlet.json | 0.50m | 22 | 0.8/1.4/0.9s |
| 2 | 硬壳怪 | Shellhorn.json | 0.50m | 28 | 1.2/1.8/1.0s |
| 3 | 角怪队长 | HornCaptain.json | 0.60m | 22 | 1.1/1.8/1.0s |
| 4 | 大角首领 | GreatHorn.json | 0.80m | 22 | 1.3/2.0/1.2s |
流程:设计草图(内网本地 Turbo)→ 用户选定 → 混元官网 50k → Blender 八向渲染确认正面 → `Tools/enemy_static_pipeline.py {Name} {height}`(烘焙、安装、静态 Prefab、四向检查)→ `Tools/rig_character_source.py --generate`(DGXA)→ 检查骨架填写配方 → `Tools/generate_enemy_motions.py`(DGXA)→ `character_animation_pipeline.py --build-review --play-check`。
本批次新增的注意事项:
- **DGXA 调用必须从 PowerShell 启动。** NVIDIA Sync 的 SSH 别名 `DGXA` 写在 `~/.ssh/config` 的 Windows 路径 Include 里,只有 Windows OpenSSH 能解析。Git Bash 下 ssh 解析失败,TokenRig 会静默回退本机 SkinTokens,得到单链退化骨架。`rig_character_source.py` 现在遇到回退会直接报错。DGXA 未连接时先运行 `Tools/dgx_ensure_ready.py`。
- **生图后释放显存。** 本地 Turbo 生图模型会占用 DGXA 约 43GB,导致 TokenRig 显存不足;3D 前调用 `POST /api/local-images/prepare-3d`。
- **DGXA 任务串行。** TokenRig 与 UniMate 并发时出现过 `No module named 'Animation'`,重试即可,应避免同时提交。
- **检查游离网格岛。** 混元高模可能把细尾尖等做成悬浮的独立网格,TokenRig 会丢弃,导致 `bl_transfer_skin` 报 bind geometry mismatch。先焊接 UV 接缝统计网格岛;有游离岛时用 `Tools/model_tools/bl_keep_main_island.py` 生成 `_main.glb`,烘焙和绑骨都用它。
- **验收后关闭验收场景。** 验收场景以 Additive 方式留在编辑器中,其相机 depth 很高,会盖住游戏 Play 画面。
战场接入:`BuildPrototype.ApplyFormalEnemies` 在 `PrototypeArena` 每个 `Enemies/EnemyN` 下嵌套 `Type0~4`,统一 1.2 单位高。`PrototypeFlow` 按 type 显示对应模型;`PrototypeBattle.Enemy` 新增仅供表现的 `Moving`/`Strikes`,移动时 Motion=1,每次出手触发一次 Attack,受击只做轻微缩放。`VerifyFormalEnemies.Assets`/`PlaySeeded`/`Cleanup` 为验收入口。
## 双足火焰施法伙伴适配(2026-10-21)
烈焰狮 `Config/Art/Companions/FlameLion.json` 为biped_short/flame_roar已验收样例:0.60m/2000tris/自身远程28骨。profile仍为双足;新attackStyle要求自身头颈/胸背/双臂与爪尖/双脚、鬃毛区域与≤2mm刚性预算,禁止套用火喵编号或按大头外观改成四足。
离线施法固定双脚与逻辑根,编辑头部前送/抬头、双爪前送/展开,开始与结束为Idle参考。QA对头鬃区实际网格扣除头骨刚性变换检查,对头部和双爪扣除胸背转动检查释放行为,并对两脚实际顶点测步幅/抬脚/支撑。不能只看脚骨或用身体前倾冒充施法。烈焰狮没有独立下颌或尾骨,本版无张嘴口型与独立尾摆;尾部58个源顶点跟随髋骨。
头鬃宽空间区域与尾部相邻时,bl_transfer_skin先执行skinRegions,再由精细skinOverrides测地距离覆盖,防止尾簇被头部或前臂带动。两种规则必须按自身网格检查,不能盲抄;此前已有伙伴未同时启用两种覆盖,其原单类行为不变。
烈焰狮先通过单Walk再补同rig Idle/Attack。25%Walk源变化导致左脚实际抬脚6.71mm失败,降至12%后11.91mm通过,未放宽门槛;两脚实际步幅48.66/67.37mm。Attack头前送16.24mm/抬头6.654°、双爪前送约6cm/外展约2cm,双脚支撑、鬃毛刚性及Edit/实际Play通过,0.6秒伙伴事件。详情见FlameLion/ProductionBrief.md。
本机TokenRig回退曾产出异常33骨长链,不可按生成回执直接当可用骨架。`rig_character_source.py --backend remote`要求远程回执且拒绝隐式本机回退;显存错误需保留诊断、验证GPU状态后重试,不停止其它服务。最终烈焰狮只接受DGXA28骨哈希。8项流程保护测试与火喵只读回归通过。
并排截图使用BuildEnemyReview.Capture隔离Prefab实例,在PreviewScene采样指定相位并异步等待渲染更新,避免已有Animator状态让Attack列显示旧Idle姿势;不改写或暂停真实验收场景。该方法已实际编译执行、峰值截图核对通过。
## 敌人攻击/受击表现衔接(2026-10-21)
五类正式敌人已接入8套攻击/命中特效与8条TangoFlux短音效,受击不再只有缩放。资产放在 `Assets/Bundles/Effects/EnemyCombat/` 和 `Assets/Bundles/Sound/SFX/EnemyCombat/`;完整方案见 [../Combat/EnemyCombatFx/Production.md](../Combat/EnemyCombatFx/Production.md)。继续制作敌人时需检查类型映射、攻击与目标命中位置、硬甲分类、音效开关及池回收;不能让动画事件扣血或把减速Pulse当成实际命中。现有规则即时结算与动画前摇的对齐属于下一阶段技能时序改造。
@@ -0,0 +1,69 @@
# 烈焰狮 FlameLion · T1 伙伴制作记录
2026-10-21完成。伙伴ID=6,火元素输出,主动技能“燎原烈焰”(kind=burst,T1/T2为2/3目标)。保留原型双足比例与金橙身体、赤橙鬃毛身份,风格与现有正式伙伴一致。本次交付角色视觉,未修改Config/Gameplay/greenfield.json玩法数值。
## 交付
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/FlameLion/FlameLion.prefab` |
| 动画伙伴入口 | 同目录 `FlameLion_Companion.prefab` |
| 骨架中间Prefab | 同目录 `FlameLion_Rigged.prefab` |
| 独立验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_FlameLion_Review.unity` |
| 并排/Play截图 | `AIClient/Assets/Screenshots/companion_flamelion_{review,play}.png` |
| 正式配方 | `Config/Art/Companions/FlameLion.json` |
| 来源与状态 | `Tools/output/companions/FlameLion/production_manifest.json`,status=validated |
0.60m、2000三角面/992原始顶点,1024² base/mix、Test/XPbr;每顶点最多4个归一化权重。Unity Y-up、底面中心、局部-Z正面;逻辑根旋转identity/单位缩放,Root Motion关闭。没有运行时补转或临时改骨。
## 来源与静态验收
内置image_gen参考 `AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_6.png` 身份/双足比例和 `Doc/Design/Character/FireCat/firecat.png` 风格生成flamelion.png,1024×1536,白底四角RGB最小253;提示词、参考和内置生成模式完整保存于design_prompt.txt。图像SHA256为caec79d3578de66e37861d89dbff1e7b7ee068ab8fd4fd925efaedd777897123。鬃毛与尾簇是实体毛发,无预烘焙喷火或粒子。
用户已明确允许本角色设计图提交腾讯混元3D及模型/骨架发送项目DGXA。官方网页50k任务62a709af10ca42818aa72b6c092402a4得到Tools/output/flamelion_3d/flamelion.glb,实测50000tris、内嵌贴图解码通过。
Blender5减面/UV/烘焙到Tools/output/flamelion_game/flamelion_xpbr。通过Pipeline导入FBX与两张PNG,在Unity创建XPbr与静态Prefab;离线mat/meta不导入。实测静态高0.599976m、底面-0.000001m,正/侧/背/透视图确认-Z与形状,未额外旋转高模。
## 同角色骨架与权重
首轮DGXA CUDA上下文显存错误后,外部后端回退本机,得到异常33骨长链;该骨架已拒收,保留local_invalid_rigged.glb/回执和bind_probe.txt诊断,不接动作。明确远程重试仍遇显存错误,最小CUDA分配恢复成功且容器无残留任务后再次重试成功;全程未停止其它模型服务。
正式骨架为DGXA TokenRig original自身28骨,Tools/output/flamelion_dgx/high_rig/rigged.glb,回执backend=remote。rig SHA256:e3bdf093d484a2f87d2385b6be372f55594fb8eac7869362e87a43547e61cc96;三段UniMate源动作全部在该rig上新生成,CUDA成功,rig/FBX哈希及导入后骨路径一致性通过。先单Walk数值与四相位目视,再生成Idle/Attack。
自身映射:root0、chest3、neck4、head5;双臂7/14,双爪参考10/17;双脚22/26、脚尖23/27。编号只属于本角色。该骨架没有独立下颌或尾骨,本版无张嘴口型或独立尾部次级摆动;火焰释放由头部/双爪施法动作与事件表达。
低模Y-up→Blender Z-up,对齐底面中心/等比尺寸后转权重,保留原网格和UV。表面距离最大0.012422/RMS0.004445,源高约1.056;最终绑定对照静态模最大顶点误差0.000030m。Armature轴约定保持同源一致,不单独清零。
头鬃宽空间区域影响747个源顶点,其中681个全权重到head5;双脚区域影响44/47个源顶点。随后用更精细的尾部测地距离覆盖58个源顶点到髋骨root0,避免尾簇被头部宽区域或前臂带动。蒙皮工具现明确先空间区域、后测地覆盖的优先级;既有伙伴此前没有同时使用两类覆盖,原单类行为不变。报告保留每区范围和影响数。
skinRegions/skinOverrides使用原静态FBX坐标/高度,Z与Unity相反;maneRegion使用Unity归一化坐标供独立QA。刚性检查覆盖992个头鬃区Unity顶点,扣除头骨刚性变换后误差在报告精度0,门槛1mm;两脚实际采样80/55个顶点。
## 三动作与验收
| 动作 | 成品行为 | 各121帧实际蒙皮结果 |
| --- | --- | --- |
| Idle | 1.8秒循环,8%源变化+轻呼吸,双脚固定 | 最大形变0.02203m,身体倾角2.387°,两脚支撑 |
| Walk | 1.2秒循环,12%源变化+离线交替短步 | 实际步幅0.04866/0.06737m,抬脚0.01789/0.01191m,至少一脚支撑;身体倾角3.514° |
| Attack | 1.2秒单次,8%源变化+后收蓄力/双爪展开前送与头部释放/恢复 | 最大形变0.12594m,头部相对胸背前送0.01624m/抬头6.654°;双爪相对胸背前送0.06257/0.05974m、外展0.02023/0.01817m;两脚支撑,身体倾角1.584° |
原始Walk首帧根倾角34.142°,离线对所有骨骼校准至自身绑定姿态,保留相对源变化。最初保留25%源变化时左脚实际抬起6.71mm未通过门槛,降至12%后达11.91mm;不放宽实际网格门槛,也不只检查骨点。
三段首尾顶点差均为0、逻辑根XZ漂移0。Walk整体底面[-0.000109,0.000117]m,Idle/Attack约0~0.000001m;待机与施法两脚持续撑地,最大另一脚离地0.18mm。头部前送、双爪前送/外展扣除胸背转动后检查,不能由身体前倾冒充施法。
控制器Idle↔Walk、两状态进入Attack、单次Trigger只攻击一次、恢复请求状态及过渡贴地通过。实际10秒Play观察到三状态,最大根/身体倾角3.504°,逻辑根固定;结束已回编辑模式。静态四向、Walk四相位、Idle中段、Attack蓄力/释放/恢复四向近景均已核对,鬃毛与尾簇未见明显拉扯。
X=140独立Additive场景包含Static/Idle/Walk/Attack/Cycle五组。制作期间检测到其它敌人场景占用Play时先停止制作入口;用户明确允许退出后继续,保留其它场景。并排截图发现旧Attack姿势缓存,Capture现从正式Prefab在隔离PreviewScene建立新实例并采样,截图显示正确施法峰值,原场景与轮播不被暂停/改写。
## 调用与复现
Animator在Model节点:Motion Int 0=Idle、1=Walk;Attack Trigger触发一次火焰施法。Attack在0.6秒发送OnCompanionAttackImpact;接收器需位于Animator节点或转发。真实扇形火焰特效、音效、双/三目标伤害、灼烧表现与关卡简模替换仍由技能系统接入。
```powershell
python Tools/character_animation_pipeline.py --recipe Config/Art/Companions/FlameLion.json --build-review --play-check
# 需要重新绑骨时明确远程,禁止复用本机诊断
python Tools/rig_character_source.py --source Tools/output/flamelion_3d/flamelion.glb --out Tools/output/flamelion_dgx/high_rig --generate --backend remote
```
完整标准入口及最终隔离截图方法均已执行通过。8项Python流程保护测试、制作/QA/截图C#实际编译执行、火喵只读回归通过。初始FlameLion.draft.json仍boneMappingReady=false,仅为禁用历史草稿。
报告位于Tools/output/companions/FlameLion:production_manifest.json、verification.txt、walk_verification.txt、play_verification.txt、walk_processing.txt、motion_processing.txt、FlameLion_Rigged.skin.json;last_failure.txt保留已修正的25%Walk抬脚诊断,最终状态以validated清单与verification为准。资源登记Picture/Model/Animation/Config,总清单追加静态与伙伴两项,仅ValidateOnly,不重建总场景。
@@ -0,0 +1,18 @@
Mode: built-in image_gen (generate; stylized-concept)
Date: 2026-10-21
Output: Doc/Design/Character/FlameLion/flamelion.png
References:
- AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_6.png (identity/proportions)
- Doc/Design/Character/FireCat/firecat.png (style)
Final prompt:
Use case: stylized-concept.
Asset type: production concept for AIGame Unity mobile game T1 companion FlameLion / 烈焰狮, ID 6.
Input images: Image 1 is the EXISTING identity/proportion reference, a cute upright small lion with golden-orange head, orange-red body, warm rust-orange mane, two small ears and two grounded feet; retain its recognizable lion identity and upright two-legged proportions while replacing primitive proxy geometry. Image 2 is STYLE ONLY: match the existing FireCat companion's polished friendly chibi 3D game render, large expressive glossy eyes, rounded body volumes, soft lighting and clean readable surfaces. The new animal must clearly be a male lion with rounded lion ears, broad muzzle and mane, not a duplicate kitten.
Subject: one adorable stout baby male lion, oversized round golden-orange face framed by a thick warm reddish-orange sculpted mane. The mane forms a compact continuous attached silhouette around the head and neck, with a few broad flame-shaped fur locks, no individual floating flames. Small round lion ears, large friendly amber-brown eyes, broad cream muzzle, small dark rounded nose, gentle closed-mouth smile. Golden-orange torso, cream belly and toe tips, two relaxed short forepaws, two chunky hind feet, one short visible curved lion tail ending in a solid reddish-orange fur tuft. T1 base animal, without clothing or equipment.
Pose: neutral symmetrical upright BIPED standing pose like the prototype and companion style, both hind feet flat on one common ground plane, clear gap between feet; forepaws slightly away from torso with visible armpit gaps, palms angled inward at rest, long enough for later braced spell casting. Head level and facing the viewer, no attack or large gesture. Mane leaves forepaws and shoulders readable for rigging; tail visible with gap from forearm.
Composition: single full-body character, centered, portrait 2:3 framing, almost frontal with only a very slight three-quarter angle (no more than 10 degrees); all mane, ears, paws, feet and tail completely in frame, generous white margins.
Scene/backdrop: pure solid white #FFFFFF to all four corners, soft neutral studio light and only a faint contact shadow immediately under feet.
Materials: simple stylized soft fur, broad sculpted mane locks, clean gold / orange / rust-orange / cream palette, suitable for 2000-triangle reconstruction with 1024 textures. Match FireCat level of finish while keeping lion identity.
Constraints: exactly ONE character, TWO grounded hind feet, TWO separate forepaws, ONE tail. No text, watermark, panel, logo, UI, border, base pedestal, scenery, extra characters, weapons, saddle, collar, metal armor, jewelry, magical glow, particles, flames detached from the animal, fire breath, smoke, effects, or an open-mouth attack pose. Flame-themed mane is solid attached fur geometry, not an effect.
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

@@ -0,0 +1,69 @@
# 岩甲犀 RockRhino · T1 伙伴制作记录
2026-10-21完成。伙伴ID=5,前排控制,主动技能“碎岩震荡”(kind=slow)。蓝灰身体、青色岩甲、象牙独角与四足体态沿用原型身份,风格与现有正式伙伴一致。交付角色视觉;Config/Gameplay/greenfield.json玩法数值未修改。
## 交付
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/RockRhino/RockRhino.prefab` |
| 动画伙伴入口 | 同目录 `RockRhino_Companion.prefab` |
| 骨架中间Prefab | 同目录 `RockRhino_Rigged.prefab` |
| 独立验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_RockRhino_Review.unity` |
| 并排/Play截图 | `AIClient/Assets/Screenshots/companion_rockrhino_{review,play}.png` |
| 正式配方 | `Config/Art/Companions/RockRhino.json` |
| 来源与验收状态 | `Tools/output/companions/RockRhino/production_manifest.json`,status=validated |
0.55m、2000三角面/990原始顶点,1024² base/mix、Test/XPbr;每顶点最多4个归一化权重。Unity Y-up、底面中心、局部-Z为正面。外层逻辑根单位缩放/旋转identity,关闭Root Motion;未通过运行时补转、改骨或临时造动画修正朝向。
## 来源与朝向
内置image_gen参考 `AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_5.png` 的角色身份及 `Doc/Design/Character/FireCat/firecat.png` 的风格生成 `rockrhino.png`,1536×1024,白底四角RGB最小251。完整最终提示词、生成模式与参考保存在design_prompt.txt;设计原稿留在Doc,不进Bundles。
用户明确授权本角色设计图提交腾讯混元3D(3d.hunyuan.tencent.com),以及后续模型/骨架发送项目内网DGXA(192.168.132.46)完成绑骨和三动作。官方网页50k任务 `4d627ad034af4ca18079d3dbfd188718` 得到 `Tools/output/rockrhino_3d/rockrhino.glb`,实测49992 tris,内嵌贴图解码通过。
首版静态模在Unity正面显示朝向偏侧,保留 `static_audit_initial` 为诊断。原高模离线绕Blender Z +70°并重置底面中心,得到 `rockrhino_forward.glb`,再统一减面烘焙和绑骨;此次角度来自本角色检查,不沿用泡泡龟参数。最终Unity前/侧/背视图确认鼻角和头朝-Z、前后脚方向正确。刚性校准保留源形状和UV,无运行时补转。
正式烘焙目录 `Tools/output/rockrhino_game_forward/rockrhino_forward_xpbr/`。Blender5减面/UV/烘焙到2000 tris/1024贴图;Pipeline只导入FBX与两张PNG,在Unity创建XPbr材质和Prefab。初始侧向烘焙仅作诊断。
## 同源骨架与蒙皮
同角色forward高模经DGXA TokenRig original生成自身29骨。骨架 `Tools/output/rockrhino_dgx/high_rig/rigged.glb`,来源回执rig_request.json。rig SHA256:`26e215886fb538baa3b58bbb511b8d21bd3ce00ef4ddf316d7d8c5d210f86ca0`。三段UniMate源动作均在该rig上新生成、CUDA成功,回执保留英文提示词/任务号/rig与FBX哈希;先通过单Walk门禁及五相位目视,再生成Idle/Attack。
自身映射:root0、chest1、neck2、head3、嘴部链4、耳链5..8;前右下腿/蹄尖11/12、前左15/16、后右19/20、后左27/28,尾链21..24。编号只属于本角色,禁止套用其它伙伴。Armature导出轴约定与三动作保持一致,不单独清零。
低模Y-up→Blender Z-up,对齐底面中心/等比尺寸后转权重,保留网格与UV。表面距离最大0.005907/RMS0.002024(源高约0.738),绑定后对照静态模最大顶点误差0.000041m。
按本角色网格检查设置离线skinRegions:岩甲/胸背区影响231个源顶点、200个全权重至chest1;头角区379个、341个全权重至head3;四蹄分别影响77/87/82/82个源顶点。每区保留渐变与范围报告,不改几何。耳部随头部整体运动;本版未制作独立耳部次级动作。
skinRegions采用原静态FBX坐标/高度,其Z与Unity相反;armorRegion与hornRegion采用Unity归一化坐标供独立QA。刚性验收覆盖350个岩甲区/73个头角区Unity顶点,扣除对应骨骼刚性变换后误差在报告精度为0,门槛均1mm。四脚实际采样127/146/129/124个蒙皮顶点。
## 三动作与验收
| 动作 | 成品行为 | 各121帧实际蒙皮结果 |
| --- | --- | --- |
| Idle | 2.0秒循环,4%源变化与轻微头部呼吸 | 最大形变0.00724m,身体倾角0.818°,四脚支撑 |
| Walk | 1.4秒原地循环,12%源变化与四拍短步,20%摆动窗口 | 四脚步幅0.05979/0.05962/0.05976/0.05963m,抬脚0.01468/0.01531/0.01596/0.01599m,至少三脚支撑,身体倾角1.125° |
| Attack | 1.2秒单次,4%源变化与头肩后收→低头短冲→恢复 | 最大形变0.09503m,头前送0.04145m/回收0.01373m,肩前送0.02507m,头转角11.208°,角区相对头枢轴降低0.03277m,身体倾角2.845°,四脚支撑 |
Attack初版保留8%源变化时一只后蹄离地0.00408m,未通过四脚撑地门槛。将该角色attackSourceWeight调为4%后,最大后蹄离地降至0.00177m,其余蹄≤0.00098m;低头/肩部前送仍通过。未放宽3mm撑地门槛,也未重新标记旧动作来源。
三段首尾顶点差均0、逻辑根XZ漂移0。Walk实际整体脚底范围[-0.000045,0.000164]m,Idle/Attack约±0.001mm;岩甲和独角保持刚性。静态四向、Walk五相位、Idle中段、Attack蓄力/命中/恢复四向近景均已检查,未见明显拉伸或穿模。
控制器验证Idle↔Walk、两者进入Attack、单次Trigger只攻击一次、结束返回所请求状态及过渡贴地通过。实际10秒Play观察到Idle/Walk/Attack,最大身体倾角2.826°、外层根固定,完成后退出Play。独立X=120场景包含Static/Idle/Walk/Attack/Cycle五组,Pipeline Additive创建,保留已有场景。
完整标准入口已用最终配方执行成功,清单status=validated。现场Editor导入后曾出现脚本调度超时;流程脚本现在为run_script显式设置服务器90秒/CLI120秒窗口,不在未知执行结果上自动重试写入。QA在失败时另存last_failure.txt用于诊断;该文件保留修正前失败历史,当前结果以verification.txt与validated清单为准。
## 调用与复现
Animator在Model节点:Motion Int 0=Idle、1=Walk;Attack Trigger触发一次头肩冲撞。Attack在0.6秒发送OnCompanionAttackImpact,事件接收器需位于Animator节点或转发。
当前交付为可调用的角色视觉资产。真实冲锋/目标选择、减速结算、震荡特效、音效及关卡简模替换仍由技能系统接入,不表示本次已完成。
```powershell
python Tools/character_animation_pipeline.py --recipe Config/Art/Companions/RockRhino.json --build-review --play-check
```
quadruped_heavy/braced_bash为本次已验证解剖分支,复用四足步态基础,独立检查胸背/头颈/四蹄和岩甲/独角刚性、肩部前送与可见低头。其它四足仍需检查自身映射与完整验收。初始RockRhino.draft.json继续boneMappingReady=false,仅作禁用历史草稿。
报告位于Tools/output/companions/RockRhino:production_manifest.json、verification.txt、walk_verification.txt、play_verification.txt、walk_processing.txt、motion_processing.txt、RockRhino_Rigged.skin.json;近景为static_audit、walk_audit、idle_audit、attack_audit。资源分别登记Picture/Model/Animation/Config,并将静态及伙伴追加总验收manifest,仅ValidateOnly、不重建总场景。
@@ -0,0 +1,18 @@
Mode: built-in image_gen (generate; stylized-concept)
Date: 2026-10-21
Output: Doc/Design/Character/RockRhino/rockrhino.png
References:
- AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_5.png (identity)
- Doc/Design/Character/FireCat/firecat.png (style)
Final prompt:
Use case: stylized-concept.
Asset type: production concept for the Unity game AIGame, one T1 companion RockRhino / 岩甲犀, ID 5.
Input images: Image 1 is the EXISTING prototype identity reference: blue-gray rhino, ivory horn, cyan angular armor; preserve this recognizable palette and identity while replacing its primitive proxy geometry. Image 2 is STYLE ONLY: match the FireCat companion's friendly polished chibi 3D game render, big expressive glossy eyes, appealing rounded volumes and clean readable shapes. Do not add cat features or fur to the rhino.
Subject: one small friendly stocky FOUR-LEGGED rhinoceros with a broad rounded blue-gray head and muzzle, two large expressive dark eyes, small rounded ears, ONE short sturdy ivory horn centered on its nose, a thick squat blue-gray body, a few broad softly beveled cyan / teal stone armor plates integrated across shoulders and back. Short visible tail. Compact strong legs with simple rounded gray hooves. Stone plates are solid continuous attached armor, with shallow seams, not floating shards.
Pose: calm neutral rigging-friendly quadruped standing pose. Four distinct stout legs, all four separate hooves grounded on a common flat plane, visible gaps between each leg and belly. Bilaterally symmetrical anatomy and level back. Head held naturally forward at rest, not attacking, not grazing. Neck readable and separable from shoulders for a later short braced head-and-shoulder bash animation.
Composition: single full-body character, centered, landscape 3:2 composition, very shallow front three-quarter view (about 15 degrees off frontal) to show horn, both eyes, body length and all four legs; no exaggerated perspective or foreshortening. All horn, ears, tail and hooves fully in frame, generous white margin.
Scene: pure solid white #FFFFFF background to all four corners, soft neutral studio lighting and minimal subtle contact shadow directly beneath feet.
Material: smooth matte blue-gray skin, rounded stylized cyan stone armor, ivory horn; high quality soft 3D game art, simple surfaces suitable for 2000-triangle mobile-game reconstruction and 1024 textures. T1 base creature with restrained armor, no equipment.
Constraints: exactly ONE rhino, ONE nose horn, FOUR legs; no text, no lettering, no watermark, no borders, no reference panels, no UI, no floor base, no scenery, no other characters, no saddle, no accessories, no magical glow, no particles, no floating stones, no attack effect, no biped pose.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

@@ -0,0 +1,55 @@
# 闪闪雀 SparkBird · T1 伙伴制作记录
2026-10-20完成。伙伴ID=3,电元素输出,现行技能“跃动雷光”;黄色圆身/奶油腹部、青蓝色短翼和闪电冠羽、橙色喙脚,延续火喵/芽芽的成品风格。本次交付正式角色视觉,玩法数值保持Config/Gameplay/greenfield.json现状。
## 交付
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/SparkBird/SparkBird.prefab` |
| 动画伙伴入口 | 同目录 `SparkBird_Companion.prefab` |
| 骨架中间Prefab | 同目录 `SparkBird_Rigged.prefab` |
| 验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_SparkBird_Review.unity` |
| 并排/Play截图 | `AIClient/Assets/Screenshots/companion_sparkbird_{review,play}.png` |
| 正式配方 | `Config/Art/Companions/SparkBird.json` |
| 来源与状态 | `Tools/output/companions/SparkBird/production_manifest.json`,status=validated |
0.45m,2000三角面/998原始顶点,1024² base/mix,Test/XPbr,每顶点最多4个归一化权重。Y-up、底面中心、局部-Z正面;外层逻辑根旋转identity/缩放1,Root Motion关闭。
## 来源与制作
1. 内置imagegen参考proto_pet_3身份与火喵成品风格生成 `sparkbird.png`,1024×1536,白底四角RGB最小253。完整提示词、模式与参考见 `design_prompt.txt`。
2. 用户明确授权本角色设计图提交腾讯混元3D及后续模型/骨架发送项目DGXA后,混元官方网页50k生成 `Tools/output/sparkbird_3d/sparkbird.glb`(50000 tris),内嵌贴图解码通过,回执 `hunyuan_status.json`。
3. Blender5减面/UV/烘焙到2000 tris/1024 XPbr,产物 `Tools/output/sparkbird_game/sparkbird_xpbr/`。Pipeline仅导入FBX和两张PNG,Unity创建材质/Prefab,不复制离线mat/meta。
4. 同一高模通过DGXA TokenRig original模板生成自身28骨,保留 `Tools/output/sparkbird_dgx/high_rig/rigged.glb` 及source/rig哈希。rig SHA256:`0c96b8f84ee9c42ca93d726294a5eb007c62dbe1fa6b6fa1b237d8916bbe8ab8`。
5. 静态低模Y-up→Blender Z-up,底面中心/等比尺寸对齐后转权重,保留网格与UV。对齐距离max0.005798/RMS0.002192(源高约1.064);本角色未使用额外skinOverrides。绑定后对静态模最大顶点误差0.000021m。
6. 先生成并验收单Walk,再补Idle与雷电施法Attack,均使用同一28骨rig、CUDA成功;每段保留英文提示词、任务号、原始GLB/FBX、高模预览、npy、rig及FBX哈希。
7. 新增 `avian_grounded`/`wing_cast` 离线适配:保留鸟的两脚地面步态,按自身翼根/翼尖映射编辑双翼后收、上举并前挥。全骨骼参考绑定校准、贴地/循环闭合及动作语义编辑均保存为.anim,不依赖运行时反向旋转或临时动画。
骨骼映射来自本角色检查:root=bone_0、chest=bone_3、头部链bone_4/5;X正侧翼根bone_7/羽翼链8..12/翼尖12,X负侧翼根bone_14/链15..19/翼尖19;左右踝22/26,脚尖23/27。正面参考用两个不同踝骨22/26。无独立尾羽/冠羽次级骨;峰值动作已检查整体形状,不能据28骨数量推断所有附肢独立可控。
## 动作与验收
| 动作 | 行为 | 各121帧实际蒙皮结果 |
| --- | --- | --- |
| Idle | 1.4秒循环,6%源变化+轻呼吸/翼部收整,首尾绑定参考 | 最大形变0.01301m;根倾角0.692°;脚底误差≤0.005mm |
| Walk | 0.9秒地面短步循环,25%源变化+交替步幅与抬脚 | 左右步幅0.04259/0.04558m;根倾角2.209°;脚底误差≤0.076mm |
| Attack | 1.0秒单次,10%源变化+35°前挥/25°展翼;0.45秒释放事件,恢复Idle | 最大形变0.06489m;根倾角3.446°;脚底误差≤0.034mm;内部视觉位移0.002m |
源Walk根倾角76.906°,通过全骨骼源首帧相对绑定校准处理,保留正确Armature约定。三段循环/恢复端点顶点差均为0。独立鸟型门禁扣除根骨转动后测得双翼相对身体前挥0.03432/0.03705m,均大于1cm;身体前倾本身不能代替挥翼通过此检查。
控制器Idle↔Walk、Idle/Walk进入Attack、一次Trigger仅一次施法及恢复请求状态全部通过。实际10秒Play观察到Idle/Walk/Attack,最大根倾角3.421°,逻辑根固定,完成后已退出Play。五组场景为Static/Idle/Walk/Attack/Cycle,X=80,与芽芽X=60隔开,保留已打开场景及其内容。
静态四向、Walk四相位、Idle半周期、Attack蓄力/出手/恢复四向近景已目视检查;保持鸟爪交替迈步,双翼可读,尾羽和冠羽未见明显拉扯或塌陷。近景目录 `static_audit/`、`walk_audit/`、`idle_audit/`、`attack_audit/`。
## 调用与复现
Animator在Model节点:`Motion` Int 0=Idle、1=Walk,`Attack` Trigger触发一次施法。Attack在0.45秒发送 `OnCompanionAttackImpact`;接收器应在Animator所在节点或转发。事件仅提供视觉释放时机,真实雷电、链式选敌、伤害、特效及音效仍由技能系统接入。角色尚未替换正式关卡简模。
```powershell
python Tools/character_animation_pipeline.py --recipe Config/Art/Companions/SparkBird.json --build-review --play-check
```
默认复用哈希验证后的本地来源,显式 `--generate` 才请求新动作。初始 `SparkBird.draft.json` 继续禁用(boneMappingReady=false),正式配方为SparkBird.json。
报告:`verification.txt`、`walk_verification.txt`、`play_verification.txt`、`walk_processing.txt`、`motion_processing.txt`、`SparkBird_Rigged.skin.json`,均位于 `Tools/output/companions/SparkBird/`。新增鸟型配方保护和原流程共5项Python测试通过;2个C#脚本编译通过,最终鸟型门禁与Edit/Play实际运行通过。当前AIClient为用户已有GUI实例,保留开启,未关闭其他Unity项目。
@@ -0,0 +1,13 @@
Use case: stylized-concept.
Asset type: one production character concept for image-to-3D, SparkBird (闪闪雀), T1 electric-element damage companion for the same polished cute fantasy mobile game.
Input images: Image 1 proto_pet_3 is the identity reference, preserving a rounded yellow sparrow-like bird, cyan blue wings and crest, orange beak and feet. Image 2 FireCat is ONLY the established polished 3D art style, scale language and eye rendering reference. Create a bird, not a cat.
Primary request: a charming small upright bipedal electric sparrow creature with a large rounded head and compact pear-shaped sunny yellow body, cream pale-yellow belly, glossy expressive dark amber eyes with readable whites, tiny friendly orange beak, two solid rounded cyan blue feather wings held slightly away from the body, a short solid cyan crest with a subtle lightning-zigzag silhouette, a small compact cyan tail, two short clearly separated orange legs with broad three-toed bird feet. Cheerful energetic expression, simple T1 form. Both wings and both feet clearly visible, clear shoulder and ankle separation suitable for rigging. Wings are compact feather paddles with only two or three broad sculpted feather lobes, not hands; no fingers.
Style/medium: high quality stylized 3D studio character render matching FireCat, gently textured soft feather surfaces, clean solid rounded volumes, a few readable broad feather details, collectible companion appeal.
Composition: one character only, centered full body, front-biased very slight three-quarter view, upright neutral standing pose with both feet grounded, wings slightly spread down and away from torso to leave small visible gaps. Full crest and tail in frame with comfortable 12% white margins. Portrait 2:3 framing.
Lighting: soft neutral studio lighting, pure solid white RGB255 background including all four corners, minimal soft contact shadow under feet.
Constraints: suitable for a clean 2000 triangle game mesh; thick connected solid feathers and crest, compact tail, no floating electricity, particles, detached ornaments or translucent effects. No clothes, jewelry, weapons, scenery, text, labels, multiple views, border or watermark. No cat ears, paws or fur. Do not turn it into a duck or penguin. No long flight wings and no hovering.
Mode: built-in image_gen, new concept with two reference images.
Identity reference: AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_3.png
Style reference: Doc/Design/Character/FireCat/firecat.png
Output: Doc/Design/Character/SparkBird/sparkbird.png (1024x1536).
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

@@ -0,0 +1,14 @@
# 雷鸣豹 ThunderLeopard · T1 伙伴制作记录
2026-10-21 完成。伙伴 ID=8。设计图 `thunderleopard.png`(种子 81004,草图与提示词见 drafts/、design_drafts.json)。
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/ThunderLeopard/ThunderLeopard.prefab`(0.45m,2000 tris,Test/XPbr) |
| 动画伙伴入口 | 同目录 `ThunderLeopard_Companion.prefab`(Animator:Motion Int 0/1、Attack Trigger、OnCompanionAttackImpact) |
| 验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_ThunderLeopard_Review.unity` |
| 正式配方 | `Config/Art/Companions/ThunderLeopard.json`(quadruped_heavy/braced_bash(头肩短扑),自身 31 骨,骨骼映射见 anatomyNotes) |
| 来源与验收 | `Tools/output/companions/ThunderLeopard/production_manifest.json`(status=validated)、verification.txt、play_verification.txt |
| 高模/骨架 | `Tools/output/companion_3d/ThunderLeopard/`、`Tools/output/companion_dgx/ThunderLeopard/high_rig/` |
流程:本地 Turbo 草图 → 用户选定 → 混元官网 50k → 八向渲染确认朝向 → `Tools/enemy_static_pipeline.py ThunderLeopard 0.45 --kind Animal` → DGXA TokenRig(PowerShell 启动)→ 配方 → `generate_enemy_motions.py` → `character_animation_pipeline.py --build-review --play-check`。战场 Hero8 已嵌套此 Prefab。
@@ -0,0 +1,27 @@
{
"id": "ThunderLeopard",
"name": "雷鸣豹",
"role": "pet 8 lightning damage (chain)",
"jobId": "c683f5f657ad43319249795c785f6258",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1536,
1024
],
"seedStart": 81001,
"references": [
"AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_8.png",
"Doc/Design/Character/FireCat/firecat.png"
],
"prompt": "Image 1 is the EXISTING prototype identity reference made of primitive shapes: keep its recognizable palette and idea while replacing the primitive proxy geometry with a real character. Image 2 is STYLE ONLY: match the FireCat companion's friendly polished chibi 3D mobile-game render, big expressive glossy eyes, appealing rounded volumes and clean readable shapes; do not copy cat features. One friendly T1 companion creature for a cozy meadow tower-defense game. Calm neutral rigging-friendly standing pose, bilaterally symmetrical, all feet grounded on a common flat plane with visible gaps between the limbs, head facing forward. Single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), everything in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Every part is solid and attached to the body: no floating pieces, no separate water drops, sparks, petals or particles. Simple smooth surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props, no scenery, no floor base. ThunderLeopard, a small sturdy FOUR-LEGGED leopard cub standing on all four paws: soft violet-purple fur with a few darker purple rosette spots, cream muzzle and belly, round ears, big bright golden eyes, a confident playful grin. Two broad solid cyan lightning-bolt-shaped crystal plates fused onto the shoulders like small armor, and one short cyan zigzag crystal crest on the forehead; the crystals are solid attached parts with shallow seams, not floating. Medium thick tail with a cyan crystal tip, attached. Four distinct stout legs with rounded paws all grounded, level back, head held forward at rest, neck readable and separable from the shoulders for a later short head-and-shoulder pounce animation. Landscape composition showing the whole body length.",
"drafts": [
"Doc/Design/Character/ThunderLeopard/drafts/ThunderLeopard_81001.png",
"Doc/Design/Character/ThunderLeopard/drafts/ThunderLeopard_81002.png",
"Doc/Design/Character/ThunderLeopard/drafts/ThunderLeopard_81003.png",
"Doc/Design/Character/ThunderLeopard/drafts/ThunderLeopard_81004.png"
],
"generatedUtc": "2026-10-21T03:23:47Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

@@ -0,0 +1,14 @@
# 潮汐鲸 TideWhale · T1 伙伴制作记录
2026-10-21 完成。伙伴 ID=9。设计图 `tidewhale.png`(种子 91001,草图与提示词见 drafts/、design_drafts.json)。
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/TideWhale/TideWhale.prefab`(0.55m,2000 tris,Test/XPbr) |
| 动画伙伴入口 | 同目录 `TideWhale_Companion.prefab`(Animator:Motion Int 0/1、Attack Trigger、OnCompanionAttackImpact) |
| 验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_TideWhale_Review.unity` |
| 正式配方 | `Config/Art/Companions/TideWhale.json`(biped_short/body_slam,自身 22 骨,骨骼映射见 anatomyNotes) |
| 来源与验收 | `Tools/output/companions/TideWhale/production_manifest.json`(status=validated)、verification.txt、play_verification.txt |
| 高模/骨架 | `Tools/output/companion_3d/TideWhale/`、`Tools/output/companion_dgx/TideWhale/high_rig/` |
流程:本地 Turbo 草图 → 用户选定 → 混元官网 50k → 八向渲染确认朝向 → `Tools/enemy_static_pipeline.py TideWhale 0.55 --kind Animal` → DGXA TokenRig(PowerShell 启动)→ 配方 → `generate_enemy_motions.py` → `character_animation_pipeline.py --build-review --play-check`。战场 Hero9 已嵌套此 Prefab。
@@ -0,0 +1,27 @@
{
"id": "TideWhale",
"name": "潮汐鲸",
"role": "pet 9 water guardian (shield)",
"jobId": "393f36d96c6d4788a67d420c7d7f454a",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 91001,
"references": [
"AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_9.png",
"Doc/Design/Character/FireCat/firecat.png"
],
"prompt": "Image 1 is the EXISTING prototype identity reference made of primitive shapes: keep its recognizable palette and idea while replacing the primitive proxy geometry with a real character. Image 2 is STYLE ONLY: match the FireCat companion's friendly polished chibi 3D mobile-game render, big expressive glossy eyes, appealing rounded volumes and clean readable shapes; do not copy cat features. One friendly T1 companion creature for a cozy meadow tower-defense game. Calm neutral rigging-friendly standing pose, bilaterally symmetrical, all feet grounded on a common flat plane with visible gaps between the limbs, head facing forward. Single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), everything in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Every part is solid and attached to the body: no floating pieces, no separate water drops, sparks, petals or particles. Simple smooth surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props, no scenery, no floor base. TideWhale, a chubby baby whale standing UPRIGHT on two short stubby feet like a small round plush toy, not swimming and not floating: a round cyan-blue whale body with a smooth cream belly with soft grooves, a gently domed head, big friendly eyes, a small happy smile, two short rounded flippers held at the sides as arms, a small rounded dorsal fin, a short whale tail with two rounded flukes resting behind on the ground, two short separate stubby legs with flat round feet, a protective calm look. No water spout, no splash, no bubbles.",
"drafts": [
"Doc/Design/Character/TideWhale/drafts/TideWhale_91001.png",
"Doc/Design/Character/TideWhale/drafts/TideWhale_91002.png",
"Doc/Design/Character/TideWhale/drafts/TideWhale_91003.png",
"Doc/Design/Character/TideWhale/drafts/TideWhale_91004.png"
],
"generatedUtc": "2026-10-21T03:27:21Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 998 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 856 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 KiB

@@ -0,0 +1,14 @@
# 藤蔓灵 VineSprite · T1 伙伴制作记录
2026-10-21 完成。伙伴 ID=7。设计图 `vinesprite.png`(种子 71001,草图与提示词见 drafts/、design_drafts.json)。
| 项目 | 路径 |
| --- | --- |
| 静态伙伴 | `AIClient/Assets/Bundles/Characters/Animal/VineSprite/VineSprite.prefab`(0.5m,2000 tris,Test/XPbr) |
| 动画伙伴入口 | 同目录 `VineSprite_Companion.prefab`(Animator:Motion Int 0/1、Attack Trigger、OnCompanionAttackImpact) |
| 验收场景 | `AIClient/Assets/Bundles/Scenes/Review/Companion_VineSprite_Review.unity` |
| 正式配方 | `Config/Art/Companions/VineSprite.json`(biped_short/ranged_cast(治疗施法),自身 28 骨,骨骼映射见 anatomyNotes) |
| 来源与验收 | `Tools/output/companions/VineSprite/production_manifest.json`(status=validated)、verification.txt、play_verification.txt |
| 高模/骨架 | `Tools/output/companion_3d/VineSprite/`、`Tools/output/companion_dgx/VineSprite/high_rig/` |
流程:本地 Turbo 草图 → 用户选定 → 混元官网 50k → 八向渲染确认朝向 → `Tools/enemy_static_pipeline.py VineSprite 0.5 --kind Animal` → DGXA TokenRig(PowerShell 启动)→ 配方 → `generate_enemy_motions.py` → `character_animation_pipeline.py --build-review --play-check`。战场 Hero7 已嵌套此 Prefab。
@@ -0,0 +1,27 @@
{
"id": "VineSprite",
"name": "藤蔓灵",
"role": "pet 7 grass support (heal)",
"jobId": "72bc2417017d4189a502eb764aef5e4e",
"status": "completed",
"error": null,
"model": "Qwen/Qwen-Image-2.1-Turbo (LAN LLM3DGraphics local-images)",
"profile": "concept",
"size": [
1024,
1024
],
"seedStart": 71001,
"references": [
"AIClient/Assets/Bundles/UI/Texture/Prototype/proto_pet_7.png",
"Doc/Design/Character/FireCat/firecat.png"
],
"prompt": "Image 1 is the EXISTING prototype identity reference made of primitive shapes: keep its recognizable palette and idea while replacing the primitive proxy geometry with a real character. Image 2 is STYLE ONLY: match the FireCat companion's friendly polished chibi 3D mobile-game render, big expressive glossy eyes, appealing rounded volumes and clean readable shapes; do not copy cat features. One friendly T1 companion creature for a cozy meadow tower-defense game. Calm neutral rigging-friendly standing pose, bilaterally symmetrical, all feet grounded on a common flat plane with visible gaps between the limbs, head facing forward. Single full-body character centered, very shallow front three-quarter view (about 15 degrees off frontal), everything in frame with generous margin. Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow under the feet. Every part is solid and attached to the body: no floating pieces, no separate water drops, sparks, petals or particles. Simple smooth surfaces suitable for a 2000-triangle mobile model with a 1024 texture. Exactly one character; no text, no watermark, no UI, no props, no scenery, no floor base. VineSprite, a small upright two-legged forest-green vine spirit, clearly different from a mint leaf bud: a rounded forest-green head with a pale lime face, a soft leaf hood that drapes over the back of the head, two thick curling vine tendrils springing from the top of the head and attached along their whole length, one small pink five-petal flower on the hood, a slim body wrapped by a single attached vine spiral, two short vine arms ending in rounded leaf hands, two short stubby root-like legs with flat rounded feet both grounded, gentle caring smile.",
"drafts": [
"Doc/Design/Character/VineSprite/drafts/VineSprite_71001.png",
"Doc/Design/Character/VineSprite/drafts/VineSprite_71002.png",
"Doc/Design/Character/VineSprite/drafts/VineSprite_71003.png",
"Doc/Design/Character/VineSprite/drafts/VineSprite_71004.png"
],
"generatedUtc": "2026-10-21T03:19:40Z"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 891 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 KiB

@@ -6,8 +6,16 @@
"label": "角色与单位美术验收",
"spacing": 3.0,
"groundSize": 24.0,
"cameraPosition": { "x": 6.0, "y": 1.4, "z": -6.5 },
"cameraTarget": { "x": 6.0, "y": 0.85, "z": 0.0 },
"cameraPosition": {
"x": 6.0,
"y": 1.4,
"z": -6.5
},
"cameraTarget": {
"x": 6.0,
"y": 0.85,
"z": 0.0
},
"fieldOfView": 35,
"subjects": [
{
@@ -59,7 +67,11 @@
"maxTriangles": 2500,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": ["Idle", "Walk", "Attack"],
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "敌方制作标准样例:同角色12骨→空间对齐→低模转权重→Idle/Walk/Attack→离线收尾;Enemy视觉Variant见Characters/Enemy/RockBall。Motion=0/1,Attack使用Trigger。"
},
{
@@ -81,8 +93,270 @@
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": ["Idle", "Walk", "Attack"],
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "火喵T1伙伴视觉:同角色22骨,Walk全骨骼首帧校准,尾部权重修正;Idle/Walk循环,Attack单次双爪施法,0.55秒出手事件。专用Companion_FireCat_Review场景Edit/Play均通过。"
},
{
"id": "BudBud",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/BudBud/BudBud.prefab",
"expectedHeight": 0.5,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "芽芽T1正式静态模,0.50m、Y-up、底面中心、局部-Z正面,正侧背检查通过。"
},
{
"id": "BudBud_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/BudBud/BudBud_Companion.prefab",
"expectedHeight": 0.5,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "芽芽T1草系治疗伙伴:混元50k→2000 tris/1024 XPbr;自身22骨,先Walk后补三动作,Edit/Play通过。",
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
]
},
{
"id": "SparkBird",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/SparkBird/SparkBird.prefab",
"expectedHeight": 0.45,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "闪闪雀T1正式静态模:混元50k→2000 tris/1024 XPbr,0.45m、Y-up、底面中心、局部-Z正面,四向验收通过。"
},
{
"id": "SparkBird_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/SparkBird/SparkBird_Companion.prefab",
"expectedHeight": 0.45,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "闪闪雀T1电系输出伙伴:自身28骨,avian_grounded/wing_cast,先Walk后补三动作,双翼相对身体前挥门禁及Edit/Play通过。",
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
]
},
{
"id": "BubbleTurtle",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/BubbleTurtle/BubbleTurtle.prefab",
"expectedHeight": 0.35,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "泡泡龟T1正式静态模:混元50k→离线统一朝向→2000 tris/1024 XPbr,0.35m、Y-up、底面中心、局部-Z正面,四向图确认。"
},
{
"id": "BubbleTurtle_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/BubbleTurtle/BubbleTurtle_Companion.prefab",
"expectedHeight": 0.35,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "泡泡龟T1水系守护:最终26骨、quadruped_turtle/turtle_bubble、四脚实际网格步态/壳体刚性/Edit与Play通过,0.6秒释放事件。",
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
]
},
{
"id": "RockRhino",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/RockRhino/RockRhino.prefab",
"expectedHeight": 0.55,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "岩甲犀T1静态模:官方混元50k→离线+70°统一朝向→2000tris/1024 XPbr,0.55m、Y-up、底面中心、局部-Z正面,四向图确认。"
},
{
"id": "RockRhino_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/RockRhino/RockRhino_Companion.prefab",
"expectedHeight": 0.55,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "岩甲犀T1控制伙伴:自身29骨、quadruped_heavy/braced_bash,先单Walk后补三动作,四脚实际蒙皮/岩甲与角刚性/Edit与Play通过,0.6秒事件。",
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
]
},
{
"id": "Hornlet_Enemy",
"kind": "Enemy",
"prefab": "Assets/Bundles/Characters/Enemy/Hornlet/Hornlet_Enemy.prefab",
"expectedHeight": 0.5,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "小角怪(普通,type0):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type0 嵌套。"
},
{
"id": "Dashlet_Enemy",
"kind": "Enemy",
"prefab": "Assets/Bundles/Characters/Enemy/Dashlet/Dashlet_Enemy.prefab",
"expectedHeight": 0.5,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "疾跑怪(快速,type1):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type1 嵌套。"
},
{
"id": "Shellhorn_Enemy",
"kind": "Enemy",
"prefab": "Assets/Bundles/Characters/Enemy/Shellhorn/Shellhorn_Enemy.prefab",
"expectedHeight": 0.5,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "硬壳怪(护甲,type2):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type2 嵌套。"
},
{
"id": "HornCaptain_Enemy",
"kind": "Enemy",
"prefab": "Assets/Bundles/Characters/Enemy/HornCaptain/HornCaptain_Enemy.prefab",
"expectedHeight": 0.6,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "角怪队长(精英,type3):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type3 嵌套。"
},
{
"id": "GreatHorn_Enemy",
"kind": "Enemy",
"prefab": "Assets/Bundles/Characters/Enemy/GreatHorn/GreatHorn_Enemy.prefab",
"expectedHeight": 0.8,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "大角首领(首领,type4):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type4 嵌套。"
},
{
"id": "FlameLion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/FlameLion/FlameLion.prefab",
"expectedHeight": 0.6,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "烈焰狮T1静态:官方混元50k→2000tris/1024 XPbr,0.60m、Y-up、底面中心、局部-Z正面,四向验收通过。"
},
{
"id": "FlameLion_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/FlameLion/FlameLion_Companion.prefab",
"expectedHeight": 0.6,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "烈焰狮T1火系输出:自身远程28骨、biped_short/flame_roar,单Walk后补三动作、实际双脚/鬃毛刚性/头与双爪施法/Edit与Play通过;0.6秒事件。",
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
]
},
{
"id": "VineSprite_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/VineSprite/VineSprite_Companion.prefab",
"expectedHeight": 0.5,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "藤蔓灵(pet 7)T1:混元50k→2000 tris/1024 XPbr,DGXA同源28骨,biped_short/ranged_cast(治疗施法),Edit/Play通过。"
},
{
"id": "ThunderLeopard_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/ThunderLeopard/ThunderLeopard_Companion.prefab",
"expectedHeight": 0.45,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "雷鸣豹(pet 8)T1:混元50k→2000 tris/1024 XPbr,DGXA同源31骨,quadruped_heavy/braced_bash(头肩短扑),Edit/Play通过。"
},
{
"id": "TideWhale_Companion",
"kind": "Animal",
"prefab": "Assets/Bundles/Characters/Animal/TideWhale/TideWhale_Companion.prefab",
"expectedHeight": 0.55,
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": [
"Idle",
"Walk",
"Attack"
],
"notes": "潮汐鲸(pet 9)T1:混元50k→2000 tris/1024 XPbr,DGXA同源22骨,biped_short/body_slam,Edit/Play通过。"
}
],
"workflow": {
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@@ -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
}
+10
View File
@@ -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
}
+209
View File
@@ -0,0 +1,209 @@
# 关卡战斗技能系统设计
2026-10-20。首版服务于现有十伙伴、五类敌人、二十关的自动战斗,统一普攻、主动技能、动作、特效、音效和战斗数据处理。技能由配置组合,服务端执行逻辑并产生有序战斗事件,客户端按战斗时钟播放表现。
本次交付设计、禁用运行时的配置样例、TangoFlux音效制作清单及校验工具。现行 `greenfield.json`、`battleRules=2`、在途挑战及奖励协议保持原状;运行时接入按下文实施顺序进行。
## 现有基础与版本边界
`PrototypeBattle.cs` 与 `AIServer/src/game.cpp::battle_lanes` 使用0.05秒固定步长,伙伴技能为shield/heal/slow和伤害分支,命中即时处理;同一单位可以在同tick释放技能和普攻。`PrototypeFlow.RefreshBattle` 读取Pulse/SkillPulse,驱动原型弹体及缩放表现。
服务端在battle.begin时计算并保存结果,以readyAt限制最早结算;battle.finish不接受客户端自报胜负。现阶段没有战中手动决策。新系统沿用该授权方式,自动战斗的技能选择也由服务端执行。
带前摇、投射物到达伤害和动作互斥的新规则指定为 `battleRules=3`。这些会影响战斗节奏和结果,不能直接替换旧分支并声称数值行为完全等价。旧挑战继续读取已冻结结果/快照;新规则发布前须完成平衡、协议和旧版本恢复测试。
## 系统结构
```mermaid
flowchart TD
Config[冻结玩法配置与技能定义] --> Sim[服务端 BattleSimulation]
AI[自动选技能与目标] --> Sim
Sim --> Runtime[SkillRuntime 状态与时间调度]
Runtime --> Actions[逻辑行为执行器]
Actions --> Data[伤害 治疗 护盾 减速 投射物]
Data --> Events[有序 BattleEvent 与权威结果]
Events --> Clock[客户端 BattlePlaybackClock]
Clock --> Present[SkillPresentationDirector]
Present --> Motion[动作播放器]
Present --> VFX[特效池]
Present --> SFX[音效池]
Events --> UI[血量 状态 飘字 战斗统计]
```
| 模块 | 职责 | 不承担的职责 |
| --- | --- | --- |
| SkillDefinition | 目标、前摇、行为、冷却、资源消耗、打断及效果参数引用 | 保存每个单位当前血量或冷却 |
| SkillRuntime | 一次施法的castId、阶段、目标、释放tick和实例状态 | 直接调用Animator/ParticleSystem/AudioSource |
| SkillActionExecutor | 执行Damage、Heal、ApplyStatus、LaunchProjectile等行为 | 读取贴图、骨骼或Unity碰撞结果决定伤害 |
| StatusSystem | 状态实例、过期、合并、护盾吸收、移速修正 | 播放循环特效 |
| BattleEvent | 记录已发生的逻辑事实与结果数据 | 接受客户端改写结果 |
| SkillPresentation | 将事件映射为动作、特效、音效、飘字等组合行为 | 计冷却、再次扣血或发放奖励 |
一次技能可以包含多个逻辑行为,例如命中后先造成伤害再施加减速;一个表现事件也可同时播放动作、特效和音效。首版提供有限的类型化行为和处理器注册表,配置只引用白名单参数与公式,不执行任意脚本字符串。复杂节点编辑器、技能连招树和战中手动输入后续扩展。
模板使用 `actions[]` 顺序组合逻辑行为,每条有独立actionId和trigger。命中时依次执行并输出结果;后续增加“伤害+减速”的技能,只需增加ApplyStatus行为及对应正式数值来源。表现使用事件下的 `bindings[event][]` 组合animation/vfx/sfx,同一事件可触发多种表现。两侧按castId和actionId关联,资源数据不会进入服务端计算。
## 配置和运行实例
配置分为玩法和表现两部分,数值只由 `Config/Gameplay/greenfield.json` 的冻结副本解析。技能样例通过actorId、sourcePointer、template引用现有角色参数,不重复维护一份攻击力、射程或T1/T2数值。
| 数据 | 主要字段 |
| --- | --- |
| SkillDefinition | skillId、actorKind、slot、template、parameterSources、selector、timing、channel、priority、cost、cooldown、interruptPolicy |
| LogicalAction | actionId、phase或触发条件、type、targetSelector、effect参数、delivery策略 |
| SkillPresentation | presentationId、事件名、cue数组;每条cue为animation/vfx/sfx,含assetId、anchor、生命周期token |
| CastInstance | battleId、castId、skillId、sourceEntityId、targetIds、startTick、releaseTick、endTick、casterStatsSnapshot、阶段 |
| ProjectileInstance | projectileId、castId、targetId、releaseTick、arrivalTick、释放位置、目标位置、payload、失效策略 |
| StatusInstance | statusId、ownerId、sourceId、value、expiresTick、mergeGroup、来源记录 |
样例文件:
- `Config/Combat/skill_system_v1.proposal.json`:8种模板、25个技能绑定,覆盖每只伙伴的普攻/主动技能和每类敌人的普攻。
- `Config/Combat/skill_presentations_v1.proposal.json`:12个表现配置、2个现有动画引用、18项待制作的特效/音效引用。
- `Doc/Design/Sound/BattleSkills/manifest.json`:9项TangoFlux音效制作配方,状态planned_not_generated。
proposal文件显式 `runtimeEnabled=false`,现有CMake和客户端加载器不引用它们。接入时将技能逻辑定义加入正式配置的skillSystem字段,由CMake参与同一内容哈希并冻结入battleSnapshot;表现配置作为YooAsset资源按版本加载。禁止运行时把“当前最新技能表”混入旧挑战。
参数解析器至少支持以下白名单。配置字段的秒数转为整数tick时向上取整;UI仍可显示秒。
| 参数 | 来源与语义 |
| --- | --- |
| basic_cooldown / basic_range | 伙伴或敌人的cooldown;伙伴range;敌人近战接触距离首版为1世界单位 |
| actor_attack | 本场战斗初始化后的攻击力,已含共享等级/进化成长;敌人含stage.attackScale |
| ability_cooldown / ability_range | 对应伙伴ability.cooldown/range |
| ability_value / duration / radius / target_count | 按该单位冻结tier读取t1/t2、duration/t2Duration、radius/t2Radius、targets/t2Targets |
| boss_control_scale | ability.bossControlScale,控制首领减速强度 |
## 施法阶段与竞争规则
状态流为 `Ready → Windup → Released → Recovery → Ready`,另有Cancelled。冷却以绝对 `nextReadyTick` 保存,与施法阶段独立:从施法开始计冷却,后摇结束且冷却到期才可再次施放。
同一单位首版只有一个main_action通道。每tick先收集符合条件的主动技能候选,再普攻;主动技能优先级100,普攻10,同优先级按skillId稳定排序。未进入射程、治疗没有受伤目标、单位死亡或受硬控制时不开始,也不扣冷却/资源。首版没有额外蓝量,cost为0;将来扩展消耗须在CastStarted时原子扣除。
开始后预留动作通道直到endTick;新技能不叠播在普攻上,也不任意打断后摇。死亡/硬控制在释放前取消,清理蓄力,首版不退款、不退冷却;释放后的投射物独立存在,施法者死亡不撤销已经发出的攻击。缺失动画、特效或音效不会取消逻辑施法。
零前摇技能在开始的同tick释放,调度器必须处理新加入的到期任务。结束和取消只执行一次。恢复正常动作时依据当前移动状态回到Idle或Walk,不能把Attack布尔值长期置true。
## 固定时间和数据规则
逻辑tick为50ms,独立于Unity帧率、AnimationEvent、声音长度、Time.timeScale和网络到达时间。客户端用deltaTime累积播放tick并插值位置,所有逻辑事件按顺序消费;帧率降低可以合并表现更新,不能丢弃血量、状态、死亡或胜负事件。
建议新版内核使用int64中间计算:血量/攻击以千分之一单位保存,位置以毫米保存,倍率以万分比保存,时间以整数tick保存。配置编译时明确每次取整位置。此为新版规则,仍须以基准样例检查量化后的结果,不能把“使用整数”当成已经通过一致性验证。
伤害先按施法开始时攻击快照乘技能倍率;命中时读取目标防御和当前护盾。元素开启时按现行元素表计算、减防、向下取整到整点伤害且至少1;元素关闭时沿用raw伤害语义。护盾先吸收,再扣血;实际血量变化计入伤害/治疗统计,过量治疗和溢出伤害单独记录。死亡只允许Alive→Dead一次,不能重复累计击败数。漏怪为Exited状态,不计击败。
同tick采用固定阶段:
1. 生成本tick单位、处理到期状态和此前已发出投射物的到达;按稳定键应用结果并处理死亡。
2. 更新移动/阻挡关系,收集仍存活单位的自动施法请求。
3. 推进已有施法与本tick新施法,产生到期释放;先收集本阶段的有效释放,再结算其即时效果。
4. 以 `(dueTick, sourceEntityId, castSequence, actionIndex, hitIndex, targetEntityId)` 排序执行;目标已经死亡则跳过并记录失效结果。本阶段已经有效释放的行为不因稍后同tick施法者死亡而撤回。
5. 处理死亡、漏怪、动作结束和关卡胜负,输出最终事件序号。耐久归零/达到关卡超时优先判负,其后才判断全部敌人清除;同tick最后一敌死亡与超时相遇时也按此顺序。新触发的反应行为首版不支持递归执行,后续必须入队并限制连锁深度。
首版目标选择和技能结果不使用随机数;seed保留给确定的表现变化和未来扩展。将来加入暴击、闪避等概率效果时,须同时固定随机算法、种子和抽样顺序,并由服务端记录结果。
首版普通近战按释放tick结算。远程投射物从逻辑位置计算 `travelTicks=max(1,ceil(distanceMm/speedMmPerTick))`,固定arrivalTick;样例速度每tick800mm,即16世界单位/秒。飞行路径由客户端插值显示,到达是否命中由逻辑决定。范围在释放时检查,命中时检查目标仍存活且未离场;目标丢失时expire,不自动改打其它目标。目标移动期间表现追踪同一目标,到达tick保持不变。以后增加非追踪弹体、范围碰撞或地面落点需显式增加delivery类型。
## 选敌 治疗 护盾和减速
首版选择器覆盖当前玩法:同路最前敌人、自身、范围内血量比例最低的友方、同路最前阻挡伙伴。选敌按逻辑Z距离再entityId排序;最低血量比例用整数交叉相乘比较,再按slot排序。候选目标在开始时用于判断能否施法,释放时重新选择并冻结本次目标集;投射物发出后不重选。
治疗范围沿用路线的实际左右关系:lane0在中、lane1在左、lane2在右;相邻路线不是简单的laneId相差1。T2治疗radius=1可覆盖中路相邻的一路,具体候选集合按lane_position映射计算。burst和chain按targets/t2Targets选取同路前N个目标;当前chain是多目标伤害,首版不自动加入有延时的跳跃衰减或额外弹射目标。
| 效果 | 首版规则 |
| --- | --- |
| Damage | 普攻攻击倍率1;burst/chain为攻击×ability_value,按目标分别执行并记录结果 |
| Heal | ability_value为固定治疗量,不额外乘攻击;封顶MaxHp,满血友方不作为起手目标 |
| Shield | shield_main共享合并组:取当前剩余盾和新盾较大值,过期时间改为本次命中tick+duration;到期/耗尽移除 |
| Slow | slow_main共享合并组:取较小剩余移速倍率,过期取较晚值;首领倍率为1-(1-value)×bossControlScale,到期还原 |
上述合并方式对应现有规则的主要语义。以后需要各来源独立过期、叠层、驱散或免疫时,以新状态定义明确合并策略,不能默默改写旧技能效果。每次应用状态保留来源,用于状态特效归属和统计。
## 战斗事件与表现行为
所有事件携带battleId、eventSeq、tick、type、castId、skillId、sourceEntityId,以及按类型需要的targetId/projectileId/statusId。HitResolved包含validHit和本次命中的效果结果数组:原始值、吸收值、实际伤害/治疗、hpAfter、shieldAfter、是否死亡及失效原因。客户端直接应用这些结果,不再次调用伤害公式。命中cue要求validHit=true;被护盾完全吸收仍为有效命中,已经死亡/离场的目标则不播放命中cue,投射物通过ProjectileExpired回收。
| 事件 | 表现行为 |
| --- | --- |
| CastStarted | 播放技能动作、朝向目标、开启手部蓄力特效和蓄力声音 |
| CastReleased | 停止蓄力token,播放发射音;瞬时技能在此tick产生命中结果 |
| ProjectileSpawned | 从出手挂点创建/租用弹体表现,绑定projectileId及预计到达时间 |
| HitResolved | 停止对应弹体,更新血量,播放命中特效/命中音/飘字;一次命中可有多项逻辑结果 |
| StatusApplied / StatusRemoved | 按statusId添加或停止护盾/减速等持续表现,刷新现有实例而不重复堆节点 |
| CastEnded / CastCancelled | 回收施法局部token并恢复移动/待机;已经发射的弹体不归施法结束清理 |
| UnitDied / BattleEnded | 停止该单位或本场所属表现、回收对象池和音源,结束战斗视图 |
逻辑效果去重键为 `(battleId,castId,actionId,targetEntityId,hitIndex)`;表现去重键为 `(battleId,eventSeq,cueIndex)`。对象池索引不能作entityId,重连/换场必须隔离battleId。资源异步返回时检查所属battleId和token仍有效,过期回调立即释放handle,避免在新一场播放旧效果。
动作、特效、音效和UI共用BattlePlaybackClock。暂停时冻结播放时钟、暂停本场动作/粒子及本场持有的AudioSource,UI音效仍可使用;恢复不重复触发开始事件。倍速改变事件间隔、动画速度和弹体插值;首版短音效保持原音高,超过有效播放窗口的旧one-shot可以跳过。逻辑结果始终完整应用。初始音源上限建议12路,按技能重要性、距离和同类冷却控制抢占,实机再定预算。
重连默认重播同一已授权挑战;以后增加seek时从状态快照+事件游标重建血量、状态及在飞弹体,历史一次性声音/爆闪不补播。资源未就绪使用已制作原型表现或跳过装饰,不暂停权威结算。正式关卡需在播放前预加载本阵容和敌人所需的表现资源。
## 火喵施法样例
火喵已有Attack长1.1秒、释放标记0.55秒、非循环。普攻冷却0.9秒,因此普攻动作按0.9秒窗口播放,速度为1.1/0.9约1.222;释放发生在第9tick即0.45秒,结束第18tick。主动技能冷却6秒,动作按原速播放,释放第11tick即0.55秒,结束第22tick。
| 阶段 | 逻辑行为 | 动作 特效 音效 |
| --- | --- | --- |
| 开始 | 验证条件、占main_action、记录攻击快照、开始冷却 | Attack+双爪蓄力粒子+FireCharge |
| 释放 | 选取同路前方目标,创建逻辑投射物 | 停蓄力、FireLaunch、FireProjectile从Cast挂点飞出 |
| 到达 | 目标有效则按普攻×1或主动技能T1×1.3/T2×1.8造成伤害 | FireHit+命中音+伤害飘字 |
| 后摇结束 | 释放动作通道,等待下一次可施法 | 根据移动状态恢复Idle/Walk;在飞火球继续存在 |
例:以本次施法开始为相对tick0,T1主动技能在tick11释放;释放时目标距离4世界单位,以16单位/秒飞行5tick,在tick16结算伤害;tick22动作结束。多个火球可以在飞行中并存,每个有独立projectileId。当前该技能targets=1、radius=0,命中特效不得让玩家误认为有范围溅射。
现有 `OnCompanionAttackImpact` AnimationEvent保留为动作对齐诊断标记,不再独立发射或扣血。技能时钟事件是唯一表现调度源,避免事件回调和时间轴各发一颗。骨骼动画由已有.anim驱动;首版通过Animator动作适配器/局部速度参数接入,精确seek扩展可使用Playables手动采样。Unity Playables支持组织和混合动画、音频等数据源,详见[Unity 2022.3文档](https://docs.unity3d.com/2022.3/Documentation/Manual/Playables.html)。
## 角色挂点和资源归属
逻辑侧只认识entityId和逻辑位置。角色Prefab提供语义挂点Cast、Body、Hit、Head;表现配置映射到各自骨架,业务代码不硬编码bone_7等名称。已有火喵/岩团团尚未制作这些技能挂点,设计样例采用bounds fallback;正式接入须通过Pipeline制作挂点并在动作全过程检查位置。
角色局部-Z为正面。世界朝向由目标方向决定,不能总朝世界-Z或直接把Unity的transform.forward当角色正面。粒子挂点随动作,投射物释放后进入世界空间;护盾随目标,命中爆闪按HitResolved位置播放。根位移由逻辑驱动,动作Root Motion关闭。
资源加载走YooAsset,动画/特效/音效引用按地址和类型校验,资源handle由战斗资源集持有;动作实例持有租用对象和生命周期token。BattleEnded、切页和销毁都必须停止本场循环声音、清空粒子/Trail并归还池,禁止把旧轨迹带到下一次播放。
## TangoFlux音效制作
严格使用 `D:/UD/AI/XModel/TangoFlux_AI调用指南.md` 的TangoFluxService方法。现有 `Tools/generate_ui_sfx.py` 接受通用manifest,可复用其HTTP提交/轮询/下载流程制作首批战斗音效;长期应抽取共享客户端,以请求内容哈希校验缓存,避免只按文件存在判断有效。
1. GET /api/status,确认ready和内存;未加载时POST /api/warmup后复查。不为生成音效擅自停止其它3D/音乐服务。
2. 英文声学描述,固定seed;POST /api/generate,duration在1~30秒,steps=50、guidance_scale=4.5、sync=false。首批并发上限2,服务queued+running总上限4。
3. 每0.8秒GET /api/jobs/{id};429退避,失败记录error,不能无限重试。成功后从返回url或/api/jobs/{id}/audio下载。
4. 保留44.1kHz立体声WAV原稿、jobId、提示词、seed、参数和SHA256;检测静音、爆音和削波,并实际试听。服务最短生成1秒,实际几十到几百毫秒的技能声音需后期裁切、淡入淡出和增益调整,不能请求duration=0.2。
5. FireCharge、FireLaunch、FireHit分开生成;蓄力有独立token可在释放时停止。火喵之外补RockHit、Heal、Shield、Slow、Lightning、EnemyHit。原稿/后期输出分开,剪切起止点写制作记录。
6. 原始文件在Tools/output与Doc/Design/Sound,最终游戏文件在 `Assets/Bundles/Sound/SFX/BattleSkills/`。AudioClip导入、音源Prefab和混音设置经Unity Pipeline制作,检查音效开关、暂停、倍速、多实例及切场清理。
7. 生成并验收完成后登记 `Doc/ResDesc_Sound.md`;目前manifest只列制作需求,没有生成音频。指南载明模型权重为非商业研究用途,资源发布前按上游许可核查并保留结论,不能把此清单视为商用授权。
可复用命令:`python Tools/generate_ui_sfx.py --manifest Doc/Design/Sound/BattleSkills/manifest.json --max-inflight 2`。这是后续制作入口,本轮未执行。该旧脚本会复制原始WAV到Bundles,正式交付仍须完成后期、Pipeline导入与试听验收。
## 服务端协议和关卡过程
首版新增SkillRuntime在C++服务端执行一次,产生权威结果与事件轨迹;客户端新版消费轨迹,避免继续长期维护两套独立技能逻辑。C#纯数据参考实现可用于交叉测试,但不得覆盖服务端结果。战斗数据不依赖MonoBehaviour、Unity Physics或资源加载。
拟扩展battle.begin响应/冻结数据:rulesVersion、logicVersion、gameplayHash、compiledSkillsHash、seed、stage/formation快照、traceId、traceHash、eventCount、tickMs及事件首块。长轨迹用拟新增battle.events(cursor,limit)按本玩家已授权battleId获取;返回范围、nextCursor和校验值。预计算结果及轨迹在同一授权记录中提交,重试返回同一战斗,不重复开局或发奖。轨迹容量、分页上限和压缩格式需按20关最坏情况实测后设定。
单位移动用带起止tick/位置的分段记录,减速、到达阻挡点或目标变化时分段;客户端插值,不必把每个单位每tick的位置重复传一遍。首次实现可先保留完整逐tick开发轨迹,确认正确性后再压缩,压缩前后必须逐事件等价。
关卡过程:加载冻结配置/资源→建立单位和波次→按tick生成敌人→移动/阻挡→自动选技能和目标→施法/投射物/效果→状态与死亡/漏怪→后续波次→胜负→调用battle.finish获取服务器奖励回执。暂停/倍速只影响客户端播放;readyAt时间门槛和幂等奖励继续由服务端控制。
手动施法暂不启用。加入战中输入后,服务端须接收并验证commandId、battleId、目标、申请tick/可接受窗口、冷却和资源,并记录确认输入;当前“开局预计算结果”协议需要改为命令驱动模拟或经验证的输入日志重算,不能直接相信客户端的施法、伤害或won字段。
## 实施顺序和验收
| 阶段 | 改动 | 完成标准 |
| --- | --- | --- |
| 设计契约 当前 | 本设计、25技能/12表现样例、9音效需求、校验器 | 覆盖当前10伙伴/5敌人/20关,阶段/冷却/动画标记和资源状态检查通过 |
| 逻辑内核 | AIServer增加独立combat模块、typed action、状态/投射物、事件轨迹;接battleRules=3 | 无Unity依赖的逻辑测试、确定顺序、去重/死亡/失效测试;结果与轨迹一致 |
| 客户端播放器 | HotUpdate/Combat增加BattlePlaybackClock、事件读模型、动作/VFX/SFX适配器;PrototypeFlow接读模型 | 1×/2×、暂停恢复、低帧率、多投射物、重连/重播一致,奖励仍取服务端 |
| 火喵和岩团团样例 | Pipeline制作挂点/特效/音源,按TangoFlux指南生成并后期/试听 | 火喵出手/到达/扣血对齐;岩团团近战/护盾完整;池与音效开关正确 |
| 全关迁移 | 补10伙伴表现、20关回归、配置哈希与协议滚动升级 | 旧在途战斗原结果、退款/放弃/finish幂等不变,新规则平衡及资源预算达标 |
逻辑测试至少覆盖:同tick技能与普攻竞争、零前摇、目标死亡/离场、施法者释放前后死亡、护盾吸收/刷新/耗尽、减速刷新/首领折扣、T2相邻路线治疗与多目标上限、重复命中去重、冷却边界、漏怪不计击杀、超时和最后一敌人的胜负顺序。
表现测试至少覆盖:动画丢标记仍只发一次、动画播放速度、粒子挂点与世界空间、音频延迟/静音/抢占、异步资源过期返回、对象池Trail清空、暂停恢复、后台恢复时跳过过期声音、BattleEnded彻底清理。最终在竖屏实际战斗相机与微信目标设备测资源加载、活跃音源、粒子透明叠加及帧耗;开发机截图通过不等同实机性能通过。
配置校验命令:`python Tools/validate_skill_design.py`。测试命令:`python -m unittest discover -s Tools/tests -p test_skill_design.py`。报告位于 `Tools/output/skill_system_design/validation.json`,状态design_contract_validated仅表示设计配置通过,runtimeIntegrated和generatedAudio仍为false。
## 已落地的敌人表现批次(2026-10-21)
五类敌人的攻击与普通/硬甲/护盾受击表现已作为现有battleRules=1/2的适配层接入。实际完成8套特效、8条TangoFlux短音效、32实例/8音源播放池;真实PrototypeFlow隔离战斗及暂停/倍速/静音通过。完整制作记录见 [EnemyCombatFx/Production.md](EnemyCombatFx/Production.md)。此前BattleSkills的9条计划音效清单仍保持原计划状态,不能与本批8条敌人音效混算;battleRules=3技能逻辑内核、动作冲击相位与伤害同步、伙伴元素技能仍按上文阶段实施。
+48
View File
@@ -281,3 +281,51 @@ UI按双列/双行重排:伙伴、捕捉、背包材料、营地休息区为2
### 主界面音乐选用与接入(2026-10-20)
用户确认《微风小镇》作为主界面BGM。84秒OGG通过独立 `MainMenuMusic.prefab` 接入,Prefab和AudioSource由Pipeline持久化制作、Art/Sound收集,运行时经YooAsset异步加载。菜单循环播放,设置中的音乐开关独立暂停/续播,音效关闭不影响已开启的音乐;战斗/弹珠页暂停、返回菜单续播,应用后台暂停。Boot实播验证循环、三轮开关、菜单往返不叠音、弹珠暂停和偏好恢复通过,编译及本轮新增错误检查通过。素材和回执见 `Doc/Design/Sound/MainMenuSoft/ProductionBrief.md` 与 `Doc/ResDesc_Sound.md`;未构建或发布,微信音频解锁待真机验收。
## 正式伙伴接入战斗(2026-10-20)
岩团团、火喵、芽芽三只已验收的正式伙伴替换了 `PrototypeArena` 的 Hero0~2 几何简模,肖像 `proto_pet_0~2` 也改为从正式模型渲染。正式模型嵌套在 `Visual` 子节点,统一缩放到 1.5 单位高,T2 仍沿用冠饰和 1.2 倍体型。`PrototypeFlow.RefreshBattle` 在伙伴普攻、治疗或施放技能时触发 Animator 的 `Attack`,暂停或结束时动画速度为 0,二倍速时为 2。正式模型不再做原型的上下弹跳和缩放脉冲;Hero3~9 仍是简模,表现不变。
顺带修复两处已提交的问题。一是十伙伴扩容后,`StartBattle` 仍按 `stages.Length == 5 ? 3 : 1` 构造战斗快照:10 只伙伴得到 schema1,`PrototypeGame` 校验抛出"服务端存档无效",所有关卡都无法开战。现改为 `PrototypeSave.BattleSnapshot`,按伙伴数量补齐各 schema 的必需字段,与 `VerifyProgression` 的回放快照规则一致;它只用于表现,不参与结算。二是十伙伴批次的 `BuildPrototype.Build` 全量重建冲掉了已嵌入的 Greenfield 战场。本次已重新执行 `AttachGreenfield.Build`,并让 `MakeArena` 在全量重建时自动嵌入 Greenfield。
验证:`VerifyFormalHeroes.Assets`、`VerifyBattlefield.Assets` 和 `AttachGreenfield.Verify` 通过。在独立的 18081 服务(`Tools/output/formal_heroes/test.db`)上用新账号实际点击,走通 1-1 开战:岩团团和火喵在绿野战场上显示并播放 Attack,切换二倍速后 Animator 速度为 2;截图为 `formal_heroes_idle/attack.png`。真实开发账号已还原,钱包、发射数、等级与快照一致;18081 服务已关闭,8080 开发服健康。Unity 已退出 Play 并恢复原 Game View,本轮无新增 Console 错误。芽芽的战斗表现只做了资产检查,新账号的 1-1 不会让它上场。未构建 Player 或上传 CDN。
UI 音效暂未接入:10 条 TangoFlux 音效中,9 条是持续 1.5~2.5 秒的声音,`Ui_Open` 前 1.36 秒为静音,不适合直接作为按钮音,需要先裁剪或重新生成。
### UI 音效接入(2026-10-21)
UI 音效换成 v2 一次性短音效(0.12~0.8 秒)并接入运行时。`UiSfx.prefab` 与主界面音乐一同加载,受设置里的音效开关控制。按钮按名称分类:返回/关闭→Close,取消类→Back,页签→Tab,开关→Toggle,其余→Click。首页入口播 Open,服务端确认后:领奖/捕捉/开箱/首通→Claim,训练/进化/购买/营地操作→Confirm,布阵→Toggle,被拒绝或断线→Deny,首页新出现红点→Notify。`VerifyUiSfx` 在隔离 18081 账号上实际点击验证通过,真实账号与偏好已还原。生成、选择与触发表详见 `Doc/Design/Sound/UiSfx/ProductionBrief.md`。听感待人工试听。
- 2026-10-21 UI 音效 v3:clip 换成 `Tools/synth_ui_sfx.py` 程序化合成的木琴、钟琴和气泡音,风格清脆轻松;播放代码和触发映射不变,Prefab 已重建。
- 2026-10-21 岩甲犀(pet 5)接入战斗与肖像,正式伙伴为 0/1/2/5;其余仍为简模。实战验收用隔离库种子账号(stages[5]=1、formation=[0,5]),见 `VerifyFormalHeroes.PlaySeeded`。
- 2026-10-21 闪闪雀(pet 3)、泡泡龟(pet 4)接入战斗与肖像。正式伙伴现为 0/1/2/3/4/5,Hero6~9 仍是简模。`VerifyFormalHeroes.Assets` 确认六只脚底 y=0.00、身高 1.50、第 30 层、带 Animator。隔离 18081 种子账号阵容为泡泡龟前排、闪闪雀后排(龟的普攻距离是 2,放后排打不到),1-1 中两只都播放 Attack 并跟随二倍速。真实账号已还原。截图 `formal_heroes_bird_turtle_idle.png`、`_attack.png`。
- 2026-10-21 主界面底图去掉绘制的探险者、猫咪和对话框,备份为 `Doc/Design/UI/Home/home_camp_with_cast.png`。简模 `ExplorerSimple` 在广场中央来回走,点击后才出现随机台词。常驻问候条默认关闭。`VerifyHomeExplorer.Play` 通过。截图 `home_explorer_walk.png`、`home_explorer_talk.png`。
## G3 经济样例、引导与失败建议(2026-10-21)
按 `GameDesign` 8.2 与 14.1,先做不依赖微信真机的三块。
`Tools/economy_sample.py` 读取 `greenfield.json`,写出 `Doc/Design/G3/EconomySample.md`。首日、七日和卡在 1-5 前三条轨迹都不计自然恢复。设计稿 8.2 已改成现行数字:前五关首通 17 枚,10 发金币均值 520,不计自然恢复的该项合计是 67 枚。训练到 Lv.5、进化金币都能靠弹珠台均值补上,碎片差 30,是卡关时更慢的一项。
首页教学目标按首日顺序提示:发射、用券捕捉芽芽、共享训练、布阵打 1-1、领取目标。弹珠不足时同时指向自然恢复、每日任务、签到和免费补给。战斗失败在原关卡提示下追加建议:克制伙伴是否上阵、训练等级是否低于建议、开放路线是否空着。胜利用原结算文案。
性能预算写在 `Doc/Design/G3/PerformanceBudget.md`。画质三档沿用现有设置。未构建 Player,未测微信帧率、内存和主包体积。
`VerifyG3.Domain` 核对首日引导五步文案。`VerifyG3.Play` 在隔离 18081 新账号上确认首页显示「发射第一枚弹珠」,1-1 放弃后结算含失败建议。流畅档 90 帧平均 55.3 FPS,同屏伙伴 2、敌人 1,最长帧 143.68 ms。这是编辑器诊断,不是微信验收。真实账号金币、糖果、发射数和等级已还原;18081 已关闭。回执 `Doc/Design/G3/editor_frame_sample.json`。
`VerifyG3.Loop` 用另一个隔离新账号走完教学循环:两发弹珠(糖果 40、金币 80)、捕捉芽芽、训练到 Lv.2、默认阵容通过 1-1、领取教学目标 +5 弹珠。结束钱包为弹珠 26、糖果 50、金币 160、券 0。未领邮件、签到、每日任务和后续关卡。回执 `Doc/Design/G3/first_day_loop.json`。
- 2026-10-21 5 类正式敌人接入战斗:小角怪/疾跑怪/硬壳怪/角怪队长/大角首领取代几何简模,按 type 显示,走路播 Walk、出手播 Attack(`PrototypeBattle.Enemy.Moving/Strikes` 仅供表现,不影响结算)。隔离 18081 种子账号 1-5 实战验收通过,详见 `Doc/Design/Character/EnemyCharacterProduction.md`。
## G4 属性挑战(2026-10-21)
首页「活动」在通过 1-1 后打开五场元素试炼。火、草、岩、电、水各一场,只自动上阵已拥有的对应元素伙伴,主线阵容不变,不消耗弹珠。首次胜利给该元素指定伙伴 10 碎片和一枚徽章;再次胜利只在用时更短时刷新纪录。没有对应伙伴时提示去捕捉,不要求付费。存档从 schema 9 迁到 10,只补空的徽章和纪录,不发奖励。好友和操作活动模板还没做。服务端 `game_tests` 覆盖锁定、缺伙伴、放弃、首次发奖和重复不发奖。
- 2026-10-21 10 个伙伴全部换成正式模型并接入战斗与肖像(新做藤蔓灵/雷鸣豹/潮汐鲸,烈焰狮等由另一工具完成)。隔离 18081 种子账号 1-5 实战验收通过。
## 排行榜(2026-10-21)
首页「排行」读取服务器已确认的主线通关数和五场试炼最短用时。同成绩先比达成时间,再比玩家编号;没有成绩不上榜,页面显示前 20 名。客户端不能提交分数。存档从 schema 10 迁到 11 时,只给已有成绩盖上本次进入的时间,不发奖励。没有时间的旧成绩排在同成绩之后。正在进行的弹珠或战斗也可以看榜,不会被榜单请求结算。当前 8080 仍是上一版程序,要重启后玩家才会看到榜;在那之前点击排行会提示服务正在更新。
+73
View File
@@ -0,0 +1,73 @@
# G3 经济样例
由 `Tools/economy_sample.py` 读取 `Config/Gameplay/greenfield.json` 生成。不计弹珠自然恢复。弹珠台按五个落区等概率取均值:糖果 20、金币 52。实际单次受路径影响。
## 对照设计稿
`GameDesign` 8.2 的首日上限是 **67** 枚弹珠:初始 20、签到 10、每日任务 15、免费补给 5、前五关首通 17。按同一口径合计得到 **67**。现行 1-1~1-5 首通弹珠合计是 **17**,与稿一致。
稿中「10 发预计糖果 200、金币 520、券 1」。现行均值为糖果 200、金币 520、券 1,与稿一致。
## 首日获取上限
假设当天领完邮件、签到、三个每日任务、免费补给和教学目标,打通 1-1~1-5 并打开已掉落的绿野补给箱与碎片自选箱。自选箱只给碎片,不进下表钱包。溪口大礼箱要先通过 1-5,打开后另有金币 150、糖果 80、弹珠 5、券 1,未计入本表。
| 来源 | 到账 |
| --- | --- |
| 初始弹珠 | 弹珠20 |
| 欢迎邮件 | 弹珠5、糖果20 |
| 七日签到第1天 | 弹珠10 |
| 完成3次弹珠发射 | 弹珠5 |
| 完成1场冒险 | 弹珠5 |
| 与伙伴互动1次 | 弹珠5 |
| 每日免费补给 | 弹珠5 |
| 教学目标(通过1-1) | 弹珠5 |
| 首通 1-1 | 弹珠3、糖果40、金币80 |
| 首通 1-2 | 弹珠3、糖果50、金币90 |
| 首通 1-3 | 弹珠3、糖果60、金币100 |
| 首通 1-4 | 弹珠3、糖果70、金币110 |
| 首通 1-5 | 弹珠5、糖果100、金币200 |
| 打开绿野补给箱(1-1掉落) | 弹珠2、糖果30、金币60 |
| 打开伙伴碎片自选箱(1-3掉落) | 无资源 |
合计:**弹珠 79、糖果 370、金币 640、捕捉券 0**。这是获取上限,不是要求当天花完。
## 七日回访
不打新关、不发射。每日未领奖励过期,下表按七天都当天领完。签到不循环。
| 来源 | 到账 |
| --- | --- |
| 七日签到全部领取 | 弹珠65 |
| 七日每日任务全部领取 | 弹珠105 |
| 七日免费补给 | 弹珠35 |
合计:**弹珠 205、糖果 0、金币 0、捕捉券 0**。
## 卡在 1-5 之前
已通过 1-1~1-4,打不过溪口大角王。当天可领来源如下,不含为了拿糖果而发射的弹珠台产出。
| 来源 | 到账 |
| --- | --- |
| 初始弹珠 | 弹珠20 |
| 欢迎邮件 | 弹珠5、糖果20 |
| 签到第1天 | 弹珠10 |
| 完成3次弹珠发射 | 弹珠5 |
| 完成1场冒险 | 弹珠5 |
| 与伙伴互动1次 | 弹珠5 |
| 免费补给 | 弹珠5 |
| 教学目标 | 弹珠5 |
| 首通 1-1 | 弹珠3、糖果40、金币80 |
| 首通 1-2 | 弹珠3、糖果50、金币90 |
| 首通 1-3 | 弹珠3、糖果60、金币100 |
| 首通 1-4 | 弹珠3、糖果70、金币110 |
| 打开绿野补给箱 | 弹珠2、糖果30、金币60 |
合计:**弹珠 74、糖果 270、金币 440、捕捉券 0**。
- 训练到建议 Lv.5 需要糖果 300。账上差 30,按均值再发射 2 次可补上。主线不另扣体力。
- 进化需要金币 500。账上差 60,按均值再发射 2 次可补上。通过 1-1 后商店每天还能用金币换糖果,那是把金币换成糖果,不增加总资源。
- 进化需要碎片 40。1-3 自选箱提供 10,还差 30。重复伙伴每次 20 片,不能把碎片换回捕捉券。
训练、进化和再抽一只伙伴都能从免费来源走到,碎片比糖果和金币更慢。
+28
View File
@@ -0,0 +1,28 @@
# G3 性能预算
对应 `GameDesign` 第 13 节。本文件固定验收口径;微信真机数字还没测,不能把编辑器帧率写成已达标。
| 项目 | 预算 |
| --- | --- |
| 帧率 | 目标机持续 30 FPS。60 FPS 只给高画质档,不作为 P0 通过线 |
| 战斗同屏 | 伙伴最多 6。每关 3 波共 9 个敌人,可见敌人不超过 40 |
| 营地 | 休息区最多展示已选伙伴,未出场模型不进当前战斗加载 |
| 渲染 | URP 一盏主光。设置「流畅」走最低质量档,「标准」走中间档,「精细」走最高档 |
| 加载 | 页面与战场异步加载。音效和主界面音乐按功能持有,不在首屏加载全部伙伴 |
| 包体 | 微信主包只放壳和启动资源,玩法与美术走热更。尚未构建 Player,没有包体实测 |
画质三档已由 `PrototypeClientPrefs.Quality` 映射到 `QualitySettings`。桌面构建不振动;微信或手机上再验振动与音频解锁。
## 编辑器诊断(2026-10-21)
`VerifyG3.Play` 在隔离 18081 新账号上走通首页引导「发射第一枚弹珠」,进入 1-1 后主动放弃。结算文案含「建议:可调整前后排后免费重试」。流畅档采样 90 帧,见 `editor_frame_sample.json`。
| 项 | 实测 |
| --- | --- |
| 环境 | Unity 编辑器,Windows 11,RTX 3060,画质流畅 |
| 平均帧率 | 55.3 FPS(最短帧 15.51 ms,最长帧 143.68 ms) |
| 同屏 | 伙伴 2,采样窗口内敌人 1。上限检查为伙伴 ≤6、敌人 ≤40 |
这组数字只说明编辑器开场能跑。最长帧有一次超过 100 ms。不能当作微信目标机已达到 30 FPS。
未完成:微信真机帧率、内存、主包体积、首屏加载时间。
+48
View File
@@ -0,0 +1,48 @@
{
"config": "Config/Gameplay/greenfield.json",
"ignored": [
"natural marble recovery",
"pinball path variance beyond bin average"
],
"pinballAverage": {
"candy": 20.0,
"coins": 52.0,
"perTenShots": {
"candy": 200,
"coins": 520,
"tickets": 1
}
},
"designDay1Balls": 67,
"designFormulaWithLiveNonStageSources": 67,
"configFirstFiveStageBalls": 17,
"day1": {
"coins": 640,
"candy": 370,
"balls": 79,
"tickets": 0
},
"sevenDaysWithoutClears": {
"coins": 0,
"candy": 0,
"balls": 205,
"tickets": 0
},
"stuckBefore1_5": {
"walletBeforePinball": {
"coins": 440,
"candy": 270,
"balls": 74,
"tickets": 0
},
"trainToLevel5Candy": 300,
"candyGap": 30,
"pinballShotsToCloseCandy": 2,
"evolveCoins": 500,
"coinGap": 60,
"pinballShotsToCloseCoins": 2,
"evolveShards": 40,
"shardsFromChoiceChest": 10,
"shardGap": 30
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"device": "Unity Editor Windows 11 (10.0.22631) 64bit / NVIDIA GeForce RTX 3060",
"quality": "流畅",
"note": "Editor sample only. Does not satisfy the WeChat 30 FPS target.",
"frames": 90,
"averageFps": 55.3,
"minFrameMs": 15.51,
"maxFrameMs": 143.68,
"heroes": 2,
"enemies": 1,
"advice": "1-1 · 营地初守\n岩团团前排、火喵后排,先熟悉防线\n本次未获得通关奖励\n建议:可调整前后排后免费重试"
}
+18
View File
@@ -0,0 +1,18 @@
{
"account": "g3loop_9f56cda384794f2c9f073f40c47ec821",
"note": "Teaching loop only. Mail, sign-in, daily claims, shop and stages 1-2 through 1-5 are not included, so this is not the 79-ball day ceiling.",
"shots": 2,
"extraShotsAfterTicket": 1,
"shotCandy": 40,
"shotCoins": 80,
"balls": 26,
"candy": 50,
"coins": 160,
"tickets": 0,
"level": 2,
"budBudOwned": true,
"cleared": true,
"goalClaimed": true,
"dailyReady": 1,
"homeAfterGoal": "1项奖励可领取"
}
@@ -0,0 +1,78 @@
{
"schemaVersion": 1,
"status": "planned_not_generated",
"batchId": "battle_skills_v1",
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"designDir": "Doc/Design/Sound/BattleSkills",
"outputDir": "Tools/output/battle_skills_sfx_v1",
"bundleDir": "AIClient/Assets/Bundles/Sound/SFX/BattleSkills",
"defaults": {
"duration": 2,
"steps": 50,
"guidance_scale": 4.5
},
"maxInflight": 2,
"sourceFormat": {
"container": "wav",
"sampleRate": 44100,
"channels": 2
},
"releaseLicenseReview": "pending_upstream_review_per_guide",
"items": [
{
"id": "Sfx_FireCharge",
"seed": 52001,
"prompt": "A short gentle magical flame gathering sound, soft rising airy crackle, cute fantasy cat casting, close and dry, one isolated event, no music, no speech",
"duration": 2
},
{
"id": "Sfx_FireLaunch",
"seed": 52002,
"prompt": "One short compact magical fireball launch, bright soft ignition and a quick airy whoosh, cute mobile fantasy game, no explosion, no music, no speech",
"duration": 2
},
{
"id": "Sfx_FireHit",
"seed": 52003,
"prompt": "One small magical fireball impact, crisp warm pop with a brief soft fiery crackle tail, friendly cartoon fantasy, no heavy bass, no music, no speech",
"duration": 2
},
{
"id": "Sfx_RockHit",
"seed": 52004,
"prompt": "One small rounded stone creature striking, compact stone knock and a little gravel scatter, friendly cartoon fantasy game, no music, no speech",
"duration": 2
},
{
"id": "Sfx_Heal",
"seed": 52005,
"prompt": "One gentle magical healing chime, warm bell sparkle with a short soft airy tail, friendly pastoral fantasy game, no music bed, no speech",
"duration": 2
},
{
"id": "Sfx_Shield",
"seed": 52006,
"prompt": "One soft magical stone shield forming, low rounded stone resonance with a tiny clear sparkle, short dry fantasy game effect, no music, no speech",
"duration": 2
},
{
"id": "Sfx_Slow",
"seed": 52007,
"prompt": "One gentle icy magical pulse, light crystalline tick with a soft watery freeze texture, short isolated cartoon game effect, no music, no speech",
"duration": 2
},
{
"id": "Sfx_Lightning",
"seed": 52008,
"prompt": "One short small magical electric zap, crisp bright crackle and a soft pop, friendly cartoon fantasy, no harsh buzz, no music, no speech",
"duration": 2
},
{
"id": "Sfx_EnemyHit",
"seed": 52009,
"prompt": "One short soft cartoon creature hit, compact muted thump, dry isolated mobile fantasy game effect, no voice, no music, no speech",
"duration": 2
}
]
}
@@ -0,0 +1,81 @@
{
"status": "pass",
"clips": [
{
"id": "Enemy_HornletAttack",
"seconds": 0.48,
"peakDb": -1.9386641491007355,
"rmsDb": -10.698790438638541,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_DashletAttack",
"seconds": 0.42,
"peakDb": -1.9386641491007355,
"rmsDb": -15.931562805180183,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_ShellhornAttack",
"seconds": 0.6,
"peakDb": -1.9386641491007355,
"rmsDb": -15.372953401873325,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HornCaptainAttack",
"seconds": 0.58,
"peakDb": -1.9386641491007355,
"rmsDb": -12.087912415035813,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_GreatHornAttack",
"seconds": 0.82,
"peakDb": -1.9386641491007355,
"rmsDb": -13.616301171337803,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HitSoft",
"seconds": 0.34,
"peakDb": -1.9386641491007355,
"rmsDb": -15.923032471457049,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HitArmor",
"seconds": 0.42,
"peakDb": -1.9386641491007355,
"rmsDb": -17.553967945423206,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HitShield",
"seconds": 0.55,
"peakDb": -1.9386641491007355,
"rmsDb": -12.864415917978466,
"clippedSamples": 0,
"hashesMatch": true
}
],
"checks": "source/output/request hashes; succeeded job; PCM16 44.1kHz stereo; short duration; prompt onset; fade tail; finite samples; zero clipping",
"subjectiveListening": "not_asserted_by_automated_QA",
"previewOrder": [
"Enemy_HornletAttack",
"Enemy_DashletAttack",
"Enemy_ShellhornAttack",
"Enemy_HornCaptainAttack",
"Enemy_GreatHornAttack",
"Enemy_HitSoft",
"Enemy_HitArmor",
"Enemy_HitShield"
]
}
@@ -0,0 +1,343 @@
{
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"status": "generated",
"items": [
{
"id": "Enemy_HornletAttack",
"request": {
"prompt": "One small cartoon horn creature headbutt, quick airy swish and compact woody knock, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62100
},
"requestHash": "183cecd889e44b53d2145e7f6773b3424320b5e36c184cb43325f8b856d5c5d1",
"job": {
"id": "eb9fac0583f44c158946ea20c6cbaccc",
"status": "succeeded",
"prompt": "One small cartoon horn creature headbutt, quick airy swish and compact woody knock, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62100,
"created_at": "2026-10-21T03:20:01.193339+00:00",
"started_at": "2026-10-21T03:20:01.193339+00:00",
"finished_at": "2026-10-21T03:20:21.664940+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 20.469,
"url": "/api/jobs/eb9fac0583f44c158946ea20c6cbaccc/audio",
"download_url": "/api/jobs/eb9fac0583f44c158946ea20c6cbaccc/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HornletAttack_source.wav",
"sourceSha256": "124b9fdb9fc2996e512b64a40cd40804c7e93ae0ab65cd15680704fa40daf599",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HornletAttack.wav",
"outputSha256": "11e6775bb7a028ac2070b6abe7ca7c44d46892123b852a55346cc5027ec3320e",
"seconds": 0.48,
"trimStartSeconds": 1.3650113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -10.698159043917556,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_DashletAttack",
"request": {
"prompt": "One fast cartoon creature dash strike, sharp short sweeping air whip and light punch, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62101
},
"requestHash": "0564ac06c1db386de8026e355afde2c51af12c9e4bd7d511bd3485dca1c0a9ee",
"job": {
"id": "dddfd73997e549f8a2edb4742b347950",
"status": "succeeded",
"prompt": "One fast cartoon creature dash strike, sharp short sweeping air whip and light punch, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62101,
"created_at": "2026-10-21T03:20:01.213179+00:00",
"started_at": "2026-10-21T03:20:21.664940+00:00",
"finished_at": "2026-10-21T03:20:33.475642+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.81,
"url": "/api/jobs/dddfd73997e549f8a2edb4742b347950/audio",
"download_url": "/api/jobs/dddfd73997e549f8a2edb4742b347950/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_DashletAttack_source.wav",
"sourceSha256": "cb3048cb76106cedee6672ae3be1e69d6a100fb7f747e39501e614279b33612c",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_DashletAttack.wav",
"outputSha256": "3303a5835959ef812b7f677d710633db7d536e878f6543c9c6c21a10206ccd24",
"seconds": 0.42,
"trimStartSeconds": 1.6550113378684808,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -15.93079650888887,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_ShellhornAttack",
"request": {
"prompt": "One heavy shell creature shoulder bash, solid hollow stone knock with tiny gravel clicks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62102
},
"requestHash": "fd43568818d037332b4f7883a9213342b3521815914e92c869f3734dab430c62",
"job": {
"id": "3c0f5b3839eb4901b8a3138ce10e9ed4",
"status": "succeeded",
"prompt": "One heavy shell creature shoulder bash, solid hollow stone knock with tiny gravel clicks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62102,
"created_at": "2026-10-21T03:20:22.164766+00:00",
"started_at": "2026-10-21T03:20:33.475642+00:00",
"finished_at": "2026-10-21T03:20:45.499761+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 12.023,
"url": "/api/jobs/3c0f5b3839eb4901b8a3138ce10e9ed4/audio",
"download_url": "/api/jobs/3c0f5b3839eb4901b8a3138ce10e9ed4/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_ShellhornAttack_source.wav",
"sourceSha256": "a25b6c1b96d5c3fcfc04608f7b48a39a69df79b3a88acbcc8c0281ff01f363e1",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_ShellhornAttack.wav",
"outputSha256": "9725c417c193add95332976196d82220f25376b034044dcad7355c3ade755db3",
"seconds": 0.6,
"trimStartSeconds": 1.7950113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -15.372321971581309,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HornCaptainAttack",
"request": {
"prompt": "One forceful cartoon horn creature strike, broad air swoosh then firm wooden thud, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62103
},
"requestHash": "cfb726c865307711e7ab09892e0665ee1699ab6c71c65b969dcf3c98841783f2",
"job": {
"id": "aab611ca891141318c193b4a8858ff1c",
"status": "succeeded",
"prompt": "One forceful cartoon horn creature strike, broad air swoosh then firm wooden thud, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62103,
"created_at": "2026-10-21T03:20:34.254093+00:00",
"started_at": "2026-10-21T03:20:45.499761+00:00",
"finished_at": "2026-10-21T03:20:57.173984+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.675,
"url": "/api/jobs/aab611ca891141318c193b4a8858ff1c/audio",
"download_url": "/api/jobs/aab611ca891141318c193b4a8858ff1c/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HornCaptainAttack_source.wav",
"sourceSha256": "fcc6734bcf7b72ea192cb3bb7ae87b8b7f9131c6d600a90789ae24b0fecbc616",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HornCaptainAttack.wav",
"outputSha256": "99ac39aa3775bc4ba0def1196216744e12ddcb8523a4096aa63cedfcb6811723",
"seconds": 0.58,
"trimStartSeconds": 0.8750113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -12.08722963691162,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_GreatHornAttack",
"request": {
"prompt": "One large fantasy stone creature ground slam, deep rounded punch with brief gritty stone debris, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62104
},
"requestHash": "cdb0c28bd040bd74e9c4b712886f7eff4fac395dd179738416600e82b499ef67",
"job": {
"id": "2429fdd3aee74985a6d1aa045a505814",
"status": "succeeded",
"prompt": "One large fantasy stone creature ground slam, deep rounded punch with brief gritty stone debris, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62104,
"created_at": "2026-10-21T03:20:46.317538+00:00",
"started_at": "2026-10-21T03:20:57.173984+00:00",
"finished_at": "2026-10-21T03:21:08.911325+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.736,
"url": "/api/jobs/2429fdd3aee74985a6d1aa045a505814/audio",
"download_url": "/api/jobs/2429fdd3aee74985a6d1aa045a505814/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_GreatHornAttack_source.wav",
"sourceSha256": "940d7df5d5140bacf25e08d8e0d21abd70d2ae353d9dc059533340b246cd8507",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_GreatHornAttack.wav",
"outputSha256": "53debdca5692e82797cd25e9f766c8875f0d3460e81e46fab6a9d3d0b51137f5",
"seconds": 0.82,
"trimStartSeconds": 0.0,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -13.615541440400197,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HitSoft",
"request": {
"prompt": "One small soft cartoon body impact, short clean muted punch and tiny airy pop, dry close recording, no vocalization, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62105
},
"requestHash": "e1bc630679b641758edb8fd08dce5ecc1be87b6143a804ccd7ab602ecfc1dd22",
"job": {
"id": "555d62bec8a2465f953dce4aa55c6f62",
"status": "succeeded",
"prompt": "One small soft cartoon body impact, short clean muted punch and tiny airy pop, dry close recording, no vocalization, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62105,
"created_at": "2026-10-21T03:20:57.567633+00:00",
"started_at": "2026-10-21T03:21:08.911325+00:00",
"finished_at": "2026-10-21T03:21:20.667288+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.756,
"url": "/api/jobs/555d62bec8a2465f953dce4aa55c6f62/audio",
"download_url": "/api/jobs/555d62bec8a2465f953dce4aa55c6f62/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HitSoft_source.wav",
"sourceSha256": "739f58a9edf99e4254003df9d6d80758198c6d2dc864ec368d6133fcf476dd29",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HitSoft.wav",
"outputSha256": "337caa7211357b922e5cae26360197ee2753c79ed803ac88d1d050bd737dffbc",
"seconds": 0.34,
"trimStartSeconds": 0.0,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -15.922147871224414,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HitArmor",
"request": {
"prompt": "One small rock armor impact, crisp stone clack with two tiny gravel ticks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62106
},
"requestHash": "b82253a8536f4450f20cd710ff17d3645d3165859863e727f148fad8f43b89d9",
"job": {
"id": "d252cd2130664d15b4713da0422de187",
"status": "succeeded",
"prompt": "One small rock armor impact, crisp stone clack with two tiny gravel ticks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62106,
"created_at": "2026-10-21T03:21:09.631149+00:00",
"started_at": "2026-10-21T03:21:20.667288+00:00",
"finished_at": "2026-10-21T03:21:32.071102+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.404,
"url": "/api/jobs/d252cd2130664d15b4713da0422de187/audio",
"download_url": "/api/jobs/d252cd2130664d15b4713da0422de187/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HitArmor_source.wav",
"sourceSha256": "468cff97af1a9fca13290fcdd37f1d0fb4a57fbfc3a01a512a7638eb756dbc06",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HitArmor.wav",
"outputSha256": "f82ee2e53805549523a5443915258909e64965db2a12bcdecc090083f763f562",
"seconds": 0.42,
"trimStartSeconds": 1.0850113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -17.553284852790632,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HitShield",
"request": {
"prompt": "One small magical shield deflecting a hit, clear bright glass ping with short soft resonant tail, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62107
},
"requestHash": "099c297ef5e7dd09197eae231cd1fa7b111c61e40aafcc56d41e2d99d539a1fa",
"job": {
"id": "4bdeb6948d4f4a92b941aff68eee7e67",
"status": "succeeded",
"prompt": "One small magical shield deflecting a hit, clear bright glass ping with short soft resonant tail, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62107,
"created_at": "2026-10-21T03:21:20.888864+00:00",
"started_at": "2026-10-21T03:21:32.071102+00:00",
"finished_at": "2026-10-21T03:21:43.777446+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.706,
"url": "/api/jobs/4bdeb6948d4f4a92b941aff68eee7e67/audio",
"download_url": "/api/jobs/4bdeb6948d4f4a92b941aff68eee7e67/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HitShield_source.wav",
"sourceSha256": "db7191d5a31abdb63eb83679eb7e3ee7dd59ab4f9d623a25d4b95ee7b362e9ef",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HitShield.wav",
"outputSha256": "13d4dfad5668a40e8538b1e4320e1fcff20eacc0d53f67bb7540170b981c1045",
"seconds": 0.55,
"trimStartSeconds": 0.9950113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -12.863749544281681,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
}
]
}
Binary file not shown.
@@ -0,0 +1,57 @@
{
"status": "pass",
"bank": "Assets/Bundles/Effects/EnemyCombat/EnemyCombatPresentation.prefab",
"effects": 8,
"poolInstances": 32,
"voices": 8,
"clips": [
{
"name": "Enemy_HornletAttack",
"length": 0.48,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_DashletAttack",
"length": 0.42,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_ShellhornAttack",
"length": 0.6,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HornCaptainAttack",
"length": 0.58,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_GreatHornAttack",
"length": 0.82,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HitSoft",
"length": 0.34,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HitArmor",
"length": 0.42,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HitShield",
"length": 0.55,
"frequency": 44100,
"channels": 2
}
]
}
+79
View File
@@ -0,0 +1,79 @@
# UI 音效批次 v1
2026-10-20,按 `D:/UD/AI/XModel/TangoFlux_AI调用指南.md` 调用本机 `TangoFluxService`(`http://127.0.0.1:8012`)生成。风格贴近《微风小镇》菜单氛围:轻柔木感/糖果感 UI,短促、无音乐、无人声。
## 清单(10 条)
| 地址 | 用途 | 时长 | 种子 |
| --- | --- | --- | --- |
| `Ui_Click` | 通用按钮点击 | 1.5s | 41001 |
| `Ui_Confirm` | 确认 / 正向操作 | 2.0s | 41002 |
| `Ui_Back` | 返回 / 取消 | 1.5s | 41003 |
| `Ui_Open` | 打开面板 | 2.0s | 41004 |
| `Ui_Close` | 关闭面板 | 1.5s | 41005 |
| `Ui_Tab` | 页签切换 | 1.5s | 41006 |
| `Ui_Claim` | 领奖 / 领取附件 | 2.5s | 41007 |
| `Ui_Deny` | 拒绝 / 余额不足等 | 1.5s | 41008 |
| `Ui_Toggle` | 设置开关 | 1.5s | 41009 |
| `Ui_Notify` | 红点 / 通知提示 | 2.0s | 41010 |
## 生成参数
- 模型:`declare-lab/TangoFlux` + 本地 `flan-t5-large`
- `steps=50`,`guidance_scale=4.5`
- 输出:44.1 kHz 立体声 WAV
- 清单:`manifest.json`;任务回执:`Tools/output/ui_sfx_v1/` 与 `generation.json`
- 入口脚本:`python Tools/generate_ui_sfx.py`
## 工程路径
- Bundle:`AIClient/Assets/Bundles/Sound/SFX/UI/{Id}.wav`
- 收集:Art / Sound,`AddressByFileName`,`PackSeparately`
- Unity 导入回执:`unity_validation.json`(10 条、44100 Hz 立体声、DecompressOnLoad/PCM;Art/Sound 已收集)。
- v1 只入库与登记,未接入运行时播放;2026-10-21 已由下文 v2 替换同名 WAV 并接入运行时。
- 许可:TangoFlux 权重为非商业研究用途,商用前须核对上游许可。
## v2 一次性短音效与运行时接入(2026-10-21)
v1 的 10 条里有 9 条从头响到尾,持续 1.5~2.5 秒;`Ui_Open` 前 1.36 秒为静音,不适合作为按钮音。v2 改用"单发后静音"的提示词,每条以服务允许的最短时长 1 秒、4 个种子(52001~52004)生成候选。候选经 `Tools/generate_ui_sfx_v2.py` 后处理:去掉开头静音、截到目标长度、加 2ms 淡入和尾部 40% 平方淡出、归一化峰值。自动选择取目标窗口内能量占比最高、起音最快的候选,原始峰值低于 0.1 的视为噪声并淘汰(这条规则排除了 Notify 原先选中的 52002)。清单为 `manifest_v2.json`,选择结果与全部候选指标见 `generation_v2.json`。
| 地址 | 目标时长 | 峰值 | 选用种子 |
| --- | --- | --- | --- |
| `Ui_Click` | 0.15s | -6 dBFS | 52002 |
| `Ui_Confirm` | 0.45s | -4 dBFS | 52001 |
| `Ui_Back` | 0.22s | -6 dBFS | 52002 |
| `Ui_Open` | 0.35s | -6 dBFS | 52002 |
| `Ui_Close` | 0.28s | -7 dBFS | 52002 |
| `Ui_Tab` | 0.12s | -7 dBFS | 52001 |
| `Ui_Claim` | 0.8s | -3 dBFS | 52001 |
| `Ui_Deny` | 0.3s | -6 dBFS | 52002 |
| `Ui_Toggle` | 0.14s | -7 dBFS | 52001 |
| `Ui_Notify` | 0.5s | -6 dBFS | 52004 |
候选的原始音频和处理后版本在 `Tools/output/ui_sfx_v2/raw|trimmed/`。如需改用其他候选,执行 `python Tools/generate_ui_sfx_v2.py --process --pick Ui_Click=52003`,再用 Pipeline 运行 `BuildUiSfx.Build`。自动选择只依据波形指标,**听感仍需人工试听确认**。v1 原始文件保留在 `Tools/output/ui_sfx_v1/`。
运行时:`UiSfx.prefab`(`Assets/Bundles/Sound/Prefab/`,Art/Sound,地址 `UiSfx`)带一个 2D AudioSource(volume 0.8),并按 `UiSound` 枚举顺序引用 10 个 Clip,由 `GameplayBootstrap` 与主界面音乐一同加载。播放受设置里的"音效"开关控制,与音乐开关互不影响;同一音效 60ms 内的重复请求会被忽略。
| 地址 | 触发 |
| --- | --- |
| `Ui_Click` | 普通按钮 |
| `Ui_Confirm` | 训练/进化/购买/营地操作成功、重复胜利 |
| `Ui_Back` | 取消预览、撤下伙伴、放弃战斗 |
| `Ui_Open` | 首页入口打开面板 |
| `Ui_Close` | 返回/关闭回到首页 |
| `Ui_Tab` | 页签、邮件翻页 |
| `Ui_Claim` | 领奖、捕捉、开宝箱、首通胜利 |
| `Ui_Deny` | 服务端拒绝或连接失败 |
| `Ui_Toggle` | 设置开关、画质、布阵部署/撤下/推荐 |
| `Ui_Notify` | 首页新出现红点 |
验证:`BuildUiSfx.Verify` 与 `VerifyUiSfx.Play` 在隔离的 18081 账号上实际点击,结果为 hud.settings=Open、quality=Toggle、sfxOff=Toggle、关闭音效后关闭页面与打开设置均无声、settings.close=Close、hud.rewards=Open、每日宝箱=Claim、chest.back=Close;真实账号与音效偏好已还原,本轮无新增 Console 错误或警告。未构建或发布。
## v3:程序化合成(2026-10-21)
v2 试听反馈为“不好听”,与清脆轻松的游戏风格不符。v3 不再使用生成模型,改由 `Tools/synth_ui_sfx.py` 合成:
- 音色:木琴(基频加 3.93×、9.2× 快衰泛音)、钟琴(1 / 2.76 / 5.40 / 8.93× 非谐泛音)、气泡 pop(快速上滑的正弦),以及 4ms 高通噪声作起音。
- 映射:Click 气泡 pop;Tab 木琴 A6 轻敲;Toggle 两连 pop;Confirm 木琴 E6→B6 上行;Back 木琴 G6→D6 下行;Open 上滑加 E7 叮;Close 下滑加 G5 闷敲;Claim 钟琴 C6-E6-G6-C7 琶音加高音闪烁;Deny 两声低音柔和 boop;Notify 钟琴 G6→D7 叮叮。
- 调整:改 `RECIPES` 里的音高、衰减和音量后运行 `python Tools/synth_ui_sfx.py --preview`,再在 Unity 里执行 `BuildUiSfx.Build`。
+138
View File
@@ -0,0 +1,138 @@
{
"batchId": "ui_sfx_v1",
"base": "http://127.0.0.1:8012",
"generatedUtc": "2026-10-20T12:09:16Z",
"count": 10,
"items": [
{
"id": "Ui_Click",
"jobId": "4fa18c1f8c1944ae8b28cfd5b5d0860a",
"prompt": "Short soft UI button click, gentle wooden tap with tiny candy-like sparkle, warm cozy mobile game interface, dry close mic, no music, no speech, no reverb tails",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41001,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Click.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"status": "succeeded"
},
{
"id": "Ui_Confirm",
"jobId": "e314eeaf8b8247bfa5be5699d67c2fab",
"prompt": "Soft positive UI confirm chime, two warm xylophone notes ascending, light pastoral fantasy game interface, gentle and short, no music, no speech",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41002,
"bytes": 352844,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Confirm.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"status": "succeeded"
},
{
"id": "Ui_Back",
"jobId": "853c0fc04415423794334183f2c6c729",
"prompt": "Soft UI cancel or back tap, muted wooden click with quiet downward tone, cozy mobile menu, dry and brief, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41003,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Back.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"status": "succeeded"
},
{
"id": "Ui_Open",
"jobId": "3f7a59e3ec8a4036875f8983249e1c3c",
"prompt": "Soft UI panel open whoosh with a tiny bright chime, paper-light and warm pastoral game menu, short and friendly, no music, no speech",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41004,
"bytes": 352844,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Open.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"status": "succeeded"
},
{
"id": "Ui_Close",
"jobId": "1750377342534c3e963390968fb8e126",
"prompt": "Soft UI panel close whoosh, gentle downward air and quiet wood latch, cozy fantasy menu, very short, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41005,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Close.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"status": "succeeded"
},
{
"id": "Ui_Tab",
"jobId": "5ecffa283c02491e8e74fcffa8a67eb9",
"prompt": "Soft UI tab switch click, light plastic and wood blend, tiny bright tick, pastoral casual game interface, dry and short, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41006,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Tab.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"status": "succeeded"
},
{
"id": "Ui_Claim",
"jobId": "0d90f65cd6ae4bd3859e420c00c538f9",
"prompt": "Soft reward claim UI sparkle, small glittering chimes and light coin shimmer, warm candy pastoral fantasy game, short pleasant, no music bed, no speech",
"duration": 2.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41007,
"bytes": 441044,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Claim.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"status": "succeeded"
},
{
"id": "Ui_Deny",
"jobId": "9e1d374b53d34aa0af5d31c7856bf9fc",
"prompt": "Gentle UI error or deny thud, soft muted low wooden knock, not harsh, cozy mobile game feedback, dry and brief, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41008,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Deny.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"status": "succeeded"
},
{
"id": "Ui_Toggle",
"jobId": "1b1160a1d24d4b38885e9fdcb565ade0",
"prompt": "Soft UI toggle switch click, small mechanical soft snap with tiny sparkle, settings panel of a cozy fantasy mobile game, short, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41009,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Toggle.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"status": "succeeded"
},
{
"id": "Ui_Notify",
"jobId": "daedbe297f0741dab2825f7e8c68d31a",
"prompt": "Soft UI notification ping, single warm bell-like chime with tiny sparkle, friendly red-dot alert for a pastoral casual game, short and light, no music, no speech",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41010,
"bytes": 352844,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Notify.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"status": "succeeded"
}
]
}
+546
View File
@@ -0,0 +1,546 @@
{
"batchId": "ui_sfx_v2",
"generatedUtc": "2026-10-20T16:17:11Z",
"items": [
{
"id": "Ui_Click",
"targetSec": 0.15,
"peakDb": -6,
"prompt": "A tiny soft wooden button tap for a cozy mobile game menu, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52001.wav",
"lengthSec": 0.15,
"onsetSec": 0.0,
"kept": 0.0044,
"score": 0.0044,
"rawPeak": 0.9835,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52002.wav",
"lengthSec": 0.15,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 0.2191,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52003.wav",
"lengthSec": 0.15,
"onsetSec": 0.0,
"kept": 0.1441,
"score": 0.1441,
"rawPeak": 0.171,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52004.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0227,
"silent": true
}
]
},
{
"id": "Ui_Confirm",
"targetSec": 0.45,
"peakDb": -4,
"prompt": "Two quick bright xylophone notes rising, a cheerful positive confirm blip for a cute game, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52001.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.9705,
"score": 0.9705,
"rawPeak": 0.5869,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52002.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.7008,
"score": 0.7008,
"rawPeak": 0.4395,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52003.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.3875,
"score": 0.3875,
"rawPeak": 0.3589,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52004.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.1696,
"score": 0.1696,
"rawPeak": 0.8513,
"silent": false
}
]
},
{
"id": "Ui_Back",
"targetSec": 0.22,
"peakDb": -6,
"prompt": "A soft muted wooden click with a short falling tone, a gentle cancel blip, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52001.wav",
"lengthSec": 0.22,
"onsetSec": 0.2103,
"kept": 0.9899,
"score": 0.6093,
"rawPeak": 0.8346,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52002.wav",
"lengthSec": 0.22,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 0.4434,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0277,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52004.wav",
"lengthSec": 0.22,
"onsetSec": 0.0,
"kept": 0.4987,
"score": 0.4987,
"rawPeak": 0.1429,
"silent": false
}
]
},
{
"id": "Ui_Open",
"targetSec": 0.35,
"peakDb": -6,
"prompt": "A quick soft paper swoosh ending in a tiny bright chime, a menu panel opening, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52001.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.6677,
"score": 0.6677,
"rawPeak": 0.1025,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52002.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.6826,
"score": 0.6826,
"rawPeak": 0.6354,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52003.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.2222,
"score": 0.2222,
"rawPeak": 0.1919,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52004.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.5536,
"score": 0.5536,
"rawPeak": 0.7946,
"silent": false
}
]
},
{
"id": "Ui_Close",
"targetSec": 0.28,
"peakDb": -7,
"prompt": "A quick soft downward air swish ending in a quiet wooden latch tap, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52001.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0116,
"silent": true
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52002.wav",
"lengthSec": 0.28,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 1.0,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0602,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52004.wav",
"lengthSec": 0.28,
"onsetSec": 0.0,
"kept": 0.4045,
"score": 0.4045,
"rawPeak": 0.7418,
"silent": false
}
]
},
{
"id": "Ui_Tab",
"targetSec": 0.12,
"peakDb": -7,
"prompt": "A tiny light plastic tick, a crisp tab switch click, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52001.wav",
"lengthSec": 0.12,
"onsetSec": 0.2106,
"kept": 0.9333,
"score": 0.5521,
"rawPeak": 0.3409,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52002.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0186,
"silent": true
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0724,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52004.wav",
"lengthSec": 0.12,
"onsetSec": 0.0,
"kept": 0.0746,
"score": 0.0746,
"rawPeak": 0.151,
"silent": false
}
]
},
{
"id": "Ui_Claim",
"targetSec": 0.8,
"peakDb": -3,
"prompt": "A short sparkling glitter chime with a light coin jingle, a happy reward collected sound, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52001.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 0.8577,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52002.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 0.9356,
"score": 0.9356,
"rawPeak": 1.0,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52003.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 0.7923,
"score": 0.7923,
"rawPeak": 0.1699,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52004.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 0.8342,
"score": 0.8342,
"rawPeak": 1.0,
"silent": false
}
]
},
{
"id": "Ui_Deny",
"targetSec": 0.3,
"peakDb": -6,
"prompt": "A soft dull low wooden knock, two quick muted thuds, a gentle error buzz that is not harsh, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52001.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.6486,
"score": 0.6486,
"rawPeak": 1.0,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52002.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.9816,
"score": 0.9816,
"rawPeak": 0.6965,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52003.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.46,
"score": 0.46,
"rawPeak": 0.2253,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52004.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.3231,
"score": 0.3231,
"rawPeak": 1.0,
"silent": false
}
]
},
{
"id": "Ui_Toggle",
"targetSec": 0.14,
"peakDb": -7,
"prompt": "A small soft mechanical switch snap, a toggle click, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52001.wav",
"lengthSec": 0.14,
"onsetSec": 0.2068,
"kept": 0.9939,
"score": 0.6202,
"rawPeak": 0.8638,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52002.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0479,
"silent": true
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0176,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52004.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0448,
"silent": true
}
]
},
{
"id": "Ui_Notify",
"targetSec": 0.5,
"peakDb": -6,
"prompt": "A single warm small bell ping with a tiny sparkle, a friendly notification, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52004,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52001.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0001,
"silent": true
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52002.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0006,
"silent": true
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0162,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52004.wav",
"lengthSec": 0.5,
"onsetSec": 0.0,
"kept": 0.5332,
"score": 0.5332,
"rawPeak": 1.0,
"silent": false
}
]
}
]
}
+77
View File
@@ -0,0 +1,77 @@
{
"schemaVersion": 1,
"batchId": "ui_sfx_v1",
"theme": "Candy pastoral soft UI, matches MeadowBreeze menu mood",
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"outputDir": "Tools/output/ui_sfx_v1",
"bundleDir": "AIClient/Assets/Bundles/Sound/SFX/UI",
"designDir": "Doc/Design/Sound/UiSfx",
"defaults": {
"duration": 2,
"steps": 50,
"guidance_scale": 4.5
},
"items": [
{
"id": "Ui_Click",
"seed": 41001,
"duration": 1.5,
"prompt": "Short soft UI button click, gentle wooden tap with tiny candy-like sparkle, warm cozy mobile game interface, dry close mic, no music, no speech, no reverb tails"
},
{
"id": "Ui_Confirm",
"seed": 41002,
"duration": 2,
"prompt": "Soft positive UI confirm chime, two warm xylophone notes ascending, light pastoral fantasy game interface, gentle and short, no music, no speech"
},
{
"id": "Ui_Back",
"seed": 41003,
"duration": 1.5,
"prompt": "Soft UI cancel or back tap, muted wooden click with quiet downward tone, cozy mobile menu, dry and brief, no music, no speech"
},
{
"id": "Ui_Open",
"seed": 41004,
"duration": 2,
"prompt": "Soft UI panel open whoosh with a tiny bright chime, paper-light and warm pastoral game menu, short and friendly, no music, no speech"
},
{
"id": "Ui_Close",
"seed": 41005,
"duration": 1.5,
"prompt": "Soft UI panel close whoosh, gentle downward air and quiet wood latch, cozy fantasy menu, very short, no music, no speech"
},
{
"id": "Ui_Tab",
"seed": 41006,
"duration": 1.5,
"prompt": "Soft UI tab switch click, light plastic and wood blend, tiny bright tick, pastoral casual game interface, dry and short, no music, no speech"
},
{
"id": "Ui_Claim",
"seed": 41007,
"duration": 2.5,
"prompt": "Soft reward claim UI sparkle, small glittering chimes and light coin shimmer, warm candy pastoral fantasy game, short pleasant, no music bed, no speech"
},
{
"id": "Ui_Deny",
"seed": 41008,
"duration": 1.5,
"prompt": "Gentle UI error or deny thud, soft muted low wooden knock, not harsh, cozy mobile game feedback, dry and brief, no music, no speech"
},
{
"id": "Ui_Toggle",
"seed": 41009,
"duration": 1.5,
"prompt": "Soft UI toggle switch click, small mechanical soft snap with tiny sparkle, settings panel of a cozy fantasy mobile game, short, no music, no speech"
},
{
"id": "Ui_Notify",
"seed": 41010,
"duration": 2,
"prompt": "Soft UI notification ping, single warm bell-like chime with tiny sparkle, friendly red-dot alert for a pastoral casual game, short and light, no music, no speech"
}
]
}
+31
View File
@@ -0,0 +1,31 @@
{
"schemaVersion": 2,
"batchId": "ui_sfx_v2",
"theme": "Candy pastoral soft UI, matches MeadowBreeze menu mood; one-shot transients for buttons",
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"outputDir": "Tools/output/ui_sfx_v2",
"bundleDir": "AIClient/Assets/Bundles/Sound/SFX/UI",
"designDir": "Doc/Design/Sound/UiSfx",
"notes": "v1 clips sustained for the full 1.5-2.5s. Service minimum is 1s, so v2 generates 1s one-shots with several seeds, then trims leading silence, caps each clip at targetSec with a fade-out, normalizes to peakDb and auto-picks the candidate whose energy already sits inside the target window.",
"defaults": {
"duration": 1,
"steps": 50,
"guidance_scale": 4.5,
"seeds": [52001, 52002, 52003, 52004],
"fadeInMs": 2,
"suffix": ", a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb"
},
"items": [
{ "id": "Ui_Click", "targetSec": 0.15, "peakDb": -6, "prompt": "A tiny soft wooden button tap for a cozy mobile game menu" },
{ "id": "Ui_Confirm", "targetSec": 0.45, "peakDb": -4, "prompt": "Two quick bright xylophone notes rising, a cheerful positive confirm blip for a cute game" },
{ "id": "Ui_Back", "targetSec": 0.22, "peakDb": -6, "prompt": "A soft muted wooden click with a short falling tone, a gentle cancel blip" },
{ "id": "Ui_Open", "targetSec": 0.35, "peakDb": -6, "prompt": "A quick soft paper swoosh ending in a tiny bright chime, a menu panel opening" },
{ "id": "Ui_Close", "targetSec": 0.28, "peakDb": -7, "prompt": "A quick soft downward air swish ending in a quiet wooden latch tap" },
{ "id": "Ui_Tab", "targetSec": 0.12, "peakDb": -7, "prompt": "A tiny light plastic tick, a crisp tab switch click" },
{ "id": "Ui_Claim", "targetSec": 0.8, "peakDb": -3, "prompt": "A short sparkling glitter chime with a light coin jingle, a happy reward collected sound" },
{ "id": "Ui_Deny", "targetSec": 0.3, "peakDb": -6, "prompt": "A soft dull low wooden knock, two quick muted thuds, a gentle error buzz that is not harsh" },
{ "id": "Ui_Toggle", "targetSec": 0.14, "peakDb": -7, "prompt": "A small soft mechanical switch snap, a toggle click" },
{ "id": "Ui_Notify", "targetSec": 0.5, "peakDb": -6, "prompt": "A single warm small bell ping with a tiny sparkle, a friendly notification" }
]
}
@@ -0,0 +1,83 @@
{
"batch": "ui_sfx_v3",
"prefab": "Assets/Bundles/Sound/Prefab/UiSfx.prefab",
"address": "UiSfx",
"package": "Art",
"group": "Sound",
"volume": 0.8,
"sfxToggle": "PrototypeClientPrefs.Sfx",
"clips": [
{
"sound": "Click",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"seconds": 0.08,
"channels": 2,
"frequency": 44100
},
{
"sound": "Confirm",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"seconds": 0.36,
"channels": 2,
"frequency": 44100
},
{
"sound": "Back",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"seconds": 0.22,
"channels": 2,
"frequency": 44100
},
{
"sound": "Open",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"seconds": 0.34,
"channels": 2,
"frequency": 44100
},
{
"sound": "Close",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"seconds": 0.24,
"channels": 2,
"frequency": 44100
},
{
"sound": "Tab",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"seconds": 0.07,
"channels": 2,
"frequency": 44100
},
{
"sound": "Claim",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"seconds": 0.78,
"channels": 2,
"frequency": 44100
},
{
"sound": "Deny",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"seconds": 0.27,
"channels": 2,
"frequency": 44100
},
{
"sound": "Toggle",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"seconds": 0.1,
"channels": 2,
"frequency": 44100
},
{
"sound": "Notify",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"seconds": 0.52,
"channels": 2,
"frequency": 44100
}
],
"bundleBuilt": false,
"verifiedUtc": "2026-10-21T01:21:08.0054518Z"
}
+68
View File
@@ -0,0 +1,68 @@
{
"batchId": "ui_sfx_v3",
"method": "procedural synthesis (Tools/synth_ui_sfx.py, numpy)",
"format": "44.1 kHz 16-bit stereo (dual mono)",
"generatedUtc": "2026-10-21T01:20:43Z",
"items": [
{
"id": "Ui_Click",
"recipe": "bubble pop 700→1250 Hz + noise tick",
"peakDb": -6,
"lengthSec": 0.08
},
{
"id": "Ui_Confirm",
"recipe": "marimba E6→B6 rising, glockenspiel on top note",
"peakDb": -5,
"lengthSec": 0.36
},
{
"id": "Ui_Back",
"recipe": "soft marimba G6→D6 falling",
"peakDb": -7,
"lengthSec": 0.22
},
{
"id": "Ui_Open",
"recipe": "rising fwip 520→1400 Hz into an E7 ping",
"peakDb": -7,
"lengthSec": 0.34
},
{
"id": "Ui_Close",
"recipe": "falling fwip 1300→480 Hz into a soft G5 tok",
"peakDb": -7,
"lengthSec": 0.24
},
{
"id": "Ui_Tab",
"recipe": "light marimba A6 tick",
"peakDb": -8,
"lengthSec": 0.07
},
{
"id": "Ui_Toggle",
"recipe": "double pop 900→1500 then 1200→1900 Hz",
"peakDb": -8,
"lengthSec": 0.1
},
{
"id": "Ui_Claim",
"recipe": "glockenspiel arpeggio C6-E6-G6-C7 with marimba body and high sparkles",
"peakDb": -3,
"lengthSec": 0.78
},
{
"id": "Ui_Deny",
"recipe": "two soft low boops 330→262 Hz, gentle not harsh",
"peakDb": -7,
"lengthSec": 0.27
},
{
"id": "Ui_Notify",
"recipe": "bell ding-ding G6 then D7",
"peakDb": -6,
"lengthSec": 0.52
}
]
}
@@ -0,0 +1,122 @@
{
"folder": "Assets/Bundles/Sound/SFX/UI",
"count": 10,
"items": [
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"guid": "d84d9acaed435b141a61e474619abcac",
"address": "Ui_Back",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"guid": "6b80419ca6ccf464684cf5851cbe4258",
"address": "Ui_Claim",
"length": 2.5,
"samples": 110250,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"guid": "c462f9f6d11e50a41bf9bf465828669b",
"address": "Ui_Click",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"guid": "7301e73517800ea4ea3d719f4430b37b",
"address": "Ui_Close",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"guid": "91b80154d0ef8334b84d521bfa2d570c",
"address": "Ui_Confirm",
"length": 2.0,
"samples": 88200,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"guid": "33b23f7d7f48b92429e107ef44a5dc40",
"address": "Ui_Deny",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"guid": "a0da13344018a0f468a61d21b6f8dad7",
"address": "Ui_Notify",
"length": 2.0,
"samples": 88200,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"guid": "2982867cae515b24d9f342ca74728d99",
"address": "Ui_Open",
"length": 2.0,
"samples": 88200,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"guid": "ff0f87f7678cd61429a4c92c5e1ef59f",
"address": "Ui_Tab",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"guid": "319d495703f33964ca38bb8dd78c9691",
"address": "Ui_Toggle",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
}
],
"package": "Art",
"group": "Sound",
"packRule": "PackSeparately",
"runtimePlaybackWired": false,
"bundleBuilt": false,
"verifiedUtc": "2026-10-20T12:11:18.9078923Z"
}

Some files were not shown because too many files have changed in this diff Show More