一套代码发布到十几个平台:Cocos入门速览
绿泡泡、抖某音小游戏一份工程都能出包。摘要Cocos Creator 是一款开源的 2D/3D 游戏引擎用 TypeScript 写逻辑一次开发可发布到手机、桌面、网页和各家小游戏平台。本文从安装讲到脚本、资源、打包再到性能与版本选择。它是什么先理清一条脉络不然看资料容易搞混Cocos2d-x2010 年发布的 C 老引擎官方手册写明 2019 年已停止更新。Cocos Creator 2.x2018 年发布底层沿用 Cocos2d-x2023 年停止更新。Cocos Creator 3.x完全放弃 Cocos2d-x 底层换成全新的跨平台 3D 内核与 2.x 的 API 并不完全兼容。2026 年 1 月官方又推出了 COCOS 4引擎与新编辑器 PinK 拆分但其小游戏平台支持仍在陆续补齐所以目标是小游戏的新项目目前仍建议选 3.8 系列。引擎本体在 GitHub 上以 MIT 协议开源底层与渲染用 C面向开发者的 API 是 TypeScript编辑器基于 ElectronWindows 和 macOS 都能用。核心优势1. 发布目标多而且覆盖国内入口。官方手册列出的发布目标包括原生iOS、Android、Windows、macOS、华为鸿蒙、Google Play 等网页Web MobileH5与 Web Desktop小游戏绿泡泡小游戏、抖某音小游戏、OPPO、vivo、荣耀、华为快游戏以及海外社交平台的 Instant Games另外官方文档侧边栏里还能看到电商、支付和搜索类 App 的小游戏入口。OPPO、vivo、荣耀、华为的快游戏渠道都有对应的构建选项这是它在国内生态里的实际价值同一份工程切换构建目标就能出对应平台的包各渠道的适配和审核仍要单独处理。2. 2D 和 3D 都能做。同一个编辑器里动画、物理、粒子、UI、地形编辑和即时预览都是内置的Spine、DragonBones、TiledMap、Box2D 也有现成支持。3D 方面提供可扩展的前向与延迟渲染管线以及基于物理的材质与光照。3. 脚本语言友好。JavaScript 和 TypeScript 可以混用组件化写法和 Unity、Godot 思路相近有前端或这类引擎经验的人上手较快。4. 对小游戏的包体很上心。3.8.5 起支持 WASM 模块延迟加载Spine 模块体积比 3.8.4 缩小约 40%3.8.6 继续优化包体和性能。小游戏有主包大小限制这类改动直接决定能不能上线。面向人群想做小游戏、轻量手游的个人和小团队有 TypeScript 或前端基础想转游戏开发的人需要一次开发、多渠道分发的项目做过 Godot、Unity想了解国内常用方案的人如果你要做大型 3A 级 3D 项目或需要非常深的主机平台支持Cocos 不是首选。快速上手安装从官网下载 Cocos Dashboard在里面安装 Creator 3.8 系列的编辑器版本再新建项目模板选 2D 或 3D 空项目。认识四个核心概念场景Scene一个关卡或一个界面节点Node场景里的一切对象组件Component挂在节点上的功能脚本也是组件资源Asset图片、音频、预制体等写第一个脚本在资源管理器里新建 TypeScript 脚本拖到节点上。import{_decorator,Component}fromcc;const{ccclass,property}_decorator;ccclass(Mover)exportclassMoverextendsComponent{propertyspeed100;start(){// 第一帧更新之前执行}update(dt:number){constpthis.node.position;this.node.setPosition(p.xthis.speed*dt,p.y,p.z);}}property声明的变量会出现在属性检查器里策划不改代码也能调数值。onLoad、start、update是最常用的三个生命周期回调update的参数是上一帧耗时移动要乘上它才不会因为帧率不同而快慢不一。预览点编辑器顶部的预览按钮直接在浏览器或模拟器里跑。用法详解做一个打飞机小游戏下面用「打飞机」这个小游戏当线索把常用功能一个个串起来。每个案例都是独立的组件挂到对应节点上即可。案例一键盘与触摸控制玩家输入统一走input。在onEnable里注册onDisable里取消参数必须和注册时一致否则取消不掉节点销毁后还会收到回调。import{_decorator,Component,input,Input,EventKeyboard,EventTouch,KeyCode}fromcc;const{ccclass}_decorator;ccclass(PlayerInput)exportclassPlayerInputextendsComponent{onEnable(){input.on(Input.EventType.KEY_DOWN,this.onKeyDown,this);input.on(Input.EventType.TOUCH_MOVE,this.onTouchMove,this);}onDisable(){input.off(Input.EventType.KEY_DOWN,this.onKeyDown,this);input.off(Input.EventType.TOUCH_MOVE,this.onTouchMove,this);}onKeyDown(e:EventKeyboard){if(e.keyCodeKeyCode.KEY_A){/* 向左 */}if(e.keyCodeKeyCode.KEY_D){/* 向右 */}}onTouchMove(e:EventTouch){// 手指位置用 UI 坐标可以直接对应界面上的位置constpose.getUILocation();console.log(pos.x,pos.y);}}做小游戏时以触摸为主键盘只是方便在电脑上调试。案例二用缓动做动画不用写 update按钮缩放、飘字、移动这类一次性动画用缓动tween比自己在update里算更省事import{tween,Vec3}fromcc;// 受击时放大再复原然后执行回调tween(this.node).to(0.1,{scale:newVec3(1.2,1.2,1)}).to(0.1,{scale:newVec3(1,1,1)}).call(()console.log(动画结束)).start();to是变到目标值by是在当前值上增加还可以用sequence串联、repeat重复、union合并成一个整体并通过easing: backIn这类参数设置缓动曲线。案例三预制体发射子弹加对象池子弹要反复创建和销毁直接instantiate再destroy会产生垃圾回收压力。做法是把子弹做成预制体用NodePool回收复用import{_decorator,Component,Node,Prefab,NodePool,instantiate}fromcc;const{ccclass,property}_decorator;ccclass(Shooter)exportclassShooterextendsComponent{property(Prefab)bulletPrefab:Prefabnull!;property(Node)bulletRoot:Nodenull!;// 子弹挂在这个节点下privatepoolnewNodePool();shoot(){// 池里有就取没有再新建constbulletthis.pool.size()0?this.pool.get()!:instantiate(this.bulletPrefab);bullet.setParent(this.bulletRoot);bullet.setPosition(this.node.position);}recycle(bullet:Node){// 出屏或命中后回收而不是 destroythis.pool.put(bullet);}}property(Prefab)和property(Node)会在属性检查器里出现一个拖拽框把预制体和节点拖进去就绑定好了不用写路径字符串。案例四2D 碰撞与计分给子弹和敌机都加上 2D 碰撞体子弹带刚体就能在回调里处理命中import{_decorator,Component,Collider2D,Contact2DType,IPhysics2DContact}fromcc;const{ccclass}_decorator;ccclass(Enemy)exportclassEnemyextendsComponent{start(){constcolliderthis.getComponent(Collider2D);if(collider){collider.on(Contact2DType.BEGIN_CONTACT,this.onBeginContact,this);}}onBeginContact(self:Collider2D,other:Collider2D,contact:IPhysics2DContact|null){// 两个碰撞体开始接触时调用一次console.log(命中,other.node.name);// 回调里不要立刻销毁或创建物理对象改成标记下一帧在 update 里处理}}要注意两点用 Box2D 物理模块时需要在刚体的属性检查器里勾选「EnabledContactListener」否则收不到回调在回调里创建的刚体、关节不会立刻生效而是等本次物理更新结束后才创建。回调里拿到的碰撞信息也是缓存不要长期持有需要的话自己拷贝一份。案例五按钮与场景切换主菜单点「开始」进入游戏场景import{_decorator,Component,Button,director}fromcc;const{ccclass,property}_decorator;ccclass(StartButton)exportclassStartButtonextendsComponent{property(Button)startBtn:Buttonnull!;onEnable(){this.startBtn.node.on(Button.EventType.CLICK,this.onStart,this);}onDisable(){this.startBtn.node.off(Button.EventType.CLICK,this.onStart,this);}onStart(){// 参数是场景名场景需要在构建里勾选director.loadScene(game);}}不想写代码也行在编辑器里选中 Button 组件直接给「Click Events」绑定目标节点、组件和方法名效果一样。案例六本地存档最高分、关卡进度、音效开关这类数据用sys.localStorage保存接口和网页的 localStorage 一致在各个发布平台上都有对应实现import{sys}fromcc;constbestNumber(sys.localStorage.getItem(bestScore)??0);if(scorebest){sys.localStorage.setItem(bestScore,String(score));}存的都是字符串数字和对象需要自己转换。需要云端存档的话要使用各渠道自己的接口那部分属于渠道适配。进阶用法资源分包与动态加载小游戏的主包有体积上限做法是把关卡、大图、音频放进 Asset Bundle先在编辑器里把某个文件夹设为 Bundle运行时再按需加载。import{assetManager,Prefab,instantiate,director}fromcc;assetManager.loadBundle(level2,(err,bundle){if(err){console.error(err);return;}bundle.load(prefabs/boss,Prefab,(err2,prefab){if(err2){console.error(err2);return;}constbossinstantiate(prefab);director.getScene()!.addChild(boss);});});加载了就要考虑释放单个资源可以assetManager.releaseAsset(asset)整个 Bundle 的某个路径用bundle.release(path, type)bundle.releaseAll()会释放全部要谨慎使用。资源管理是 Cocos 项目里最容易出问题的地方加载了不释放内存会一路涨。按平台写分支同一份代码里个别能力在不同平台上并不一致比如只有小游戏才有的登录、分享接口。可以用sys.platform判断当前运行环境再走各自的分支其余逻辑保持统一import{sys}fromcc;if(sys.platformsys.Platform.WECHAT_GAME){// 绿泡泡小游戏专属逻辑比如调用渠道的分享接口}else{// 其他平台走通用逻辑}建议把这类分支集中在一个「平台适配层」里业务代码只调用统一接口换渠道时只改这一层。构建发布打开「项目 → 构建发布」快捷键 Ctrl/Cmd Shift B选择平台填好对应平台的参数比如小游戏的 AppID点构建即可。构建产物还要用对应平台的开发者工具预览和上传提前装好。性能与渲染3.8 起部分模块Spine、Bullet 与 PhysX 物理、WebGPU 渲染后端用 wasm 实现。WebGPU 后端对浏览器和设备要求较高社区论坛里有升级后启用 WebGPU 导致无法运行的反馈所以这一项在上线前一定要实机测试。原生平台在 iOS、Android 和鸿蒙上走的是 C 原生运行时需要对应的 Xcode、Android Studio 或 DevEco 环境。3.8.5 起已适配华为 HarmonyOS Next。几个常见的坑版本别混用。2.x 和 3.x 的 API 不兼容网上很多老教程是 2.x 的抄代码前先看版本。小游戏先看包体。先用空项目构建一次量出基础包体再决定怎么分包。各平台要分别实测。同一份代码在不同渠道的表现并不完全一致渠道的审核和接口也各有差异。结尾速查清单做小游戏先选 3.8 系列TypeScript 写逻辑关注 COCOS 4 的小游戏支持进度场景 → 节点 → 组件脚本就是组件先量包体再分包每个发布平台都实机测一遍输入用 input动画用 tween重复对象用预制体加对象池回调里别直接改物理对象资源加载了就要想好怎么释放之前聊过 Godot你会把下一个项目押在 Godot 还是 Cocos

相关新闻

第28讲:单链表的应用

第28讲:单链表的应用

目录 单链表经典算法OJ题目 单链表相关经典算法OJ题1:移除链表元素单链表相关经典算法OJ题2:反转链表单链表相关经典算法OJ题3:合并两个有序链表单链表相关经典算法OJ题4:链表的中间结点循环链表经典应用-环形链表的约瑟夫问题单…

2026/10/15 15:32:19 阅读更多 →
ClaudeAnimationBase工作流四步法:从分镜脚本到MP4成片,AI如何用Contact Sheet自查动画

ClaudeAnimationBase工作流四步法:从分镜脚本到MP4成片,AI如何用Contact Sheet自查动画

【免费下载链接】ClaudeAnimationBase A starter kit for animating hand-painted cartoons with Claude: p5.js p5.brush, the Clawd character, 31 acted emotions and a guide for the model 项目地址: https://gitcode.com/gh_mirrors/cl/ClaudeAnimationBase …

2026/10/15 15:31:18 阅读更多 →
OAuth2与OIDC核心概念详解:授权码流程、Token类型与实战

OAuth2与OIDC核心概念详解:授权码流程、Token类型与实战

做后端这些年,我一直把第三方登录当成“一杯奶茶的事”——调接口、拿资料、建账号,看起来三分钟就能搞定。直到有个项目要求严格区分“这是第三方用户”和“这是本平台用户”,我才发现自己把 OAuth2 和 OpenID 混着用已经很长时间了。所以有…

2026/10/15 15:31:18 阅读更多 →

最新新闻

2026 大模型 API 免费额度汇总:DeepSeek、Qwen、Claude 等怎么免费调用

2026 大模型 API 免费额度汇总:DeepSeek、Qwen、Claude 等怎么免费调用

刚开始接触大模型 API 时,很多人都会先找“免费 API”。 这很正常。无论是学习 API 调用、测试 Agent,还是给自己的小项目接一个模型,前期其实没必要一上来就投入太多成本。 但真正找一圈后会发现,“免费 API”并不是一种固定模式…

2026/10/15 16:18:46 阅读更多 →
非加密Altera IPCORE VHDL源码拆解与二次开发实战

非加密Altera IPCORE VHDL源码拆解与二次开发实战

简介:这份资源是Altera最新IPCORE的非加密VHDL源代码包,面向FPGA开发者、电子工程专业学生及从事数字系统设计的工程师,尤其适合希望深入理解IP核内部实现、进行教学研究或定制化开发的读者。压缩包共14个文件,以11个vhd源码文件为…

2026/10/15 16:18:46 阅读更多 →
毕业设计避坑指南:书店管理系统从架构设计到部署上线全流程

毕业设计避坑指南:书店管理系统从架构设计到部署上线全流程

做毕业设计选课题的时候,很多同学都会遇到一个尴尬的处境:想选一个不太难、又能体现工作量、还能顺利通过答辩的题目,最后发现“书店管理系统”这类传统信息管理项目仍然是最稳妥的选择。原因很简单,这类系统功能边界清楚、业务流…

2026/10/15 16:18:46 阅读更多 →
流固耦合仿真从理论到实操:双向耦合、迭代控制与工程落地

流固耦合仿真从理论到实操:双向耦合、迭代控制与工程落地

流固耦合这个话题,我接触得越久越觉得它有意思。很多做仿真的人一听“流固耦合”四个字就发怵,总觉得比单纯做结构或者单纯做流体难太多。确实难,但难的并不是流体力学或者固体力学本身,而是它们被强行放进同一个计算框架时&#…

2026/10/15 16:18:46 阅读更多 →
Fyyur项目拆解:Flask+SQLAlchemy数据建模与增删改查实战

Fyyur项目拆解:Flask+SQLAlchemy数据建模与增删改查实战

简介:这是Fyyur项目完整代码包,源自优达学城全栈开发课程;Fyyur是一个音乐表演场地与艺术家预定平台,用于发现和预订本地演出。资源面向已经掌握Python基础、希望实践Flask与PostgreSQL集成开发的学习者;当前代码框架已…

2026/10/15 16:18:46 阅读更多 →
小恶意代码识别器(5)

小恶意代码识别器(5)

AI 给的代码不能全信:一次真实的取舍 这份作业最有意思的地方,是它明确把"和大模型协作"当成考核内容,其中一项要求是学生要设计有约束的提示词,理解 AI 给的候选代码,发现并修正至少一项问题。也就是说&…

2026/10/15 16:17:45 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →