增加skill、加入界面基础加载

This commit is contained in:
tianmo committed 2026-10-13 18:40:42 +08:00
1 parent 839165ea63
commit 5921a4884e
128 files changed
+17935 -5023

No files matched your search

@@ -0,0 +1,53 @@
---
name: task-difficulty-verification
description: 按需求难度分配验证成本——简单改动只做最省的确认、不跑测试;复杂改动必须做回归测试,避免改完反复返工。在本项目(Unity Vision)里做代码、场景或资源改动时适用。
---
# 按难度分配验证成本
目标:简单任务不要为了「保险」浪费 token 去测试;复杂任务必须验证,避免改错没发现、来回返工。
## 先判定难度,并用一句话说明
动手前判定,并用一句话告诉用户这次算简单还是复杂(例如「这算简单任务,改完直接给你」)。判错了用户能当场纠正。
**简单任务**(符合任一):
- 单文件小改、文案 / 命名 / 日志 / 注释
- 只读查询、看状态、回答问题
- 加一个对象、调一个参数、改个颜色或层级
- 删除无用代码,且无人引用
- 影响面单一,且用户已明确说明期望结果
**复杂任务**(符合任一):
- 跨文件 / 跨模块,或改动落在公共 API、被多处调用的代码上
- 核心逻辑、算法、状态机、存档或数据格式、构建配置、包依赖、渲染管线、材质 / Shader
- 改动会引入其他代码要使用的新类型、新接口、新字段
- 改错了不容易被发现,或者可能破坏原本能跑的东西
- 用户明确要求验证或回归
拿不准时按复杂处理。
## 简单任务:不做测试
- 直接改完交付,最多做一次最便宜的确认:读一次返回值、看一眼 transform、curl 一次接口。
- 不跑测试套件,不做回归,不为了确认把整个项目重读一遍。
- 不要用「更保险」当理由补验证步骤。
## 复杂任务:必须回归
按下面顺序做,够用即停:
1. 先让编译错误清零:读 `mcpforunity://editor/state` 等到 `compilation.is_compiling == false`,再 `read_console(types=["error"], count="10")`。
2. 跑覆盖本次改动的测试(`run_tests`,EditMode / PlayMode 按改动性质选),只跑相关范围,不重跑全量。
3. 回头验证本次改动会碰到、但原本正常的行为:调用方、相邻功能点、序列化数据、场景里已存在的对象。
4. 结果讲清楚:跑了什么、过没过、哪部分没测以及原因。
## 避免重复修改
- 验证通过就停手,不要顺手再改别的地方。
- 验证不过:定位根因改一次,重跑同一条验证;不要一边猜一边连续打补丁。
- 同一处连续两次修不好,停下来把现象和判断交给用户决定。
用户明确要求跑测试、或明确说不用测时,以用户的要求为准。
@@ -0,0 +1,43 @@
---
name: unity-development-rules
description: Unity 开发规则(Unity Vision 项目)。在本项目里写或改 C# 脚本、预制体、场景时适用,包含节点引用接线等硬性约定。
---
# Unity 开发规则
本项目的硬性约定。动手写脚本、改预制体或场景之前先对照这里。
## 节点引用必须在 Inspector / 预制体里指定,不能硬编码到代码
脚本要访问场景或预制体里的节点(Transform、Text、Image、其他组件……)时,一律用 `[SerializeField]` 字段,由 Inspector 或预制体把引用接好。
**不允许**——在代码里按名字 / 标签 / 路径找节点:
```csharp
// ❌ 节点名字写死在代码里
target = transform.Find("FPS").GetComponent<TMP_Text>();
target = GameObject.Find("FPS").GetComponent<TMP_Text>();
foreach (var t in GetComponentsInChildren<TMP_Text>(true))
if (t.name == "FPS") return t;
```
**允许**:
```csharp
[SerializeField] private TMP_Text target; // ✅ 引用由 Inspector / 预制体提供
```
**为什么**:节点改名或挪位置以后,硬编码的查找会静默失效——不报错、就是不工作;而且引用关系藏在代码里,看 Inspector 看不出到底接没接上。
**引用为空时**:不要写运行时兜底查找,直接报错,让接线问题第一时间暴露。
```csharp
private void Awake()
{
if (target == null)
Debug.LogError("[Xxx] 没有指定 target,请在 Inspector 里拖入。", this);
}
```
**边界**:这条只约束游戏运行时代码。编辑器工具、一次性批处理脚本需要按结构查找节点时可以照常查找。