Cocos Creator 常见问题归纳

文:Jno, Xunyi

Q:微信小游戏开放数据域使用艺术字字体报错,怎么解决?

A:可以用艺术字,但是艺术字只能是白色的。

Q:微信小游戏开放数据域工程的 res 资源如何像主域工程一样远程下载?

A:开放数据域的 Image 只能使用本地或微信 CDN 的图片,不能使用开发者自己服务器上的图片。对于非本地或非微信 CDN 的图片,可以先从主域 wx.downloadFile() 下载图片文件,再通过 OpenDataContext.postMessage() 把文件路径传给开放数据域去使用。

Q:Creator 电脑双屏问题怎么解决?

A:删除项目中的 local 文件夹的 layout.windows.json 。

Q:OPPO 小游戏平台构建 rpk 包失败!错误:Error: Command failed:rpk 包构建失败!错误:Error: Command failed: quickgame.cmd pack’quickgame.cmd’

A:将 quickgame-toolkit\lib\bin 目录路径添加到系统环境变量 Path 中。
保存之后,再重新构建即可。

Q:OPPO 小游戏平台在构建发布程序包时出现报错: Error:release 签名不存在!

A:签名的生成流可参考官网文档:https://docs.cocos.com/creator/manual/zh/publish/publish-oppo-instant-games.html#%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B

Q:v2.1.0 eulerAngles 替换 rotationY 的用法

A:eulerAngles 参数类型为 Vec3 ,node.eulerAngles = cc.v3(x, y, z);

Q:v2.0.5 多子包出现,Already has sub package

A:微信允许配置多个子包,可参考链接中的工程,这个工程展示了在微信小游戏上分包加载的基础用法: https://forum.cocos.com/t/2-0-5-already-has-sub-package/70750/5?u=337031709

Q:如何解决 Label 在下一帧才刷新大小的问题?

A:由于 label 中 _updateRenderData 处理开销过大,因为在设置 string 的时候无法触发更新,size 只能在渲染的时候才可以获取到正确的 size,这个后续会加以优化和改进。目前用户可以自行在设置 label 所有属性后再执行一次 label._updateRenderData(true); 就能在当帧获取 label 大小。

Q:v2.0 模拟器运行热更新范例

A:Creator v2.0,第一次加载的资源是原生的,而不是更新后的资源。执行热更新流程后,才会把 manifest 的热更新目录加入到文件的 search path。所以完成热更新并执行更新后的资源,需要执行两个步骤:1. 执行热更新。2.不管热更新成功与否,执行 cc.game.restart(); 重新加载游戏。示例代码的 ALREADY_UP_TO_DATE 中没有重启游戏,导致热更新完成后,再次打开不会切换到更新后的界面。第二个问题,不要使用官方 demo下面的热更新资源,因为脚本的加密密匙匹配不上,用户可以根据教程,重新导出热更新资源。
附上热更新相关的两个文档:
https://docs.cocos.com/creator/manual/zh/advanced-topics/assets-manager.html168
https://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html11

Q:开放数据域 scrollview 无法滚动?

A:请参考:https://forum.cocos.com/t/scrollview/67114/15?u=337031709

Q:Cocos Creator 调试预览的时候,如何设置不显示调试信息?

A:Web 预览的话,可以点击浏览器预览窗口上方的 ShowFPS 按钮。或者使用 cc.debug.setDisplayStats(false);这样模拟器和 Web 预览都不会出现 FPS 信息

Q:编译后出现了预加载和播放声音的错误

A:排查下是否构建模块异常或者项目异常,将相同功能的代码和资源转移到一个空项目下测试编译下是否会出现类似异常

Q:升级 VS Code 后 Creator 添加编译任务出错:Task version 0.1.0 is deprecated. Please use 2.0.0 (4, 5)

A:这个是由于 vscode 的升级编译任务系统引起的问题,
https://code.visualstudio.com/docs/editor/tasks#vscode32
目前的解决方案是先将原先的 tasks.json 文件代码修改为如下,然后同时按住ctrl + shift + b 运行任务。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "compile",
            "command": "curl",
            "args": ["http://localhost:7456/update-db"],
            "type":"shell",
            "isBackground": true,
            "group": "build",
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "reveal": "always"
            },
        }
    ]
}

Q:场景突然打不开

A:在资源管理器中选中场景,然后点击右键,选择 “还原到上次保存”。

如果有保存或托管了场景文件,请对比下文件差异。这个问题应该是由于异常保存了场景文件,导致场景文件中的某个属性出现了异常。可使用 vscode 等代码编辑器打开异常项目,查看下 _id 是否为 null。

Q:DragonBones 骨骼动画(texture)会有黑边

A:请参考:https://forum.cocos.com/t/dragonbones/70312/7?u=337031709

Q:Cocos Creator v2.0.5 打包 Windows 出错

A:可使用 VS2017 编译看看,一般都是由于 VS 的编译环境没完全安装好引起的问题。可参考官网文档:https://docs.cocos.com/creator/manual/zh/getting-started/install.html#windows-%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E 以及 https://docs.cocos.com/creator/manual/zh/publish/setup-native-development.html#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9

Q:修改引擎 js 源码后怎么生效?

参考官网文档:https://docs.cocos.com/creator/manual/zh/advanced-topics/engine-customization.html

Q:安装新版本后如何再安装低版本?

A: 直接更改 CocosCreator.app 的名字就可以了。比如 CososCreator193.app,但注意中间不能有空格。这样就可以多版本并存了。

Q:tileLayer.getTiledTileAt 为何无法获得某一个矩阵坐标的 tile。返回值都是 undefined?

A:目前 Tilemap 的 getTiledTileAt 会判断在指定序列上 _tiledTiles 中是否已有 tiledtile,有就输出,没有的话依据是否创建新的 tiledtile(forceCreate)参数来执行相关代码。
如果项目中本来就没创建过 tiledtile,那么可以通过 setTiledTileAt (x, y, tiledTile) 先创建一个,或者参考 getTiledTileAt 中的逻辑创建新的 tiledtile。之后再通过 getTiledTileAt() 传 false 返回值就不是 underfined 了。

Q:项目无法打开,无法新建,ipc timeout,message: app:open-project, session:1@renderer:1012

A:重启编辑器。

Q:如何从 v2.0.5 降级到 v1.9.3?

A:只能升,不能降。工具层面没办法做到同时导出旧版本兼容的格式。(注意:请做好备份!)

Q:求官方手册离线版 v2.1.0

A:请参考:https://github.com/cocos-creator/creator-docs/issues/832

Q:Creator v2.0.5 安卓调试无法断点?

A:可参考:https://forum.cocos.com/t/creator2-0-5/70105/10?u=337031709,或者官网文档:https://docs.cocos.com/creator/manual/zh/publish/debug-jsb.html

Q:jsb2.0 自动绑定对 NDK 版本有要求吗?

A:NDK-r16

Q:Android 打包问题

A:项目设置 -> 模块设置中的 network 要勾选,第一次打包建议模块全部勾选上。常见的打包失败一般有以下 4 种情况:
1. 项目存放路径过长
2. 在项目设置 -> 模块设置中去掉了必要模块
3. SDK 或者 NDK 版本太老 / 太新
4. 环境变量问题

Q:Android 版本编译成功但运行失败?

A:可参考:https://forum.cocos.com/t/android/68591/6?u=337031709

Q:v2.1.0 的 3D 深度问题

A:目前仅对 3D 模型开启深度检测,可以在官方范例的 mech-drone 场景测试

Q:TiledLayer.removeTileAt 已经没有了吗? 可以用什么代替呢?

A:可参考:https://forum.cocos.com/t/tiledlayer-removetileat/70434

Q:Tiledmap 导出的文件在 Creator V2.05 无法加载

A:可参考:https://forum.cocos.com/t/tiledmap-cocoscreator-v2-05/71229

Q:v2.0.7 spine 原生平台动态换装失败

A:之前是用到了 getRuntimeData() 获取原生的 spine 操作,更换成 Skeleton API 就可以了:
this.spine.setAttachment(type+'-slot', ${type}-${levelIndex})

Q:Creator 会释放 prefab 引用的图片吗?

A:请参考:https://forum.cocos.com/t/cocos-creator-prefab/70642/15?u=337031709

Q:Creator v2.0.6发布 QQ 玩一玩平台,运行报错:cc.sys.localStorage.getItem 为空

A:这个可以在 qqplay 适配层的 qqplay/libs/engine/CCLocalStorage.js 中添加代码,或者等下个新版本
https://github.com/cocos-creator-packages/qqplay-adapter/pull/513

Q:官方文档的获取和加载资源部分中说“千万不要放resources 下面”,到底是有什么坏处?另外一个推荐的项目结构应该是怎么样的?

A:请参考:https://forum.cocos.com/t/resources/72167/3?u=337031709

Q:插件代码无法保存预制?

A: 请参考:https://docs.cocos.com/creator/manual/zh/getting-started/faq.html#%E5%A6%82%E4%BD%95%E7%94%A8%E6%8F%92%E4%BB%B6%E6%8E%A7%E5%88%B6-prefab%EF%BC%9F

Q:Creator 的 VideoPlayer上如何叠加 UI?

A:UI 可以用 Creator 做,Video 在各个平台都要自己适配,放在引擎 GL View 的下层,引擎中需要开启: cc.macro.ENABLE_TRANSPARENT_CANVAS = true;
然后设置
cc.Camera.main.backgroundColor = cc.color(0, 0, 0, 0);
如果有多个 Camera,每个都要设置。

Q:iPhone6-iOS12 小游戏平台息屏再唤醒后卡死

A:引擎源码中找到下面代码,并屏蔽掉,可以解决此崩溃。这个是微信小游戏提供的,只对微信小游戏问题生效。
// opts["preserveDrawingBuffer"] = true;

Q:如何定义类似 CC_DEV 这样的常量?

A:自定义引擎完成后,打开 engine/gulp/util/utils.js 脚本,在最下面有一个 uglify 函数,可以根据需求自行修改其中的参数。例如,返回的对象里,有一个 global_defs 字典,修改其中的 key value 即可。

Q:速度被限制

A:因为 box2d 中限制了速度变化,可以在 engine 中的 box2d.js 下搜索
b2_maxTranslation 的定义。根据文档编译引擎手动修改它的值:
https://docs.cocos.com/creator/manual/zh/advanced-topics/engine-customization.html#12-%E5%AE%89%E8%A3%85%E7%BC%96%E8%AF%91%E4%BE%9D%E8%B5%96193

Q:网络图片加载失败怎么解决?

A:这是由于请求资源时出现跨域问题导致,说明目标资源的资源服务器并不允许跨域访问资源。

Q:按钮的 width 如何设置为负数?

A: 目前引擎上是不支持 node.width 为负数的。

Q:Animation 有没有方法恢复到当前动画的初始状态?

A:CCAnimation 的使用中,用户可以指定动画名称和动画时间,然后传入play(name.time),这样可以让动画在指定时间播放。如果只是想让动画跳到某一帧但是不想播放,可以参考下方代码使用。恢复播放就用下面的 play 方法,
恢复到初始状态的话传入 0.01 差不多就够用了。

var state = this.anima.getAnimationState("test");
        var curves = state.curves;
        var info = state.getWrappedInfo(0.3);
        for (var i = 0, len = curves.length; i < len; i++) {
            var curve = curves[i];
            curve.sample(info.time, info.ratio, this);
        }

Q:Creator v2.0.2 绘制开放数据域排行榜出现黑屏

A:可参考:https://forum.cocos.com/t/creator2-0-2/67943/14?u=337031709

Q:Creator v2.0.5 当字体文件过大(比如大于10M时)场景或者 Prefab 会加载不出来

A:修改 Engine 的 font-loader.js 中的 _timeout 为一个较短的时间。例如 10000

Q:AudioSource 有没有结束后的回调?

参考如下方案,由于 Audio 目前没有提供设置播放结束回调的接口,需要开发者手动添加。

Q:this.dragonAtlasAsset.init is not a function

这个属于 cc.loader.loadResDir 的异常,它的加载是异步加载,无法保证所加载的 item 顺序。切换使用 loadRes 可以解决问题。

Q:有什么办法可以立即删除 Component 的?

A:可以使用这个 API:node.removeComponent()。或者可参考:
https://docs.cocos.com/creator/api/zh/classes/Node.html#removecomponent5

Q:JS 脚本中自定义组件数组的序列化

var ColorInfo = cc.Class({
    name:"test",
    properties: {

        nameColor: {
            default: "",
            type: cc.String,
        },
        fromValue: {
            default: 0,
            type: cc.Float,
        },
        toValue: {
            default: 0,
            type: cc.Float,
        },
        specialValue: {
            default: 0,
            type: cc.Float,
        },
        setColor: {
            default: cc.Color.WHITE,
            type: cc.Color,
        }
    },
    // update (dt) {},
});

cc.Class({
    extends: cc.Component,
    properties: {
        SetColorArray: {
            default: [],
            type: [ColorInfo],
        }
    }
});

Q:loadResArray 加载资源断网重连重新加载无法加载

A:断网重连。资源没有重新加载的问题是因为目前引擎的 load 自身并没有实现断网重连资源重载,用户可以自行实现。

Q:TypeError: children[i]._onBatchCreated is not a function

A:因为场景 json 文件中某个节点出现了 _children 里有 null,导致打不开场景,删除 null 即可。

Q:VideoPlay 视频显示黑屏

A:可能是由于属于 HTML 只支持 H.264 编码格式的 MP4 导致的。
可参考:https://blog.csdn.net/keji_123/article/details/777178491
方案:使用格式工厂输出 AVC(H264) 编码格式的 MP4 视频。

Q:内存释放问题

A:可参考:https://forum.cocos.com/t/topic/65743/54?u=337031709

Q:调试断点不太精准

A:可参考:https://forum.cocos.com/t/creator/73177/4?u=337031709

Q:如何加载手机中的图片?

A:cc.loader.load(); 可以加载设备内的资源,如下:
cc.loader.load("/dara/data/some/path/to/image.png", function (err, texture) {});
或者可以直接参考官方文档:
https://docs.cocos.com/creator/manual/zh/scripting/load-assets.html9

Q:labelOutline 组件可以实现描边 , 但是如何设置描边在 X,Y 轴上的偏移量?

A:https://github.com/cocos-creator/engine/blob/v2.0.8-release/cocos2d/core/renderer/utils/label/ttf.js#L262参考下文的代码,代码中的 startPosition 是描边的位置,可以通过控制这个值来让描边产生偏移。需要自己定制引擎。

_context.lineJoin = 'round';
_context.fillStyle = `rgba(${_color.r}, ${_color.g}, ${_color.b}, ${_color.a / 255})`;
let underlineStartPosition;

//do real rendering
for (let i = 0; i < _splitedStrings.length; ++i) {
    if (_isOutlined) {
        let strokeColor = _outlineColor || WHITE;
        _context.strokeStyle = `rgba(${strokeColor.r}, ${strokeColor.g}, ${strokeColor.b}, ${strokeColor.a / 255})`;
        _context.lineWidth = _outlineWidth * 2;
        _context.strokeText(_splitedStrings[i], startPosition.x, startPosition.y + i * lineHeight);
    }
    _context.fillText(_splitedStrings[i], startPosition.x, startPosition.y + i * lineHeight);

    if (_isUnderline) {
        underlineStartPosition = this._calculateUnderlineStartPosition();
        _context.save();
        _context.beginPath();
        _context.lineWidth = _fontSize / 8;
        _context.strokeStyle = `rgba(${_color.r}, ${_color.g}, ${_color.b}, ${_color.a / 255})`;
        _context.moveTo(underlineStartPosition.x, underlineStartPosition.y + i * lineHeight - 1);

Q:在富文本内容中如果有 > 符号,> 后面的文本内容总是会显示两次

A:> 符号不在当前版本的 HTMLTextParser 解析范围内,可以在 engine 文件夹中修改 htmlTextParser.js

Q:定制引擎报 JavaScript heap out of memory 内存不足

A:由于 v8 在编译的时候,对 CPU 和内存的需求比较大,当文件数量很多的时候,可能会出现内存不足的情况。目前有一个有效方案是最后 build 的时候这样输入:gulp build –max-old-space-size=8192。后面这句代码可以修改 v8 引擎的内存上限。类似的方案还有:https://www.cnblogs.com/liugang-vip/p/6857595.html

Q:Creator 中 Simulator 如何自定义机型?

A:在 Cocos Creator 设置界面可以设置自定义模拟器分辨率。具体可参考官网文档:https://docs.cocos.com/creator/manual/zh/getting-started/basics/editor-panels/preferences.html#%E9%A2%84%E8%A7%88%E8%BF%90%E8%A1%8C