关于 roblox-texture-gen
roblox-texture-gen 是用于 Roblox 项目的脚本化纹理流程,面向需要生成可平铺材质并应用到零件或模型的创作者。它通过外部图像生成、资产上传和 Luau 属性写入来批量处理纹理。
主要功能
- 01生成可平铺图像纹理
- 02将图像上传为 Roblox 资产
- 03通过 Luau 应用纹理
- 04批量处理模型中的多个零件
- 05截图检查渲染结果
适用场景
- 01为游戏零件制作可重复平铺的材质
- 02为模型中的多个 MeshPart 应用同一皮肤
- 03生成纹理变体并在上传前预览
- 04检查上传后的纹理是否正常显示
MCP 相关
该流程使用官方 Roblox Studio MCP 的工具检查 Studio 连接、查找目标实例、上传图像、执行 Luau 和截取画面。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ syphodev-yt/ roblox-ai-skills --skill roblox-texture-gen安装后在 Claude Code 中输入/roblox-texture-gen确认已加载。
附带文件LOCAL.template.mdscripts/generate_texture.py
详细介绍
Roblox 纹理生成器
第一次在这台机器上使用? 请阅读此文件夹中的
LOCAL.md。如果文件不存在,请运行roblox-skills-setup技能(或将LOCAL.template.md复制为LOCAL.md并填写)。LOCAL.md保存了你的路径和工具位置;它属于你个人,绝不会共享。
此技能是一套可脚本化的纹理工作流:使用免费 API 生成可平铺图像,将其上传为图像资产,然后通过代码将其写入目标部件。 它适用于任何部件或网格,并可批量处理整个模型。
官方 Studio MCP 还提供 generate_texture,可根据文本提示词,直接为单个 MeshPart
或 Model 重新生成纹理。若用户需要贴合单个网格形状的纹理,请使用该功能;若需要可平铺材质、贴花、一次处理多个部件,或希望将纹理保存为可复用文件,请使用此工作流。
为什么采用这一流程
- 图像生成完全在 Roblox 之外进行。 Pollinations.ai 是一个免费、无需密钥的图像 API——发送普通 HTTP GET 请求即可返回 PNG。无需 Studio 插件、无需付费套餐,也无需注册(注册是可选的,只会提高速率限制并去除水印)。
- Roblox 只接受已导入的资产,因此生成的图像必须先上传为图像资产,Studio 才能引用它。MCP 的
upload_image就是为此而设。 - 应用纹理只需写入属性,通过
execute_luau完成(针对单个部件,或循环处理模型中的每个部件)。
分步操作
0. 检查 Studio 连接
这些工具来自官方 Roblox Studio MCP(list_roblox_studios、
get_studio_state、search_game_tree、inspect_instance、execute_luau、
upload_image、screen_capture)。如果这些工具处于延迟加载状态,请在一次 ToolSearch
调用中加载它们。调用 list_roblox_studios 获取其他调用所需的 studio_id,然后调用
get_studio_state。如果任一调用失败,请停止并明确告知用户:Studio MCP
未连接,或 Studio 尚未打开。不要编造结果;没有运行中的 Studio 会话,这套工作流就无法执行。
1. 确定要生成的内容
如果以下两项尚不明确,请询问用户(或根据上下文推断):
- 风格——例如“数码迷彩”、“镀金拉丝金属”、“碳纤维编织纹理”、 “历经战火的锈蚀效果”。像“做得酷一点”这样含糊的要求,值得快速追问,因为应用后很难撤销。
- 目标——场景中部件、网格或模型的确切名称(例如
Handle、GunBody、 包含多个部件的整个Model)。生成前请使用search_game_tree或inspect_instance确认名称存在——不要猜部件名称,以免图像生成后才发现名称有误。
自行编写生成提示词:在用户描述的风格后追加 , seamless tileable texture, flat lighting, no watermark, high detail。与仅使用风格词相比,这样生成的内容通常更接近可用的游戏纹理,因为通用提示词往往会生成插画,而非可平铺材质。
2. 生成图像
运行捆绑脚本,而不要自行编写 HTTP 调用——它会处理 URL 编码、在 Pollinations 限速时重试(匿名用户每 15 秒 1 次请求),并验证响应不是伪装成图像的错误页面:
python "<skill_dir>/scripts/generate_texture.py" "camo military texture, seamless tileable texture, flat lighting, no watermark, high detail" ./textures/gun_camo.png --width 1024 --height 1024
将文件保存到 scratch/textures 文件夹,而不要直接放入用户的项目目录,除非用户已告知资产应存放的位置。选择能说明文件内容的名称(如 gun_gold_plated.png,而不是 output.png)——通常需要生成几个版本,才能选出用户满意的一款。
上传到 Roblox 前,先向用户展示生成的图像。 生成图像既快速又免费;资产上传和审核都需要时间,而重新上传被拒绝或用户不喜欢的纹理,会浪费一次 Studio 往返操作。除非用户明确表示要跳过预览并直接应用,否则请先获得用户认可。
3. 上传为图像资源
upload_image 接受图像 URL,而不是文件路径,因此先在 localhost 上提供 textures 文件夹,以便上传,然后停止服务器:
python -m http.server 8765 --bind 127.0.0.1 --directory ./textures
upload_image(imagePaths=["http://localhost:8765/gun_camo.png"], studio_id=...)
它会返回一个从 URL 到 rbxassetid://<id> 的映射。(没有 Studio?roblox-3d-model
技能中的 upload_asset.py 会通过 Open Cloud 使用你自己的
ROBLOX_API_KEY 上传图像。)上传的资源需要经过审核,因此可能要等一段时间才会显示;刚上传的图像有时会显示为灰色,即使属性设置正确也是如此。如果上传后立即调用 screen_capture,看到灰色或缺失的纹理,很可能就是这个原因;请告知用户,而不要认定整个流程失败。
4. 应用到目标对象
对于带有 Texture/Decal 子级的单个部件,或具有纹理属性的 MeshPart:
workspace:FindFirstChild("<target>", true).TextureID = "rbxassetid://<id>"
对于包含多个带纹理部件的 Model(例如,由多个 MeshPart 组成且都应使用同一皮肤的枪械),在一次 execute_luau 调用中遍历其所有后代:
local model = game.Workspace:FindFirstChild("GunModel", true)
for _, part in ipairs(model:GetDescendants()) do
if part:IsA("MeshPart") then
part.TextureID = "rbxassetid://<id>"
end
end
如果不确定目标对象是否公开了 TextureID、Texture 或 SurfaceAppearance 子级,请先使用 inspect_instance 检查(带有 PBR 材质的 SurfaceAppearance/MeshPart 与普通 Decal 的连接方式不同)。设置错误的属性不会有任何提示,只会不起作用,因此多检查一步是值得的。
5. 验证
在告知用户已完成之前,先调用 screen_capture 并检查结果。属性写入成功,并不意味着纹理已正确渲染——UV 映射不匹配、审核延迟或属性目标错误,都可能导致网格看起来毫无变化或显示异常,即使每次工具调用都返回成功。
调整样式
如果用户想要不同的变化(“做旧一些”“少点反光”),请用调整后的提示词重新生成,而不是尝试编辑现有图像——在这个流程中,Pollinations 没有编辑/局部重绘端点,只有文生图。对于同一概念的不同版本,如果希望它们风格相近,请在各次尝试中保持 --seed 不变;如果想要截然不同的方向,则省略或更改它。
此技能不负责的内容
- 它不能替代 Roblox 自带的网格感知纹理功能(MCP 的
generate_texture,或 Studio 中的 Texture Generator)。这类功能会根据几何形状进行处理,因此能为复杂网格生成更贴合 UV 的结果。此流程的优势在于可脚本化、可平铺和可批量处理,而不是质量更高。 - 它不负责管理 Roblox 资源审核——上传的资源可能被拒绝(例如违反内容政策),这不在此技能的控制范围内。如果
upload_image报告资源被拒绝,请将情况转告用户,而不要盲目重试。