dwgx@blog:~$dwgx
> cd ../posts

整目录 VRChat avatar 一条命令全传上去

// created

VRC-Auto-Uploader 是个 VRChat avatar 批量上传工具, 一条命令把整个目录里的模型全传上去。传统流程传一个就要开 Unity、建工程、装 SDK、导包、找 Prefab、清 Blueprint ID、点一堆弹窗, 一个十几分钟, 几十个就是一下午。这工具把这套机械劳动全自动化掉。

架构是 Python 主控加一段注入 Unity 的 C#。一开始想用 -batchmode -nographics 无头跑, 但撞墙了: VRChat 上传靠 VRCSdkControlPanel.TryGetBuilder(), 这东西依赖 Unity Editor 的 GUI 初始化, 无头模式下 Builder 根本不注册。所以只能用 GUI 模式启动, 但全程自动人不碰鼠标。Python 扫目录、解压、建干净临时工程、装 SDK 和 lilToon, 然后拉起 Unity 实时读日志; Unity 这边 [InitializeOnLoad] 一启动就接管, 开 SDK 面板、导 unitypackage、找 Prefab、清 Blueprint ID, 最后 BuildAndUpload()。两边靠一个 JSON 结果文件通信。

费劲的不是上传, 是那些边角。别人给的模型带原作者 Blueprint ID, 直接传会报“无法覆盖他人 Avatar”, 每个都得先清掉。圈里模型十有八九用 lilToon, 不装 shader 进去全粉红, 所以临时工程自动把 lilToon、Modular Avatar 一并装上。SDK 还狂弹版权声明和更新提示, 人工点没事, 自动化直接卡死, 专门写了个 PopupSuppressor 自动关掉。工程每次开独立临时的, 传完即弃, 免得互相污染。解压顺手支持 .zip/.rar/.7z, 自动扒里面的 unitypackage, 纯 shader 包过滤掉。

用起来先跑 python main.py setup, 自动探测 Unity 装在哪、下载 vrc-get。第一次上传要亲手登录一次 VRChat SDK 账号, SDK 不给你在代码里塞账号密码的口子, 登完 session 持久化, 后面不用管。

# 只解压不传 先看目录里有啥
python main.py extract --dir "D:\Model"

# 确认没问题 整目录批量传
python main.py batch --dir "D:\Model" -y

结果落在 upload_results.json, 带每个模型的 blueprintId 和成败状态。环境钉死 Unity 2022.3.22f1, VRChat 官方指定版本, 别的版本 SDK 容易出幺蛾子。这工具是给我自己管有版权的模型用的, 谁用谁负责, 别传不属于你的东西。思路参考了 VRCMultiUploader。代码在 github.com/dwgx/VRC-Auto-Uploader