返回 导航

Python / AI

hangge.com

Godot - 使用AI+MCP开发游戏教程3(替换贴图)

作者:hangge | 2026-11-06 08:52
    在前两篇文章中,我分别用 godot-mcp 和 godot-ai 两套 MCP 方案,让 AI 从零搭出了一个能玩的竖版打飞机游戏。但它现在还是个"白块演习":所有单位用的都是引擎自带的占位外观,玩家和敌机是同一个 icon.svg 靠染色区分,子弹则是 ColorRect 画出来的纯色小方块。 本文我将演示如何进行贴图替换:先从免费素材站挑一套飞船贴图,再让 AI 把各个场景里的占位外观换成正式的 Sprite2D 贴图,同步校准碰撞体与子弹发射点,最后补上一层可滚动的星空背景,让静止的画面真正"飞"起来。整个过程我们依然不写一行代码,只负责准备素材、用中文描述需求。 

一、获取素材

1,从 Kenny 上获取免费素材

(1)做游戏最怕的不是写代码,而是"没美术"。好在 Kenney 把这个问题解决了:他在 kenney.nl 上发布了 40000+ 个游戏素材,全部采用 CC0(公有领域)协议——可以商用、不需要署名,甚至不需要说声谢谢,直接下载直接用。

(2)这里我们采用 kenney.nl 上提供的 Space Shooter Remastered 这个太空射击包(点击访问),这里面包含了飞船、敌机、UFO、子弹、粒子点、星空背景等各种 png 资源。

(3)本文需要的是 6 张贴图加 1 张背景:玩家飞机、普通敌机、炮台敌机、Boss、玩家子弹、敌方子弹,外加一张星空背景。素材包里 PNG 自带透明通道(透明背景),不需要二次处理,直接挑出来就能用。
提示:文件名建议统一用小写字母加下划线(如 player_ship.png),不要带空格和中文。这样 AI 引用路径时不容易出错,导出到其他平台也不会踩大小写的坑。

2,其它素材网站推荐

(1)OpenGameArt:https://opengameart.org,下载前留意授权协议,优先选 CC0 / CC-BY,避开 GPL 这类会"传染"的协议 
(2)itch.io 素材区:https://itch.io/game-assets/free,筛选 Free 分类后同样注意看 License 说明 
(3)AI 生图工具:即梦 AI、通义万相、DALL-E 等,描述"像素风 太空飞船 纯色背景"生成后抠图即可,适合补充素材站没有的特殊造型

二、准备工作

1,项目准备

    首先我们需要按前两篇文章完成基础的打飞机项目,并且 AI 客户端能正常调用 Godot 的 MCP 工具。使用 godot-mcp 还是 godot-ai 方案,大家根据喜好任选其一即可:


2,整理素材目录与命名

(1)在项目根目录新建 assets/textures 目录(音频目录 assets/sounds 下一篇再用),把挑好的贴图复制进去。目录规划如下:
space-shooter/
├── assets/
│   ├── textures/                # 本篇使用:图片素材
│   │   ├── player_ship.png      # 玩家飞机
│   │   ├── enemy_small.png      # 普通敌机
│   │   ├── enemy_turret.png     # 炮台敌机
│   │   ├── boss_ship.png        # Boss 母舰
│   │   ├── bullet_player.png    # 玩家子弹
│   │   ├── bullet_enemy.png     # 敌方子弹
│   │   └── stars_bg.png         # 星空背景
│   └── sounds/                  # 下一篇:音效
├── scenes/                      # 原有场景目录
└── scripts/                     # 原有脚本目录

(2)打开 Godot 编辑器,文件系统(FileSystem)面板会自动扫描新文件,然后生成对应的 .import 元数据并导入

(3)要注意的是,Godot 默认使用 Linear 线性过滤来平滑纹理,像素风素材放大后会发虚、发糊。如果整个项目都用像素素材,去「项目 → 项目设置 → 渲染 → 纹理(Rendering → Textures)」,把 Canvas Textures 的 Default Texture Filter 改为 Nearest(需要先打开右上角的「高级设置」开关才能看到)。
提示:如果只有个别贴图是像素风,不必改全局设置,单独在节点检查器里把 CanvasItem 的 Texture Filter 改成 Nearest 即可;高清非像素素材(比如 AI 生图出来的图)保持默认的 Linear 就好。

三、替换贴图实操

1,替换玩家飞机贴图

(1)在项目目录启动 AI 客户端,把第一段需求发过去:
帮我美化游戏:打开玩家场景 res://scenes/player.tscn,把 Player 下的占位外观
换成正式贴图 res://assets/textures/player_ship.png;
贴图是 112×75 的,请根据飞机在游戏里的大小把 scale 调到合适值
(比原来的碰撞体略大一点、看起来协调就行);
把 modulate 恢复为默认白色;完成后保存场景。

(2)待 AI 执行完毕后,跑一下游戏。可以看到玩家飞机已经从方块变成了正经的太空战机:

2,批量替换敌机、Boss 与子弹

(1)玩家飞机换好之后,剩下的单位可以让 AI 一口气全部处理,我们在一条消息里把需求说清楚:
继续替换其他单位的贴图,要求和玩家飞机一致(modulate 恢复白色、
尺寸自适应、保留原来的旋转朝向):
1)enemy_normal.tscn 的 Sprite2D 换成 enemy_small.png;
2)enemy_turret.tscn 换成 enemy_turret.png;
3)boss.tscn 换成 boss_ship.png,Boss 体型大,scale 自己把握;
4)bullet.tscn 和 enemy_bullet.tscn 里现在是用 ColorRect 画的色块,
   请把 ColorRect 删除、换成 Sprite2D 并使用 bullet_player.png /
   bullet_enemy.png,保持原有的碰撞体尺寸。
全部完成后保存所有场景,并列出「节点 → 贴图」对照表给我检查。

(2)待 AI 执行完毕后,跑一下游戏。可以看到敌方单位、子弹也替换为我们提供的贴图素材了。

3,碰撞体与贴图尺寸对齐

(1)换完贴图最容易暴露的问题,就是"贴图很大、碰撞体还是旧色块大小"(或者反过来"贴图很小、碰撞体很大")。所以需求里要明确让 AI 同步校准:
贴图替换完成后,请把各场景里 CollisionShape2D 的碰撞体尺寸调整到与
贴图实际显示大小匹配;碰撞框比贴图轮廓略小一圈;
玩家移动边界、子弹发射位置也按新贴图尺寸重新校准,
不要再用写死的偏移量。

(2)碰撞框宁可偏小也不要偏大:偏小顶多是"擦边而过",偏大则会让玩家觉得"明明没碰到却被撞死"。选中 CollisionShape2D 节点后,编辑器会用蓝色虚线画出碰撞范围,覆盖住飞机轮廓的八成就很合适。

(3)发射点也是同一个道理:原来子弹从"色块上方固定 24 像素"处飞出,贴图变大后这个硬编码的偏移就不准了。让 AI 改成按贴图尺寸动态计算(一句"发射位置按贴图大小自动适配"即可),以后换贴图也不用再改代码。

4,使用滚动星空图片让背景动起来

(1)贴图都换完之后,还有一处一眼就能看出的"廉价感":背景是纯色的。纵版射击游戏的灵魂之一,就是不断向下滚动的星空——它能让移动的飞机产生"正在高速飞行"的错觉。
  • 做法很简单:用两张星空贴图上下首尾相接,一起匀速向下移动,任意一张完全滚出屏幕后就把它搬回另一张的上方,形成无限循环。这样只需要两张图,却能营造出无穷无尽的星空。

(2)老规矩,把需求描述清楚就好:
给游戏加滚动星空背景:用 assets/textures/stars_bg.png 铺满 600x800 视口、
放在最底层(z_index = -10),用两个 Sprite2D 上下拼接成一张 2 倍屏高的长卷,
匀速向下滚动,滚出屏幕后无缝回到顶部循环。

(3)AI 便会生成的主场景滚动脚本核心逻辑:两张背景首尾相接,任何一张完全滚出屏幕就搬回最上方。

附:让 AI 跑一轮验收自检

(1)贴图替换涉及大量资源引用,正是最容易出"路径写错、资源没导入"问题的地方,而这恰恰是 MCP 闭环最擅长的。最后让 AI 自己跑一遍全量验收:
请对本项目做一轮贴图验收自检,逐项确认并修复问题:
1. 所有角色场景都是 Sprite2D + 正确贴图,无一残留 ColorRect 或 icon.svg;
2. 所有碰撞体尺寸与贴图实际显示大小匹配;
3. 敌机、Boss 朝向正确(向下),子弹发射点位置正确;
4. 用 MCP 工具运行游戏抓取输出,无资源加载失败、无 ERROR / WARNING;
5. 检查完把每项"通过 / 已修复"的结论列给我。

(2)用 godot-mcp 时,AI 会调用 run_project 启动游戏、get_debug_output 抓取输出,一旦发现 Failed loading resource 就回头查文件名、改引用,直到输出干净为止;用 godot-ai 时,它会直接对场景截图自查,"看"到的画面比日志更直观。
评论

全部评论(0)

回到顶部