从‘Hello World’到第一个可玩Demo:我的Cocos Creator + TypeScript游戏开发踩坑实录
第一次打开Cocos Creator时,我盯着那个闪烁的光标发呆了五分钟——作为一个连JavaScript都写不利索的菜鸟,TypeScript和游戏引擎的组合像是一道加密谜题。但三周后,当我的像素小人成功跳起来接住第一个金币时,那种成就感让我彻底理解了为什么那么多人沉迷游戏开发。这篇记录不是标准教程,而是一个真实菜鸟的生存日记,里面全是官方文档不会告诉你的"惊喜时刻"。
1. 开发环境:从安装到第一个报错
1.1 软件安装的连环坑
我天真地以为下载安装包点击"下一步"就能搞定一切,结果发现第一个陷阱藏在版本匹配里:
- Cocos Creator 3.7.2:官网默认下载的最新版,后来发现社区插件对3.8+支持不完善
- VS Code 1.82:必须安装ES7+ React/Redux/React-Native snippets扩展
- Node.js 16.14.2:18.x版本会导致Cocos编译时报错
Cannot find module 'fs/promises'
提示:先用
node -v检查版本,如果显示18.x,需要到Node官网下载16.x的MSI安装包覆盖
安装完打开Cocos Creator,那个全英文界面让我瞬间慌了。在偏好设置里翻了十分钟才找到语言选项——原来要点击左上角菜单栏的Cocos Creator > Preferences > General > Language。
1.2 创建项目的隐藏选项
点击"新建项目"时,我直接选择了默认的"Empty Project",结果后面要自己配置所有资源。后来发现Hello World模板才是真新手之友,它包含:
- 预制好的主场景Camera配置
- 已经挂载的Canvas节点
- 带有点击事件示例的Button组件
// Hello World模板自带的示例代码 @ccclass('HelloWorld') export class HelloWorld extends Component { start() { console.log('Hello World'); } }2. TypeScript:从编译错误到智能提示
2.1 令人崩溃的红色波浪线
当我兴奋地写下第一行console.log("I'm a game dev!")时,VS Code用满屏红色波浪线欢迎我:
- 找不到ccclass装饰器:需要安装
@types/cocos-creatornpm install @types/cocos-creator --save-dev - Component报错:要在tsconfig.json中添加:
{ "compilerOptions": { "types": ["cc"] } } - 智能提示失效:需要在VS Code设置中开启
TypeScript: Disable Automatic Type Acquisition
2.2 真正实用的TS技巧
经过两天折磨后,我总结出这些救命技巧:
- 类型断言:处理动态资源加载时必备
const spriteFrame = resources.get('textures/player') as SpriteFrame; - 接口定义:给游戏数据加上类型约束
interface PlayerData { hp: number; speed: number; skills: string[]; } - 泛型组件:复用UI逻辑的神器
class ProgressBar<T extends Component> extends Component { @property(T) targetComponent: T = null; }
3. 第一个交互:按钮与角色跳跃
3.1 点击事件的三重陷阱
给开始按钮添加点击事件时,我经历了:
- 找不到节点:必须先在场景中选中按钮,然后在属性检查器添加事件
- 方法未导出:回调方法必须用
public修饰 - 参数传递错误:事件数据要通过
Event.EventCustom传递
// 正确的事件处理示例 @ccclass('StartButton') export class StartButton extends Component { @property(Label) tipLabel: Label = null; public onClick(event: Event, customData: string) { this.tipLabel.string = customData; } }3.2 物理跳跃的实现细节
让角色跳起来看似简单,实际要考虑:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 重力 | -1200 | 2D游戏通常需要比真实物理更大的值 |
| 跳跃力 | 800 | 根据角色大小调整 |
| 地面检测距离 | 0.1 | 防止空中连跳 |
// 跳跃核心代码 update() { if (this.isGrounded() && inputSystem.isKeyDown(KeyCode.SPACE)) { this.rigidBody.linearVelocity = new Vec2(0, 800); } } private isGrounded(): boolean { return PhysicsSystem.instance.raycast( this.node.position, new Vec2(0, -1), 0.1 ); }4. 资源管理:从崩溃到优雅加载
4.1 路径问题的血泪史
我的第一个游戏崩溃在resources.load,因为:
- 把图片直接放在
assets根目录(必须放在resources子文件夹) - 使用了中文文件名(导致iOS平台加载失败)
- 忘记设置纹理压缩格式(移动端内存爆炸)
注意:所有需要通过代码加载的资源,必须放在
assets/resources目录下
4.2 推荐资源结构
经过多次重构后,我的资源目录变成:
assets/ └── resources/ ├── textures/ │ ├── characters/ │ └── ui/ ├── sounds/ ├── prefabs/ └── data/ └── levels.json加载时使用类型化的方式:
const res = await new Promise<[SpriteFrame, AudioClip]>((resolve, reject) => { resources.loadDir('textures/characters', SpriteFrame, (err, assets) => { if (err) return reject(err); resolve(assets); }); });5. 调试技巧:从console.log到专业工具
5.1 编辑器内调试
Cocos Creator自带的调试工具比我想象的强大:
- 属性快照:右键节点选择"Debug"可以冻结当前状态
- 实时修改:在控制台直接修改组件属性值
- 性能分析:
Ctrl+Shift+P打开性能面板
5.2 VS Code调试配置
在.vscode/launch.json中添加:
{ "version": "0.2.0", "configurations": [ { "type": "chrome", "request": "launch", "name": "Debug Cocos", "url": "http://localhost:7456", "webRoot": "${workspaceFolder}/assets" } ] }这样可以直接在VS Code中打断点调试,比console.log高效十倍。
6. 打包发布:最后的暗礁
当我觉得大功告成时,打包过程又给我上了一课:
- Web Mobile黑屏:因为没设置
Canvas Resolution Policy - Android闪退:忘记在
build/android/proguard-rules.pro添加保留规则 - 微信小游戏白屏:需要手动压缩纹理到512x512以下
# 关键打包命令 npm run build -- --platform web-mobile --output "./dist"现在我的抽屉里还躺着三个打包失败的APK,它们提醒我:游戏开发的最后一步,往往比第一步更难。但当你终于看到自己的作品跑在手机上,那种感觉——就像第一次让角色跳起来时一样,值得所有踩过的坑。