Cocos Creator v1.5发布:物理集成、2D摄像机、TypeScript
2017.05.23 by cocos
版本更新

在经过1个多月的Beta版发布和社区测试,直至跳票两周之后,我们终于能够发布 Cocos Creator v1.5 正式版了。这个版本又给大家带来了很多实用的新功能。

Cocos Creator 作为第二代编辑器推出之后,逐渐被社区广泛接受,我们在逐步补齐了Cocos Studio的原有功能之后,并不止步于在 Cocos2d-x 框架上修修补补,而是在v1.5里面增加了一些『我们在7年的 Cocos 历史上不曾做到的新功能』。希望大家能看到引擎团队的诚意。

这个v1.5版本最值得关注的功能亮点:

- 集成 Box2D 物理引擎 ,加入刚体和关节组件

- 加入摄像机组件,可以在无损性能的情况下支持高速卷屏

- TypeScript 和 ES6 Class 支持,全面强化 IDE 代码提示

- 优化场景加载流程,场景加载速度提高38%

- 跨项目导出/导入资源,自动关联资源依赖

- 增强 Label 和 EditBox 在 Windows 桌面平台和 Android 平台的使用体验和兼容性

- 热更新支持中断后续传

未标题-1

首先,我在标题里强调了三个功能:物理引擎集成、2D摄像机、TypeScript,这三个功能着重弥补了Cocos Creator 在动作游戏和大型项目开发方面的不足。

其次,我们进一步优化了引擎加载的逻辑,大幅提升了场景加载和解析的速度达38%。另外我们重构了 Windows 桌面和 Android 平台上Label和输入框的实现,大幅增强了使用体验和兼容性。

最后,除了上述新功能和大幅度的改进之外,我们在 Creator 1.5 版本内一共修复了54个大大小小的bug,也能带来体验上的不少提升。

下面我们将详细介绍Cocos Creator v1.5重点功能更新。

集成 Box2D 物理引擎

Cocos Creator 在 1.5 版本中终于集成了知名的物理引擎 [Box2D],这款容易上手功能强大的物理引擎将为 Cocos Creator 带来全面的物理检测和运算能力,全面支持你的动作和物理游戏。

除去通用的物理引擎功能之外,Cocos Creator 集成后的物理系统中还加入了刚体(Rigidbody)和关节(Joint)组件,加上专门为物理引擎定制的碰撞体(Collider)组件,我们仅仅通过在场景中摆放各种不同的物理组件,就可以实现有趣的交互效果了。配合新加入的 Camera 摄像机组件,在编辑器中完成丰富关卡内容的平台动作卷屏游戏将会非常轻松!

physics_scene

摄像机组件

开发动作和冒险类游戏时,视角的移动和场景的卷屏必不可少,之前开发者们只能通过整体移动场景里所有节点来模拟视角移动的效果,但大量节点位移的运算会影响性能,尤其是在加入物理引擎之后,每次移动碰撞体都会导致重新生成和计算物理世界。

而在 1.5 版本中加入的 Camera 组件就能够完美解决视角移动的问题,Camera 组件中可以指定一个或多个节点作为被摄像机渲染的目标,将场景的根节点拖拽到 Camera 的目标列表中,之后移动 Camera 组件所在节点,就可以实现场景卷屏的效果。Camera 的渲染是通过矩阵运算来实现的,因此不会对场景中的运动计算带来额外的开销,可以说是 2D 动作游戏卷屏的完美解决方案!

camera

TypeScript 和 ES6 Class 支持

为了更好的支持各类 IDE(如 VS Code, WebStorm 等)里的游戏脚本代码提示,我们在 1.5 版对 cc.Class 的声明方式进行了一次重构,现在可以在 Cocos Creator 项目里使用 ES6 Class 或 TypeScript 来声明组件和编写游戏逻辑了。

之前很多有静态语言使用经验的用户在上手 Creator 时反馈代码提示和自动完成功能较差,无法准确的提示组件的成员属性和方法,以及引用其他脚本时也无法提示被引用脚本里的成员。这主要是由于编辑器序列化数据需要的特殊声明格式和各大 IDE 能够识别的原生语法不符合。而在这次重构中我们引入了装饰器语法来帮助编辑器进行数据识别,之后我们就可以使用 ES6 和 TypeScript 的标准语法声明 cc.Class 和 cc.Component 了。使用标准语法声明的 cc.Class 所有成员类型都能够被各种主流 IDE 自动识别,加上引擎 API 类型声明文件 creator.d.ts,使得目前 Creator 脚本开发时可以正确提示几乎所有的相关接口代码!

TypeScript 支持强类型声明,对于多人协作开发的大型项目来说,也能够提供更准确的接口通讯规范和错误报告。推荐有相关强类型语言开发经验和大型项目的技术团队尝试!

auto_complete

场景加载速度提升 38%

Web 版游戏的最大优势就是免安装,即开即玩,因此 web 版游戏场景的加载速度,尤其是初始场景的加载速度对于用户体验和留存都至关重要。本次更新在场景资源加载方面进行了大幅优化,使用对象池让原来在 uuid-loader 和 deserialize(反序列化)模块中的对象创建频率大大减少,在本地预览时场景加载速度提升幅度达到 38%。但实际项目中加载速度的瓶颈可能来自网络连接速度,所以实际游戏中的提升幅度可能没这么大,但基本也能有 200ms~300ms 以上提升。

跨项目资源导入/导出共享

在前一个版本中,我们通过扩展插件的系统实现了项目间共享一个资源路径的功能,但还有更多朋友希望我们能够提供一种更简单直接的,跨项目导入导出资源的机制,来实现将已有项目中的资源导入到新项目,或者美术人员和开发人员的项目分开,并通过导出导入来生产和整合美术资源的生产线。

通过主菜单的「文件 -> 导入/导出资源」打开的资源导入导出工具,我们可以轻松的导出场景或 Prefab,选择导出目标后会自动列出该场景和 Prefab 依赖的资源,导出时自动生成 zip 包。在另一个项目中导入该 zip 包即可。如果遇到 uuid 冲突还可以选择自动更新 uuid 以保留两个版本的资源。

export

完整改动列表

编辑器

- [Scripting] 支持 TypeScript 脚本,支持使用 ES6 Class 声明 cc.Class 和组件,全面强化 IDE 里的代码提示功能

- [Editor] 增加导入导出项目资源功能,从主菜单的 `文件` 中可以打开导入导出界面

- [Editor] 属性检查器里预览大尺寸代码文件时只显示一部分,改善浏览大尺寸文件时的编辑器性能

- [Editor] 导入为插件的脚本资源添加选项「在编辑器里加载」,用于标记部分插件脚本在编辑器免加载,来提高场景打开的效率

- [Editor] 为所有项目脚本默认导出所有 CCClass

- [Editor] 自定义引擎路径加载失败时,报错并尝试使用内置引擎

- [Editor] 修复修改场景后退出编辑器,弹出保存提示时无法正确保存场景或取消退出的问题

- [Editor] 在预览服务器增加 `update-db` 接口,通过预览网页或外部命令访问此接口就可以在不激活编辑器窗口的情况下编译脚本和更新资源。

- [Editor] 修复 Color 的 alpha 为 0 时会被反序列成 255 的问题

- [Editor] 修复首次保存场景时取消保存文件时会报错的问题

- [Assets] 修复 sub-meta 导入失败时并没有显示报错信息的问题

- [Assets] 在资源的右键菜单增加「打开 Library 中的资源」选项

- [Assets] 修复创建 Prefab 时可能出现 `TypeError: s.canAddChild is not a function at assets-tree._onDropAreaMove` 的错误

- [Build] 修复使用 binary 模板构建和编译 window 和 android 平台时可能出现的编译失败错误

- [Build] 原生平台打包时,会把 Atlas 里的 spriteFrame 资源合并成一个 json

- [Build] 修复使用 binary 或 link 模板编译 android 工程会有 warning 的问题

- [Build] 修复命令行构建时,如果预览网页没有关掉的话会报错的问题

- [Build] 修复有些情况下构建时选择 `内联所有 SpriteFrame` 后构建文件数量增多的问题

- [Build] 支持使用 Android Studio 2.3+ 和 Build Tools 25 构建安卓项目

- [Build] 修复 windows 上 AutoAtlas 没有正确生成 spriteFrame 信息到 `settings.js` 的问题

- [Build] 在插件中可注册构建和编译完成时的回调

- [Build] 修复构建 Android Studio 工程时 `local.properties` 里 ndk.dir 字段名不正确的问题

- [Build] 支持使用 Visual Studio 2017 构建原生工程

- [Prefab] 在 Prefab 资源上也增加资源延迟加载选项

- [Prefab] 修复自动同步 prefab 引用了其他 prefab 资源时,保存场景时报错的问题

- [AutoAtlas] 修复在 assets 目录下创建 AutoAtlas 后,resources 里的 spriteframe 信息没有被添加到 settings.js 中的问题

- [ProjectSettings] 修复更新分组后,节点属性面板无法及时更新的问题

- [ProjectSettings] 修复项目设置中模拟器横竖屏设置无效的问题

- [Preferences] 修复偏好设置->原生开发环境,未指定 javascript 或 cocos2d-x 引擎路径时仍可保存设置的问题。

- [Preview] 更换了 web 平台预览时 FPS 显示的方式,增加更多调试信息

引擎

- [Render] 将 `cc.macro.FIX_ARTIFACTS_BY_STRECHING_TEXEL` 改回 0 来修复贴图周围像素会被切掉的问题,但这个修改会导致 tiledmap 在缩放和平移时可能产生黑边,需要在生成 tiledmap 贴图时对每个格子进行一像素的拓边(如果使用 shoebox 生成贴图,需要将 extrude 设为 1,padding 设为 2)

- [Engine] 优化了 web 平台加载引擎时的反序列化和下载资源操作,本地预览时场景加载速度提升 38% (远程加载资源时仍需考虑连接速度的瓶颈,实际提升可能低于这个数字)

- [Engine] CCClass 里的 editor 字段添加 executionOrder 字段用于控制脚本执行顺序

- [Engine] cc.loader.loadResAll 已更名为 loadResDir,增加 loadResArray 接口,用于传入相同类型的资源 url 数组

- [Engine] 在 iOS 设备上开启了多点同时触摸事件的支持,现在可以正确使用双指缩放等手势功能了

- [Engine] 修复 EventHandler 组件里的 customEventData 在脚本中赋值为 0 无效的问题

- [Engine] 修复 Sprite 组件激活前 capInsets 设置无效的问题

- [Engine] 修复原生平台使用相对路径加载 tmx 文件引用的贴图时报错的问题

- [Engine] 优化 DOM Image 内存使用,在 handleLoadedTexture 后删除 dom image,并用对象池复用 dom image 来降低 memory footprint

- [Engine] 在 cc.Node 上添加 `pauseAllActions` 和 `resumeAllActions` 接口

- [Engine] 在 cc.Node 上添加 `pauseSystemEvents` 和 `resumeSystemEvents` 接口

- [Engine] 升级 C++ 引擎的 Audio 和 Network 相关代码库,和 cocos2d-x 3.15 同步

- [Engine] 修复使用 LabelAtlas 字体资源的场景延迟加载会闪退

- [Engine] 修复了动态加载 Prefab 后,调用 cc.loader.release 不能正确释放 prefab 引用资源的问题

- [Engine] 修复在 onLoad 中禁用节点时有可能导致后续的 onLoad 没触发的问题

- [Engine] 修复当 Scale9Sprite 的 width 或 height 为 0,并且使用 sliced 模式的时候,会导致数据计算出错的问题

- [Engine] 修复对部分 UI 节点调用 removeFromParent() 后卸载场景时,UI 对象的 cleanup 函数不会被调用,导致原生平台上 ui 控件的内存无法被清除的问题。

- [Engine] 修复将非激活节点加入节点树时,节点上注册的事件可能会被触发的问题

- [AssetManager] 在进度回调中添加更多进度信息,包括:总字节数,已下载字节数,总文件数,已下载文件数,是否是从续传恢复。

- [AssetManager] 修复 `setVersionCompareHandle` 在 `init` 过程中无法生效的问题

- [AssetManager] 支持动态创建 manifest 文件,并手动加载本地和远程 manifest

- [AssetManager] 修复中断热更新后重启会失败,以及重启后重新更新无效的问题

组件

- [Physics] 支持 box2d 物理引擎

- [Camera] 增加 Camera 组件

- [Animation] 修复使用 cc.instantiate 克隆带动画节点时,动画的 playOnLoad 不生效的问题

- [Animation] 修复 animation delay 设置无效的问题

- [Animation] 修复将 Animation 所在节点移出节点树后再调用节点的 destroy 操作时,Animator 对象内存可能泄露的问题

- [Animation] 修复在动画编辑模式下新增 component 并且编辑会造成报错的问题

- [Animation] 修复在设置 uuid 为空的 asset 的时候,会引起报错的问题

- [Animation] 修复动画编辑模式下,更改删除 clip 会导致 Creator 崩溃的问题

- [Particle] 修复粒子组件设置了自动释放时出现报错的问题

- [Particle] 修复使用动画编辑器编辑粒子位置的时候出错的问题

- [BMFont] 修复导入的字体文件中贴图所在路径是绝对路径时导入会报错的问题

- [Label] 重构了 Label 在 windows 桌面平台的实现,解决以下问题:

  - 自动换行,Shrink 等文字排版效果无效

  - 单行文本框输入内容时显示为多行

  - 文本框输入时只会显示前面几个字符

- 多行文本框输入时文字无法置顶对齐

- [Label] 修复 iOS 平台 shrink 模式下面文字显示不全的问题

- [Label] 使用系统字体时可使用 `fontFamily` 属性指定字体类型

- [Label] 修复 BMFont 在原生平台上会造成内存泄露的问题

- [Label] 修复 bmfont 切换字体时,spaceX 属性失效的问题。

- [Toggle] 修改了 Toggle 组件发送事件的时机,在其他 toggle 的状态改变之后才会发送事件

- [Toggle] 在 isChecked 时现在会设置目标节点的 active 而不是设置目标节点的 Sprite.enabled

- [ToggleGroup] 现在在需要启用时候才调用 `addToggle`

- [EditBox] 重构了输入框在 windows 桌面平台的实现,直接在游戏界面里输入文字,不再需要弹出对话框

- [EditBox] 改进 EditBox 在 Android 平台上的兼容性问题:修复第一次点击输入框时可能无法弹出键盘的问题;修复输入前后字体大小不统一的问题;修复切换输入框的单行和多行,对齐方式不正确的问题。

- [EditBox] 修复 `textChanged` 事件回调次数在真机上面不正确

- [EditBox] 修复在 `textChanged` 事件中修改 string 属性时原生平台会显示文字重影的问题

- [EditBox] 修复事件回调里面调用 EditBox.string,光标位置不正确的问题;修复动态切换单行和多行模式,编辑框窗口适配不正确的问题。

- [ScrollView] 修复滚动到边界的事件在设置回弹后可能发送多次的问题

- [ScrollView] 修复惯性滚动回弹不到初始位置的问题,修复脚本中执行 `removeFromParent`,然后再添加到节点树后无法滚动的问题

- [VideoPlayer] 为 iOS 平台增加嵌入式播放(inline)功能

- [VideoPlayer] 修复在 iOS 10 系统的 web 平台无法播放视频的问题

- [VideoPlayer] 在 toggle visibility 的时候,不再移除 dom,而只是修改 visibility

- [WebView] 修复 webview 在 ios 浏览器上面显示大小不正确的问题

- [WebView] 修复 webview 在 chrome 58 上面可能会报错的问题,`toggleVisibility` 时不再移除 dom 节点

下个版本 Creator v1.6 的重点功能预告

1、Bug修复。社区里很多人提出了来一个『0 Feature』的版本,我觉得这个建议蛮好,v1.6的主要基调就是修bug,以及提高性能。

2、文档更新。虽然同事们一直在努力更新文档,但是我看了论坛反馈之后,自己再去看这些中文文档,发现同事们还是写得太跳跃了,对于引擎人员很多地方觉得显而易见就一笔带过,实际上很容易给刚入门的新手带来困惑。

3、原生平台性能优化,升级SpiderMonkey版本 —— 目前用的是三年前的老版本了。同时,这项工作会重构JSB API的绑定层面,目前的进度是,我们已经让一个JavaScript - C++绑定层的设计不仅可以用在Spider Monkey上,也可以用在iOS的JavaScriptCore、Android的v8、微软的ChakraCore等不同JS引擎上,这可以最终达到减小包体积、提高JS引擎性能的目的。我非常希望这项功能可以赶上v1.6版本的发布时间点。这项工作实际上已经启动了几周了,但还处于比较初期的状态。

写了那么多,还是希望大家能感受到Cocos引擎开发团队的诚意,如果你在大型项目里希望使用TypeScript以获得更友好的IDE编码提示,如果你希望在编辑器里拖拖拽拽就完成游戏的物理引擎设定,如果你正打算开发动作游戏,或者你只是想让当前的游戏场景加载更快,那么在今天赶紧下载Cocos Creator 1.5试试呗。

Cocos Creator v1.5下载