Skip to content

Commit fd181c2

Browse files
author
hobobo
committed
更新示例代码实现
1 parent b838a4b commit fd181c2

200 files changed

Lines changed: 8625 additions & 1503 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.cursor/rules/project-positioning.mdc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ alwaysApply: true
77

88
## 工程概述
99

10-
AbilityKit 是一个**生产级 MOBA 游戏技能框架**,具备完整的技术架构和跨平台能力。
10+
AbilityKit 是一个**完整 MOBA 游戏技能框架**,具备完整的技术架构和跨平台能力。
1111

1212
### 核心技术能力
1313

@@ -271,7 +271,7 @@ Console Demo 必须实现与生产环境相同的架构模式:
271271

272272
| 维度 | 定位 |
273273
|------|------|
274-
| **工程类型** | 生产级 MOBA 游戏技能框架 |
274+
| **工程类型** | 完整 MOBA 游戏技能框架 |
275275
| **核心能力** | 帧同步、状态同步、回放、跨平台 |
276276
| **Console Demo** | 功能完整的帧同步验证环境 |
277277
| **架构原则** | 四层架构、单向依赖、跨平台优先 |

Docs/MobaAcceptanceScenarioDSLGuide.md

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
- 支持 actor alias 到 actorId/playerId 的映射。
2323
- 支持时间轴按 `atMs` 驱动技能输入与等待。
2424
- 输入模型支持 actor、target、position、direction、phase、slot。
25+
- `setupActions` 已接入测试工程内命令执行器,支持第一阶段环境准备命令:`spawn_actor``set_attr``move_to``add_buff``remove_buff``wait` / `tick`
2526
- trace exporter 会输出 scenario 相关字段,便于后续报告工具读取。
26-
- assertion 支持 trace/state/context 三类断言。
27+
- assertion 支持 trace/state/context 三类断言,并支持基础 buff 状态断言
2728
- `AbilityKit.Game.UnitTests.csproj` 已通过编译验证。
2829

2930
## 3. 推荐测试文件组织
@@ -40,6 +41,7 @@ Unity/Packages/com.abilitykit.demo.moba.view.runtime/Runtime/Game/Test/
4041
UnitTest/
4142
MobaAcceptanceModels.cs
4243
MobaAcceptanceRunner.cs
44+
MobaAcceptanceSetupActionExecutor.cs
4345
MobaAcceptanceExpectationAssert.cs
4446
MobaAcceptanceTraceExporter.cs
4547
MobaSkillConfigTestHarness.cs
@@ -118,32 +120,47 @@ Unity/Packages/com.abilitykit.demo.moba.view.runtime/Runtime/Game/Test/
118120

119121
## 6. SetupActions 约定
120122

121-
`setupActions` 用于进入游戏后、timeline 执行前做一次性准备。
123+
`setupActions` 用于进入游戏后、timeline 执行前做一次性准备。第一阶段命令只放在测试工程内执行:runner 负责识别 setup action,`MobaAcceptanceSetupActionExecutor` 负责分发命令,实际运行时变更继续委托 `MobaSkillConfigTestHarness` 与正式 runtime service。
122124

123-
当前建议先保持轻量,主要用于
125+
当前支持命令
124126

125-
- 等待若干 tick/ms。
126-
- 未来扩展:加 buff、改属性、移动 actor、生成召唤物、设置 CD、设置资源。
127+
| action | 语义 | 常用字段 |
128+
|---|---|---|
129+
| `wait` / `tick` | 推进测试世界时间 | `durationMs` |
130+
| `spawn_actor` | 生成测试场景 actor / 召唤物 / 特殊实体,并注册 alias | `alias``kind``teamId``heroId``attributeTemplateId``unitSubType``mainType``sourceAlias``sourceKind``position` |
131+
| `set_attr` | 修改 actor 属性 | `actorAlias``actorId``targetActorId``property``value` / `intValue` |
132+
| `move_to` | 移动 actor 到指定位置 | `actorAlias``actorId``targetActorId``position` |
133+
| `add_buff` | 对 actor 应用 buff | `targetAlias``actorAlias``sourceAlias``buffId``durationOverrideMs` |
134+
| `remove_buff` | 从 actor 移除 buff | `targetAlias``actorAlias``sourceAlias``buffId``removeAll` |
127135

128136
示例:
129137

130138
```json
131139
{
132140
"scenario": {
133141
"setupActions": [
134-
{ "action": "wait", "durationMs": 100 }
142+
{ "action": "wait", "durationMs": 100 },
143+
{ "action": "move_to", "actorAlias": "target", "position": { "x": 4, "y": 0, "z": 0 } },
144+
{ "action": "set_attr", "actorAlias": "target", "property": "hp", "value": 1000 },
145+
{ "action": "add_buff", "targetAlias": "caster", "sourceAlias": "caster", "buffId": 1, "durationOverrideMs": 5000 },
146+
{
147+
"action": "spawn_actor",
148+
"alias": "summon_1",
149+
"teamId": 1,
150+
"heroId": 1,
151+
"attributeTemplateId": 1001,
152+
"unitSubType": 2,
153+
"mainType": 1,
154+
"sourceAlias": "caster",
155+
"sourceKind": "Summon",
156+
"position": { "x": 2, "y": 0, "z": 3 }
157+
}
135158
]
136159
}
137160
}
138161
```
139162

140-
后续建议把 setup action 扩展为明确命令集,而不是直接暴露 service 细节,例如:
141-
142-
```json
143-
{ "action": "set_attr", "actor": "target", "property": "hp", "value": 1000 }
144-
{ "action": "add_buff", "actor": "caster", "buffId": 2001001 }
145-
{ "action": "move_to", "actor": "target", "position": { "x": 4, "y": 0, "z": 0 } }
146-
```
163+
设计边界:setup action 是验收测试 DSL,不是生产玩法脚本。不要在 JSON 中暴露 service/method 细节,也不要在 runner 中直接堆业务分支;新增命令应优先扩展测试工程内 executor/harness。
147164

148165
## 7. Timeline 约定
149166

@@ -275,6 +292,8 @@ trace 断言用于验证技能配置链路是否执行到了关键节点。
275292
| `maxHp` | 最大生命值 |
276293
| `maxMana` | 最大法力值 |
277294
| `teamId` | 队伍 ID |
295+
| `buff` / `hasBuff` | 是否拥有指定 buff,使用 `expectedInt``expectedValue` 表示 buffId,使用 `expectedBool` 表示期望是否存在 |
296+
| `buffCount` | 指定 buff 数量,使用 `expectedInt``expectedValue` 表示 buffId;不传 buffId 时统计全部 active buff |
278297
| `position` / `transform.position` | actor 当前位置 |
279298

280299
当前支持 comparator:
@@ -370,7 +389,7 @@ trace 断言用于验证技能配置链路是否执行到了关键节点。
370389
### P0:补齐可用性
371390

372391
- 增加一到两个真实 scenario JSON 样例。
373-
- `setupActions` 增加 `set_attr``add_buff``move_to`
392+
- `setupActions` 第一阶段命令已落地:`spawn_actor``set_attr``move_to``add_buff``remove_buff``wait` / `tick`
374393
- trace summary 中增加失败时的 nearest records 辅助定位。
375394
- runner 输出更明确的 alias、actorId、timeline 当前帧日志。
376395

@@ -450,8 +469,9 @@ Web 分析模型建议长期保持以下关联字段稳定:
450469
| 文件 | 职责 |
451470
|---|---|
452471
| `MobaAcceptanceModels.cs` | JSON DTO / scenario DSL 数据结构 |
453-
| `MobaSkillConfigTestHarness.cs` | headless world 创建、actor/player alias、输入提交 |
472+
| `MobaSkillConfigTestHarness.cs` | headless world 创建、actor/player alias、输入提交、测试环境命令底层辅助 API |
454473
| `MobaAcceptanceRunner.cs` | legacy/scenario 路由、setup/timeline 执行 |
474+
| `MobaAcceptanceSetupActionExecutor.cs` | 测试工程内 setup action 命令分发器,承载第一阶段环境准备命令 |
455475
| `MobaAcceptanceExpectationAssert.cs` | trace/state/context 断言 |
456476
| `MobaAcceptanceTraceExporter.cs` | trace 与 summary artifact 导出 |
457477
| `GatewaySkillAcceptanceArtifacts.cs` | Web 后台只读 artifact 扫描、case 读取、run-plan 边界描述,包含路径约束、结构化错误与常量化文件元数据 |

Docs/Shooter示例定位与完成度阶段性分析.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Shooter 示例当前已经不再是“临时拼出来的同步样例”,而是
88
- Unity 侧不只是概念设计,已经存在独立 Editor 包、窗口、SceneView 绘制和输入采集外壳。
99
- 纯 C# 验收、DemoHarness、Svelto 基准、Orleans 世界管理都已经落地。
1010

11-
但它还没有达到“生产级大规模纯状态同步方案”的完整完成度。当前最明显的缺口不在外壳,而在三条真正决定成熟度的链路:
11+
但它还没有达到“完整大规模纯状态同步方案”的完整完成度。当前最明显的缺口不在外壳,而在三条真正决定成熟度的链路:
1212

1313
1. 时间锚/时钟链路已经进入 PlayMode/Remote PlayMode 步进与诊断投影,但还需要继续接入更多生产链路。
1414
2. 服务端回溯命中判定已经形成 runtime→host diagnostics 的可观察验收闭环,但还需要进一步挂入远程服务器链路和健康事件。

Docs/design/01-OverviewAndGettingStarted/01-WhatIsAbilityKit.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 1.1 AbilityKit 是什么
22

3-
> 一句话了解 AbilityKit:生产级 MOBA 游戏技能框架,具备完整帧同步、网络同步、回放系统能力。
3+
> 一句话了解 AbilityKit:完整 MOBA 游戏技能框架,具备完整帧同步、网络同步、回放系统能力。
44
55
---
66

Docs/同步演示框架示例层重构设计.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
## 1. 背景与问题
1010

11-
当前 Shooter 示例已经落地两种生产级同步模式(PredictRollback、AuthoritativeInterpolation),且 Moba 已复用框架的 `RemoteInterpolationPlayback<TSample>` 验证了「通用同步能力下沉框架、玩法只留 Sample/Projector」的可行性。
11+
当前 Shooter 示例已经落地两种完整同步模式(PredictRollback、AuthoritativeInterpolation),且 Moba 已复用框架的 `RemoteInterpolationPlayback<TSample>` 验证了「通用同步能力下沉框架、玩法只留 Sample/Projector」的可行性。
1212

1313
但目标是把示例层做成一个**同步演示框架**
1414

Docs/网络同步框架阶段性设计.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ demo 控制器(如 `ShooterClientAuthoritativeInterpolationSyncController`)
157157

158158
## 6. 现状与方向
159159

160-
已落地的两种生产级客户端能力
160+
已落地的两种完整客户端能力
161161

162162
- **PredictRollback**:本地预测 + 权威回滚 + 对账,含漂移检测与强同步恢复。
163163
- **AuthoritativeInterpolation**:远端实体延迟插值播放,配置 / 诊断 / 编排全部下沉框架层。

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,6 @@ dotnet run
399399

400400
| 模块 | 文档 |
401401
| ------------------------------------------------------------------------------------------------- | ------------------------------------------ |
402-
| [工程化测试门禁](./Docs/AbilityKit测试门禁与批量回归规范.md) | P0/P1/P2 测试门禁、批量回归、xUnit Trait 标签与 CI 接入规范 |
403402
| [技术选型](./Unity/Packages/技术选型文档.md) | 从零开发战斗框架的技术选型 |
404403
| [Host 模块](./Unity/Packages/com.abilitykit.host.extension/Document/) | 游戏服务器运行时框架 |
405404
| [状态同步与预测](./Unity/Packages/com.abilitykit.world.statesync/Document/StateSyncDesign.md) | 客户端预测、Rollback、StateHash 校验 |

Server/AdminConsole/src/components/SkillAcceptancePanel.vue

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,25 @@
4545
<div class="ops-status acceptance-summary"><div><span>产物目录</span><strong>{{ admin.acceptanceBatch.value?.artifactDirectory || admin.acceptance.artifactDirectory }}</strong></div><div><span>批次摘要</span><strong>{{ admin.acceptanceBatch.value?.hasBatchSummary ? '已找到' : '缺失' }}</strong></div><div><span>通过</span><strong>{{ admin.acceptancePassedCount.value }}</strong></div><div><span>失败</span><strong>{{ admin.acceptanceFailedCount.value }}</strong></div><div><span>未知</span><strong>{{ admin.acceptanceUnknownCount.value }}</strong></div><div><span>过滤后</span><strong>{{ admin.acceptanceFilteredCases.value.length }}</strong></div></div>
4646
<div class="acceptance-layout">
4747
<div class="acceptance-case-list">
48-
<h3>用例列表</h3>
49-
<article v-for="item in admin.acceptanceFilteredCases.value" :key="item.caseId" class="acceptance-case" :class="{ active: item.caseId === admin.acceptance.selectedCaseId, failed: item.passed === false }" @click="admin.refreshAcceptanceCase(item.caseId)">
50-
<div><strong>{{ item.caseId }}</strong><small>{{ item.description || item.worldId || item.summaryPath }}</small></div>
51-
<span class="badge" :class="item.passed === false ? 'danger' : ''">{{ item.passed === false ? '失败' : item.passed === true ? '通过' : '未知' }}</span>
52-
<p><span class="badge">{{ item.category || 'contract' }}</span> {{ (item.tags || []).join(' / ') || 'no-tags' }}</p>
53-
<p>帧 {{ item.finalFrame }} / {{ item.finalTimeMs }}ms / 追踪 {{ item.traceNodeCount }}</p>
54-
<p v-if="item.missingTraceNodes || item.missingActions || item.missingRelationships" class="muted">缺口:{{ item.missingTraceNodes || 'trace ok' }} / {{ item.missingActions || 'actions ok' }} / {{ item.missingRelationships || 'relations ok' }}</p>
48+
<div class="acceptance-list-toolbar">
49+
<h3>用例列表</h3>
50+
<div class="actions">
51+
<span class="badge">已选 {{ admin.acceptanceSelectedCount.value }}</span>
52+
<button class="secondary" :disabled="admin.busy.value || !admin.acceptanceFilteredCases.value.length" @click="admin.selectAllFilteredAcceptanceCases">全选过滤结果</button>
53+
<button class="secondary" :disabled="admin.busy.value || !admin.acceptanceSelectedCount.value" @click="admin.clearAcceptanceCaseSelection">清空选择</button>
54+
<button class="danger" :disabled="admin.busy.value || !admin.acceptanceSelectedCount.value" @click="admin.deleteAcceptanceCases()">删除选中</button>
55+
<button class="secondary" :disabled="admin.busy.value" @click="admin.refreshAcceptanceArtifacts">刷新列表</button>
56+
</div>
57+
</div>
58+
<article v-for="item in admin.acceptanceFilteredCases.value" :key="item.caseId" class="acceptance-case" :class="{ active: item.caseId === admin.acceptance.selectedCaseId, selected: admin.isAcceptanceCaseSelected(item.caseId), failed: item.passed === false }" @click="admin.refreshAcceptanceCase(item.caseId)">
59+
<label class="acceptance-case-select" @click.stop>
60+
<input type="checkbox" :checked="admin.isAcceptanceCaseSelected(item.caseId)" @change="admin.toggleAcceptanceCaseSelection(item.caseId)" />
61+
</label>
62+
<div class="acceptance-case-main"><div><strong>{{ item.caseId }}</strong><small>{{ item.description || item.worldId || item.summaryPath }}</small></div><p><span class="badge">{{ item.category || 'contract' }}</span> {{ (item.tags || []).join(' / ') || 'no-tags' }}</p><p>帧 {{ item.finalFrame }} / {{ item.finalTimeMs }}ms / 追踪 {{ item.traceNodeCount }}</p><p v-if="item.missingTraceNodes || item.missingActions || item.missingRelationships" class="muted">缺口:{{ item.missingTraceNodes || 'trace ok' }} / {{ item.missingActions || 'actions ok' }} / {{ item.missingRelationships || 'relations ok' }}</p></div>
63+
<div class="acceptance-case-actions">
64+
<span class="badge" :class="item.passed === false ? 'danger' : ''">{{ item.passed === false ? '失败' : item.passed === true ? '通过' : '未知' }}</span>
65+
<button class="danger" :disabled="admin.busy.value" @click.stop="admin.deleteAcceptanceCase(item.caseId)">删除</button>
66+
</div>
5567
</article>
5668
<p v-if="!admin.acceptanceBatch.value?.cases?.length" class="muted">尚未读取到场景产物;先通过 Unity、单元测试或 CI 生成 batch_summary.json 与 *_trace.jsonl。</p>
5769
<p v-else-if="!admin.acceptanceFilteredCases.value.length" class="muted">当前过滤条件下没有匹配的用例。</p>

Server/AdminConsole/src/services/domainApi.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AdminApiClient } from './adminApiClient';
2-
import type { AdminClusterDiagnostics, AdminDashboardResponse, AdminServerOperationResponse, AdminServerStatus, AdminSkillAcceptanceArtifactDirectoryList, AdminSkillAcceptanceBatch, AdminSkillAcceptanceCase, AdminSkillAcceptanceRunPlan, AdminSkillAcceptanceRunResponse, AdminSkillAcceptanceTemplateList, AdminSkillAnalysisModel, AdminSkillDiagnosticsEvents, AdminSkillDiagnosticsSummary, CreateRoomResponse, RestoreRoomResponse, RoomRuntimeState, RoomSnapshot, SessionResponse, ShooterSandboxState } from '../types';
2+
import type { AdminClusterDiagnostics, AdminDashboardResponse, AdminServerOperationResponse, AdminServerStatus, AdminSkillAcceptanceArtifactDirectoryList, AdminSkillAcceptanceBatch, AdminSkillAcceptanceCase, AdminSkillAcceptanceDeleteResponse, AdminSkillAcceptanceRunPlan, AdminSkillAcceptanceRunResponse, AdminSkillAcceptanceTemplateList, AdminSkillAnalysisModel, AdminSkillDiagnosticsEvents, AdminSkillDiagnosticsSummary, CreateRoomResponse, RestoreRoomResponse, RoomRuntimeState, RoomSnapshot, SessionResponse, ShooterSandboxState } from '../types';
33

44
export class AdminDashboardApi {
55
public constructor(private readonly client: AdminApiClient) {}
@@ -64,6 +64,10 @@ export class AdminSkillApi {
6464
return this.client.request<AdminSkillAcceptanceBatch>(`/api/admin/skills/acceptance/batch${query}`, undefined, 'GET');
6565
}
6666

67+
public acceptanceDelete(request: unknown) {
68+
return this.client.request<AdminSkillAcceptanceDeleteResponse>('/api/admin/skills/acceptance/delete', request);
69+
}
70+
6771
public acceptanceRun(request: unknown) {
6872
return this.client.request<AdminSkillAcceptanceRunResponse>('/api/admin/skills/acceptance/run', request);
6973
}

0 commit comments

Comments
 (0)