Unity SpriteAtlas 导出的 PNG 图集若在合入前才肉眼看,很容易漏掉三类硬问题:POT(宽、高均为 2 的幂)、契约要求的 RGBA 透明、以及包体预算下的 max_bytes。下面给出一套可直接抄到 README 的流程:在远程 Mac常驻监听,经 OpenClaw Gateway 收窄 shell 与路径白名单,把「半写入」「重复事件」「无意义重试」挡在自动化层之外。
目录监听策略 · 批处理命令模板 · 失败重试与日志归档 · 排障 FAQ
九宫格与可拉伸切图规范可先对照《Nine-patch PNG 交付清单》;监听防抖、指数退避与 JSONL 字段命名建议对齐《PNG 监听队列与日志归档》。通过闸门后若还要缩体积,另排《pngquant/zopflipng 矩阵》,并与「运行时压缩策略」同一版本号管理。网关安装与权限基线见《OpenClaw 全平台安装指南》;需要把通知丢到快捷指令时可参考《网关串联 Shortcuts》的目录契约。
目录监听策略
实例:在仓库旁(或仓库内已 .gitignore)创建 Exports/SpriteAtlas/。Unity Editor 脚本将内容写到 atlas_hud_1024.png.tmp,fsync 关闭文件句柄后再 mv 成 .png,这样 fswatch 只在「完整可读文件」出现时收到稳定事件。安装:brew install fswatch imagemagick。监听根必须使用本机 NVMe 绝对路径,不要指向 iCloud/网盘同步目录,否则会出现成批重复事件与半写入竞态。
防抖用静默窗口:每次事件刷新计时器,例如连续 12 秒无新事件再启动一轮巡检;配合单飞(示例:flock -n /tmp/atlas-scan.lock …)避免连续 Reimport 把队列塞爆。OpenClaw 侧建议仅放行 Exports、logs、quarantine 三棵子树;用与监听脚本相同的登录账号做一次 curl 健康检查,确认 PATH 里能解析到 magick。若管线里还有「导出后自动打 zip」步骤,把 zip 输出改到监听根之外,或给 fswatch 加 --exclude,防止巡检进程被自己触发的二次写入吵醒。
批处理命令模板
下面两段都是「可复制再改环境变量」的骨架。第一段是一次性扫目录,适合接入 CI 或夜间 cron;第二段演示如何把 fswatch 与静默窗口接到同一条 bash 里。REQUIRE_ALPHA=1 时要求 identify 的 %[channels] 子串含 rgba(若你环境回显 srgba,把判断改成子串匹配即可)。
#!/usr/bin/env bash
set -euo pipefail
ROOT="${ATLAS_EXPORT_ROOT:?}"
MAX_BYTES="${MAX_BYTES:-1200000}"
REQUIRE_ALPHA="${REQUIRE_ALPHA:-1}"
LOG_DIR="${LOG_DIR:-./logs}"
mkdir -p "$LOG_DIR"
is_pot() { local n="$1"; [[ "$n" =~ ^[0-9]+$ ]] && (( (n > 0) && (n & (n-1)) == 0 )); }
while IFS= read -r -d '' f; do
[[ "$f" == *.png ]] || continue
w=$(magick identify -format '%w' "$f")
h=$(magick identify -format '%h' "$f")
ch=$(magick identify -format '%[channels]' "$f")
bytes=$(stat -f%z "$f")
ok=1; reasons=()
is_pot "$w" || { ok=0; reasons+=("pot_w"); }
is_pot "$h" || { ok=0; reasons+=("pot_h"); }
[[ "$REQUIRE_ALPHA" == "1" && "$ch" != *rgba* ]] && { ok=0; reasons+=("alpha"); }
(( bytes <= MAX_BYTES )) || { ok=0; reasons+=("size"); }
printf '{"ts":%s,"file":"%s","w":%s,"h":%s,"channels":"%s","bytes":%s,"ok":%s,"reasons":"%s"}\n' \
"$(date +%s)" "$f" "$w" "$h" "$ch" "$bytes" "$ok" "$(IFS=,; echo "${reasons[*]}")" \
>> "$LOG_DIR/atlas-scan.jsonl"
done < <(find "$ROOT" -type f -name '*.png' -print0)
将上一段保存为 atlas-scan-once.sh 并 chmod +x。下面用 fswatch -o 先把短时间内的多次写入合并成一行,再 sleep 做二次静默,最后用 flock 做单飞,避免 Reimport 风暴叠跑。
#!/usr/bin/env bash
set -euo pipefail
ROOT="${ATLAS_EXPORT_ROOT:?}"
QUIET_SEC="${QUIET_SEC:-12}"
# brew install fswatch;监听目录下仅放 .png 成品与可控子目录
fswatch -o -l 2.0 "$ROOT" | while read -r _; do
sleep "$QUIET_SEC"
flock -n /tmp/atlas-pot-scan.lock \
env ATLAS_EXPORT_ROOT="$ROOT" LOG_DIR="${LOG_DIR:-./logs}" \
./atlas-scan-once.sh || true
done
ok=0 的行务必将文件移入 quarantine/YYYYMMDD/,并在 JSONL 里写清 reason_code(上例用 reasons 拼串),避免不合格 PNG 与下一批合格输出混放。阈值表建议按机型档位分栏(手机 1×、平板 2×),与程序加载策略一起评审。
失败重试与日志归档
可重试:仅限短暂 I/O、磁盘尖峰、identify 偶发超时——用指数退避(例如 2s、4s、8s,封顶 60s)并设最大尝试次数。禁止自动重试:POT 不符、通道不符、稳定写入后仍超过 MAX_BYTES,一律进 quarantine,避免空转刷满 CPU。每日将 atlas-scan.jsonl gzip 到 archive/YYYY-MM-DD/;成功批次在摘要行写清文件数、最大字节与耗时,失败行保留完整路径与字段便于审计。夜间任务与游戏 CI 同机时,在 launchd plist 写死 PATH、工作目录与 ATLAS_EXPORT_ROOT,并监控磁盘水位。
排障 FAQ
画面锐利但巡检报 POT 失败:多为导出边长被裁成非 2 的幂;回到 Atlas 最大尺寸与 padding 政策,若业务允许非 POT,把例外写进阈值 YAML 并改闸门,而不是私下改图。同一文件字节数每日漂移:说明压缩或平台覆盖在飘;锁定 Build Target 与 TextureImporter 版本号写进配置。仅半夜失败:查主机睡眠、外接盘卸载与 VPN;把监听根迁到内置 SSD 复测一轮。Gateway 报 401:核对白名单绝对路径与令牌权限;非交互会话打印 which magick 与监听账号是否一致。
fswatch -l 合并间隔略抬高,减少事件风暴。
小结:原子写入、静默窗口加单飞、magick identify 与 stat 双闸门、带 reason_code 的隔离与 JSONL gzip,就能把 SpriteAtlas 纳品风险压在自动化层。租用与计费见站内 购买、定价、说明与帮助(免登录)。