下载 App

小人的任务“记忆”

07/221 浏览综合
可以。**当前架构已经让小人具备“运行时知道自己现在该做什么,并能按时间和突发事件切换行为”的基础能力**。但这里的“知道”是数据驱动的决策状态,不是自然语言推理或长期自主规划。 ##  1. 能知道当前任务 ###  学生 学生每次决策时,会先从通用任务服务查询“与自己相关的最高优先级开放任务”: - `scripts/系统/学生任务适配器.lua:73`
- `scripts/系统/
通用任务服务.lua:247`

任务可能是:

- 全体学生共享的校园活动;
- 只属于某个学生的紧急任务;
- 被阻塞、等待可用房间的任务。

学生最终会获得:

```lua
targetId       -- 去哪里
targetReason   -- 为什么去
status         -- 当前状态
```

任务优先于普通日程和随机权重行为:

- `scripts/系统/
学生AI.lua:78`
- `scripts/系统/
学生AI.lua:87`

例如学生可以表现为:

```text
任务:早读
目标:验收教室1
原因:校园早读活动
状态:前往验收教室1
```

如果房间不存在或不可用,学生也会得到明确状态:

```text
状态:等待可用地点
原因:任务目标房间不可用
```

对应处理在 `scripts/系统/
学生任务适配器.lua:42`。

###  工作人员

工作人员领取任务后,会把任务信息写入自身运行状态:

```lua
character.job
character.jobTarget
character.taskKind
character.taskPriority
character.taskPhase
character.behaviorState
character.currentTarget
```

对应代码在 `scripts/系统/
人员移动.lua:23`。

因此保安、保洁、校医等工作人员在运行时可以知道:

- 当前工作是什么;
- 工作目标在哪里;
- 属于普通岗位、日程、统一任务还是紧急任务;
- 当前正在前往、工作、阻塞还是已经完成;
- 当前任务对应哪个日程阶段。

---

##  2. 能知道当前时间对应的日程

所有人员共享校园时间:

```lua
state.campus.time
```

日程服务会把当前分钟数解析成日程阶段:

- `scripts/系统/日程服务.lua:3`
- `scripts/系统/
日程服务.lua:42`

例如:

```text
07:30 → 早读
07:50 → 升国旗/广播操
08:10 → 上课
11:50 → 午饭
12:40 → 午休
15:00 → 活动/体育
16:00 → 放学
```

学生通过当前阶段决定普通目标:

- `scripts/系统/
学生AI.lua:99`

工作人员也会在决策时读取当前日程块:

- `scripts/小人/
日程.lua:90`
- `scripts/小人/
日程.lua:91`

校园主循环发现阶段变化后,会发布 `PHASE_CHANGED` 事件,使学生重新决策:

- `scripts/玩法/校园日常/
init.lua:35`
- `scripts/玩法/校园日常/
init.lua:41`

所以当前不是“小人保存一只自己的手表”,而是:

```text
校园统一时间
  → 日程服务解析当前阶段
  → 活动服务生成校园活动
  → 任务服务生成共享任务
  → 学生和工作人员重新选择行动
```

这已经足以支持上课、课间、午休、活动和放学等基础日常切换。

---

##  3. 能响应突发事件

###  学生突发事件

目前学生支持这些打断类型:

- 受伤;
- 流鼻血;
- 紧急如厕;
- 老师点名返课;
- 前往办公室接受教育。

定义位置:

- `scripts/系统/打断服务.lua:9`

触发后会:

1. 取消学生当前地点行为;
2. 登记个人紧急任务;
3. 根据能力寻找动态房间;
4. 清除原导航进度;
5. 切换目标和状态;
6. 发布学生目标变化事件。

主要代码在 `scripts/系统/
打断服务.lua:23`。

例如:

```text
学生正在早读
  → 触发紧急如厕
  → 创建 priority=80 的个人紧急任务
  → 动态寻找具有 toilet 能力的厕所
  → 前往厕所
  → 到达后完成紧急任务
  → 重新读取仍然有效的共享早读任务
  → 返回教室
```

任务到达后的完成回写已经接通:

- 普通学生打断在到达目标时完成;
- 受伤、流鼻血任务在治疗结束时完成。

对应代码在 `scripts/系统/
通用任务服务.lua:476`、`scripts/系统/通用任务服务.lua:495`。

###  工作人员突发事件

工作人员突发任务会登记为:

```lua
source = "emergency"
priority = 100
status = "assigned"
interruptMode = "replace_current"
```

对应代码在 `scripts/系统/
通用任务服务.lua:406`。

当前已有案例包括:

- 保安响应可疑学生;
- 工作人员前往事件坐标;
- 观察阶段变化时取消旧响应;
- 工作完成后回写 `completed`;
- 随后恢复普通岗位任务。

工作人员的任务选择入口:

- `scripts/小人/
日程.lua:90`

任务完成回写:

- `scripts/系统/
人员移动.lua:143`
- `scripts/系统/
工作人员任务适配器.lua:93`

因此工作人员已经能够形成:

```text
普通岗位
  → 发现突发事件
  → 暂停普通岗位
  → 前往事件地点
  → 处理事件
  → 完成任务
  → 返回普通岗位
```

---

##  4. 能根据职业领取适合自己的任务

已经有最小职业过滤:

- 保洁员可以领取未分配的清洁任务;
- 已分配的工作人员只能读取分配给自己的任务;
- 同一个清洁任务通过原子 `Assign` 避免多个保洁重复领取;
- 紧急任务直接指定执行人员。

对应代码:

- `scripts/系统/
工作人员任务适配器.lua:14`
- `scripts/系统/
工作人员任务适配器.lua:27`
- `scripts/系统/
通用任务服务.lua:256`

已经通过运行探针验证:

```text
保洁发现厕所清洁任务
  → 原子认领
  → 前往动态厕所
  → 进入清洁工作
  → 完成任务
  → 回到巡回清洁
```

所以任务不是只显示在面板上,而是已经真正接入移动和工作执行链。

---

##  5. 当前能力边界

虽然基础闭环已经成立,但还不是完整的自主 NPC 系统。

###  已实现

- 知道当前校园时间对应的日程阶段;
- 知道当前应该去哪里;
- 知道任务名称、目标和状态;
- 能消费共享活动任务;
- 能消费个人紧急任务;
- 能按动态房间能力选择地点;
- 能处理目标房间不可用;
- 能被突发事件打断;
- 能到达、工作、完成和回写;
- 完成紧急任务后能重新回到普通活动或岗位;
- 保洁任务支持原子认领。

###  部分实现

####  1. 优先级还没有完全统一比较

任务服务内部会按优先级排序:

- `scripts/系统/
通用任务服务.lua:155`

但工作人员日程当前只要发现统一任务,就会直接返回:

- `scripts/小人/
日程.lua:107`

这意味着:

```text
统一任务 priority=25
普通岗位 priority=30
```

目前仍可能因为“统一任务先返回”而执行 priority 25 的任务,并没有把所有普通岗位、日程任务和统一任务放在同一个比较器中。

也就是说,**优先级字段已经有了,但尚未完全成为跨系统的统一抢占规则**。

####  2. 工作人员任务类型仍有限

目前工作人员统一任务主要接入了:

- 保洁清洁;
- 已指派紧急事件。

还没有完整接入:

- 教师授课任务;
- 体育老师带队;
- 食堂员工供餐;
- 校医主动巡诊;
- 保安定期巡逻与门禁任务的统一任务化。

####  3. 房间删除后的生命周期还需补全

如果任务已经分配,但目标房间后来被删除或禁用,工作人员适配器会无法解析目标:

- `scripts/系统/
工作人员任务适配器.lua:45`
- `scripts/系统/
工作人员任务适配器.lua:73`

但目前还没有完整自动把这类任务统一回写为:

```text
blocked
cancelled
```

可能出现任务仍处于 `assigned`,但执行者已经无法获得有效目标的情况。这也是下一轮应补齐的明确边界。

####  4. 没有长期计划和个人记忆

当前小人知道的是:

```text
现在几点
当前阶段是什么
当前最高优先级任务是什么
现在要去哪里
当前执行到哪一步
```

但还不知道:

- 今天后面还有哪些任务;
- 某个任务预计需要多久;
- 是否会与下一节课冲突;
- 自己过去执行过多少类似任务;
- 是否因为疲劳、关系或性格拒绝任务;
- 多个未来任务如何提前排序;
- 如何和其他小人协商、转交任务。

这需要后续增加“个人计划队列、需求状态、任务恢复和协作调度”,但当前阶段不必提前实现。

##  结论

**能,但属于“基础运行时认知与执行闭环”。**

当前小人已经可以回答四个核心问题:

```text
现在是什么时间?
当前校园处于什么阶段?
我现在应该做什么?
发生紧急事件后,我应该去哪里处理?
```

而且这些答案已经能够驱动导航、工作和完成回写,不只是 UI 文本。

尚未达到的是:

```text
对全天任务做长期规划
在多个普通任务和统一任务间进行完全一致的优先级竞争
处理所有职业
自动处理已分配任务目标失效
多人协作、转交和排队
```

因此,当前架构已经足够作为“小人自主日常行为系统”的骨架;下一项最有价值的完善不是继续添加特殊判断,而是补齐**工作人员任务目标失效后的 blocked/cancelled 回写,以及跨日程/岗位/统一任务的真正统一优先级比较**。
以鼠标为锚点缩放
核心数学原理 缩放前后,鼠标指向的那个世界坐标点必须保持在同一屏幕位置。 已知:旧缩放 oldZoom、新缩放 newZoom、鼠标锚点屏幕坐标 (ax, ay)、当前偏移 (panX, panY) 步骤1:算出旧缩放下鼠标指向的世界坐标 wx = (ax - panX) / oldZoom wy = (ay - panY) / oldZoom 步骤2:新缩放后反解新偏移,让 wx/wy
官方
1 赞
小人的认知系统
这是一个很好的思路。RND 的核心——用"预测误差"度量新奇度,驱动探索——可以直接映射到校园小人的认知系统上,而且不需要真的跑神经网络。下面是方案讨论。 RND 思想到校园小人的映射 RND 原始结构 vs 校园简化版 RND 组件 原始含义 校园小人对应 目标网络(固定随机) 为每个状态生成固定特征 环境的客观快照:房间类型、物件数、人员密度、卫生度、当前时段 预测网络(可训练) 学习预测目标
官方
4 赞
右键拖拽平移
一、问题本质 不是平移公式写错,而是 UrhoX UI 库指针事件派发的两个不对称陷阱叠加: 陷阱 现象 根因文件 OnPointerMove 不向父冒泡 右键按下 isPanning_=true,但 move 事件永远到不了 mapView urhox-libs/UI/Core/Widget.lua(OnPointerDown/Up 有 parent 冒泡,OnPointerMove 没有) H
官方
4 赞
修复"地图编辑器刷新数据丢失"
问题诊断过程 用户报告:编辑器建好房间 → 保存 → 刷新页面 → 进编辑器 → 数据全没了。 关键线索:用户发现"校园日"模式刷新后能看到房间,但一进编辑器就没了。 这直接指向了编辑器页面自身的初始化逻辑,而非持久化链路。 根因 地图编辑模式.lua 的 EnsureBlankEditorLayout() 设计意图是"首次打开编辑器提供空白画布",用模块级布尔 editorLayoutClear
官方
4 赞
精灵平滑移动、墙碰撞体积
一、 渲染层用连续坐标(scripts/页面/校园地图.lua,三处统一): -- NPC 定位(第408-410行) local contLeft = (character.x or 0) * 5 - 18 - charLeft local contTop = (character.y or 0) * 5 - 36 - charTop -- 主角定位(第504-506行) local con
官方
1 赞
地图编辑器仿真 tick 重建抑制
UI 重建频率 = 事件分发的可靠性上限。 只要有一帧 SetRoot 销毁了正在处理 pointer 事件的控件,跨重建边界的 Down/Up 对就会被吞。高频仿真 tick 必须在 UI 边界按页面过滤。 关键代码(scripts/main.lua HandleUpdate) 四步走:先原地处理人员 → 聚合所有仿真 changed → 地图页强制压制 → 只放行显式/登录态变化。 -- ma
官方
4 赞
地图编辑器地面交互与视觉优化
一、问题链 用户截图反馈了三个递进的问题: 问题 1:点击地面类型(如食堂地砖),弹窗不关闭,挡住画布无法操作 ↓ 修复 v0.10.94 问题 2:地面贴图太大,一块地砖比小人还宽,比例失调 ↓ 修复 v0.10.96(改配置值) 问题 3:改了配置值后刷新仍然太大——旧存档的 tileSize=256 优先级高于新 config ↓ 修复 v0.10.97(反转渲染优先级) 二、关键代码
官方
4 赞
槽位变更只走原子方法
经验 下标 = 视觉格子,空槽是合法状态。定长 9 槽,inventory[i]=nil 即第 i 格空着,中间允许空。任何"把物品往前挪/压缩/重排"的操作都会让"你看到的格子"和"数组真实下标"脱节 → 物品消失。渲染直映 inventory[i],数据层绝不重排。 稀疏表禁用 #。带 nil 洞的表 #inv 是未定义的(可能=0 直接读成空包,或=洞前边界)。所有遍历上界一律 Player
官方
4 赞
自动寻路赠送
核心功能 携带模式(点击物品跟鼠标)下: ≤8格:点击小人直接赠送(金色边框) >8格:点击远距离小人 → 自动寻路走向目标 → 到达8格内自动赠送 取消:玩家按方向键/WASD/摇杆手动移动 → 立即取消,恢复物品 关键经验(3条踩坑教训) 经验1:类型标识不是中文,是英文枚举值 地图编辑器放置的角色 type/job 字段是英文标识(teacher_3、doctor、cleaner_2、tea
官方
1 赞
编辑器实体 zIndex 层级
问题 编辑器中墙段被房间面板覆盖不可见。原因:给房间设 zIndex=1 会创建 stacking context,其内部带背景色/TiledImage 的 floorLayer 作为 paint layer 在合成时盖过了同层级 zIndex=2 的墙段——差距太小不够可靠。 解决:底层不设 zIndex,上层用明显间距 错误做法(zIndex 间距太小 + 给底层也设 zIndex): --
官方
1 赞