Cocos Knowledge Base https://knowledge.cocos.com Thu, 04 Jan 2024 09:16:47 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.5.14 https://knowledge.cocos.com/wp-content/uploads/2021/01/favicon.png Cocos Knowledge Base https://knowledge.cocos.com 32 32 如何监听2D节点的点击事件与如何实现鼠标拖动2D节点 https://knowledge.cocos.com/archives/4555 Mon, 18 Sep 2023 02:41:02 +0000 https://knowledge.cocos.com/?p=4555 问题来源:
https://discuss.cocos2d-x.org/t/detects-nodes-touched-when-touching-and-dragging/59459

问题解决:

Hello, on how to listen for node click events and get click node information, you can check this article:你好,关于如何监听节点点击事件并获取点击节点信息,可以查看这篇文章:
https://docs.cocos.com/creator/manual/en/getting-started/first-game-2d/touch.html?h=touch

In addition, to achieve dragging objects through the mouse, you can refer to the following code:
另外,要实现通过鼠标拖动对象,可以参考以下代码:

import { _decorator, Component, EventTouch, Node, UITransform, Vec3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('DragMove')
export class DragMove extends Component {

    @property(Node)
    touchNode: Node = null;

    start() {
        this.node.on(Node.EventType.TOUCH_MOVE, this.dragMoveNode.bind(this), this);
    }

    dragMoveNode (e: EventTouch) {
        var touchLocation = e.getUILocation();

        var nodeWorldPos = new Vec3(touchLocation.x, touchLocation.y, 0);
        var nodePos = this.touchNode.parent.getComponent(UITransform).convertToNodeSpaceAR(nodeWorldPos);
        
        this.touchNode.setPosition(nodePos);
    }

    update(deltaTime: number) {
        
    }
}

测试工程:59459

]]>
CocosCreator 3.5.2 版本安卓项目升级 gradle 版本 https://knowledge.cocos.com/archives/3779 Thu, 22 Jun 2023 07:58:17 +0000 https://knowledge.cocos.com/?p=3779 打包 android 工程之后,使用 android studio 打开项目。

参考以下截图红框处改动对 android 工程进行修改:

我这边测试环境用的 Android studio 是 2021 版本,所以没法使用 7.3.x 以上的 Gradle 版本。所以只升级到了 7.0.2。你们如果要升级到 Gradle 8.x,需要先把 Android studio 升级到 2022 及以上版本,可以把 build.gradle 中的 classpath 改为 ‘com.android.tools.build:gradle:8.0.2’ 。
然后 gradle-wrapper.properties 的 distributionUrl 改为 distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip。

]]>
CocosCreator 3.5.2 引擎升级 gradle 版本 https://knowledge.cocos.com/archives/3775 Thu, 22 Jun 2023 07:18:18 +0000 https://knowledge.cocos.com/?p=3775
templates/android/build/gradle/wrapper/gradle-wrapper.properties

templates/android/build/build.gradle

templates/android/template/app/build.gradle


templates/android/build/libservice/build.gradle


cocos/platform/android/libcocos2dx/build.gradle

]]>
在某一些低端机型上,CocosCreator 3.x 的游戏无法正常运行,会出现 webgl lost的情况 https://knowledge.cocos.com/archives/3771 Tue, 20 Jun 2023 05:49:11 +0000 https://knowledge.cocos.com/?p=3771 问题描述:
设备机型:
安卓 J250G/DS – Android 7.1.1 内存 1.5G

问题分析与解决:

3.6.2 游戏在这个手机的 chrome 浏览器出现的异常情况,排查结果还是硬件兼容性问题导致,问题出在硬件的 vao 扩展内部异常,导致浏览器页面 crash 掉,这种个别硬件的兼容性问题没法解决,可以看下面的规避方案。

** 这个问题可以用下面这个方法,在检测到问题存在后,给用户一个弹窗提醒,然后重新进入游戏时,提前关闭 VAO 来规避后续报错。





]]>
请教一下 Label 显示长文本超过位图限制怎么处理?除了分多 label 或者做成图片,有没有其他解决方案? https://knowledge.cocos.com/archives/3765 Mon, 19 Jun 2023 06:27:31 +0000 https://knowledge.cocos.com/?p=3765 问题描述:

。。。

问题分析与解决:
可以考虑修改 Label 的 OverFlow 为 Resize_height,然后使用自动换行功能。也可以考虑使用 Label 的缓存模式: bitmap 或 char 模式,以图片纹理的方式渲染文字。这是两者的差异描述,可以根据项目情况选用

缓存模式会增加文字贴图纹理的内存,并且因为是运行时生成的,没法压缩,如果项目对内存要求严格,可以使用 bitmapfont 字体,在打包时做一下 gpu 压缩纹理减少纹理内存占用
自动换行会增加文字加载的速度,可以考虑使用手动换行。label 和 RichText 都可以在运行时给 string 赋值带有 \n 换行符的字符串,引擎会自动识别并做换行处理。减少自动换行的开销。

]]>
Creator 3.6.2 spine 的 atlas 使用 jpg 图片在原生平台会闪退 https://knowledge.cocos.com/archives/3761 Mon, 19 Jun 2023 06:13:29 +0000 https://knowledge.cocos.com/?p=3761 问题描述:
。。。

问题分析与解决:

参考图片修改代码,然后重新编译工程即可。

]]>
当使用节点池并频繁增减 sprite 時, 原本可以合并的 sprite, draw call 會被打斷 https://knowledge.cocos.com/archives/3753 Mon, 19 Jun 2023 03:18:01 +0000 https://knowledge.cocos.com/?p=3753 问题描述:
当频繁增减 sprite 時, 原本可以合并的 sprite, draw call 會被打斷

问题分析与解决:

是因为单个 buffer 可以容纳的 sprite 数量有限制,导致 buffer 切换,合并打断。可以根据这个文档去调整配置参数
https://docs.cocos.com/creator/manual/zh/ui-system/components/engine/ui-batch.html#v341-%E4%B9%8B%E5%90%8E

用于渲染 sprite 的 buffer 有回收机制,我看了你场景节点是有做释放操作,导致后续 sprite 节点使用了回收池里面的数据,池里里面的 buffer 索引是不确定的

这两个截图是 buffer 使用的参考,第一张是释放,第二张是创建

这个机制没法避免的
1. buffer 是有大小限制,没法容纳所有 sprite 节点。
2. buffer 申请和释放没有指定规则,是按照先后顺序执行的。
3. 如果要规避,就需要增加 buffer 的申请和释放规则,目前是没有的。实现可能增加代码出错风险,因为引擎内部的实现机制错综复杂。

节点池不能限制节点树顺序,所以没法规避问题

]]>
在 3.6.2 版本打包安卓工程测试游戏内存时,发现在某一设备上 Graphics 分类的内存值较高 https://knowledge.cocos.com/archives/3749 Mon, 19 Jun 2023 03:06:05 +0000 https://knowledge.cocos.com/?p=3749 问题描述:
在 3.6.2 版本打包安卓工程测试游戏内存时,发现在某一设备上 Graphics 分类的内存值较高。
设备信息:Nexus 5X – Android 8.1.0 、 pixel 6a、Nexus 5G
pixel 6a 设备上运行 Creator 空项目内存测试情况

问题分析与解决:

Nexus 5G 这个设备的 vulkan 内存问题,经过内存损耗定位,是 vulkan api 创建的对象内存本身就异常的高,比如创建一个 1×1 的纹理就会有 30M 内存损耗。使用其他简单的原生 vulkan 示例代码进行测试,比如下面连接的这个demo,问题是一样的。这个示例工程跑在 Nexus 5G 这个设备上, graphic 内存是 170M 损耗,而跑在其他设备内存损耗只有 17M。由于测试代码非常简单,逻辑本身也不存在问题,所以可以确定是 Nexus 5G 这个设备的图形驱动存在设计问题,引擎端没有办法规避这种问题,没法解决。

建议用户使用 GLES 后端。

]]>
微信小程序使用 web-view 运行 web-mobile 前后台切换无法正常播放音频问题 https://knowledge.cocos.com/archives/3736 Mon, 15 May 2023 09:34:37 +0000 https://knowledge.cocos.com/?p=3736 问题详情:(ios 微信)
  1. 创建微信小程序工程;
  2. 通过微信小程序上的 web-view page 页运行 web-mobile 工程;
  3. web-mobile 场景播放音频;
  4. 通过按钮跳转到微信小程序新的一个 page 页面;
  5. 在新的 page 页面停留一段时间(停多久不固定,看设备,正常 > 2 分钟比较好复现)
  6. 回到 web-view page 页,音频无法恢复播放;

解决方案:

在文件:\3.7.1\resources\resources\3d\engine\pal\audio\web\player-web.ts

-> _doPlay -> if (audioContextAgent!.isRunning) 下添加代码:

     setTimeout(() => {
            audioContextAgent!._context.suspend().then(() => {
                   console.log(‘suspend context 22’)
            });
     }, 1000);
     setTimeout(() => {
           audioContextAgent!._context.resume().then(() => {
                   console.log(‘Resume context 22’)
           });
    }, 2000);
对 audioContext 做下简单重启操作,原因是虽然 audioContext 的状态还是在 running,但是实际测试运行的效果还是 suspend。
https://developer.mozilla.org/en-US/docs/Web/API/AudioContext

]]>
web 监听手机点击返回键 https://knowledge.cocos.com/archives/3733 Wed, 10 May 2023 02:58:46 +0000 https://knowledge.cocos.com/?p=3733 window.addEventListener("popstate", function (e) {              window.parent.postMessage("click_back", '*'); }, false); window.addEventListener(‘message’, (e) => { if (“click_back” == e.data) { //处理返回按键的操作 } })

https://developer.mozilla.org/zh-CN/docs/Web/API/History_API

]]>