【已正式发布】CocosCreator 3.8.7 社区版本公测帖

快四个月了,还没稳定吗 :joy:, 不是小步快走吗

1赞

3.8.7正式版预计啥时候发布?

cc v3.8.7-0731 版本, 有一个编辑器刷新的问题, 创建一个 pageview,添加一页数据,


我用箭头拉动带 mask 的节点向右移动, 然后 ctrl - z 撤销一下, mask的下 sprite 就不会显示

这个时候不管是直接修改 position 的数据还是直接移动位置,都不会显示, 只有重新设置 mask 的enabled 的值可以显示, 如果最开始是直接设置数值修改位置, 这个时候撤销是显示正常的

编辑器插件扩展importer需要额外刷新一次资源(构建)调试工具进程才有效,是怎么回事? 3.8.6还有效果的。

1赞

importer 用了自定义 class 吗?可以详细描述一下问题

类似 官方 shader graph ,自定义了一种资源。 比如需要刷新一下资源(构建)调试工具进程。才能看到正确的 icon 。否则会报错 can not find importer … 扒拉扒拉。你们可以直接使用 shader graph extension 来测试这个问题。

/**
* :art: 初始化shader材质
*/
private async initShaderMaterials(): Promise {
if (!this.icon) {
console.warn(“:warning: DragonScale: icon组件不存在,无法初始化shader”);
return;
}

    // 保存原始材质
    this.originalMaterial = this.icon.customMaterial;

    // 加载闪白材质
    try {
        // 加载材质资源
        const materialPath = "white";
        const material = await bundleMgr.loadAssetAsync(Constants.BUNDLE_NAME.Material, materialPath, Material);

        if (material) {
            this.whiteMaterial = material;
        } else {
            console.warn("⚠️ 闪白材质加载失败");
        }
    } catch (error) {
        console.error("❌ 加载闪白材质出错:", error);
    }
}


// 播放受击动画
playHitAnimation() {
    if (this.isPlayingHitAnimation || !this.icon) return;

    this.isPlayingHitAnimation = true;

    // 🎨 使用shader实现闪白效果
    this.playWhiteShaderAnimation();
}

/**
 * 🎨 使用shader播放闪白动画
 */
private playWhiteShaderAnimation(): void {
    if (!this.whiteMaterial || !this.icon) {
        // 如果shader不可用,回退到颜色动画
        this.playColorHitAnimation();
        return;
    }

    // 保存原始材质
    const originalMaterial = this.icon.customMaterial;

    // 应用闪白材质
    this.icon.customMaterial = this.whiteMaterial;
    this.isUsingWhiteShader = true;

    // 🎨 创建平滑的闪白过渡动画
    this.playSmoothWhiteTransition(originalMaterial);
}

/**
 * 🎨 播放平滑的闪白过渡动画
 */
private playSmoothWhiteTransition(originalMaterial: Material): void {
    // 动画参数
    const fadeInDuration = 0.08;   // 淡入时间
    const holdDuration = 0.04;     // 保持时间
    const fadeOutDuration = 0.08;  // 淡出时间
    const maxIntensity = 1;      // 最大闪白强度
    const maxScale = 1.2;         // 最大放大倍数

    // 保存原始缩放
    const originalScale = this.node.scale.clone();

    // 创建动画目标对象
    const animationTarget = {
        intensity: 0.0,
        scale: 1.0
    };

    // 第一阶段:从透明到半白(淡入)+ 放大
    tween(animationTarget)
        .to(fadeInDuration, {
            intensity: maxIntensity,
            scale: maxScale
        }, {
            onUpdate: () => {
                // 更新shader参数
                if (this.whiteMaterial && this.icon) {
                    this.whiteMaterial.setProperty('whiteIntensity', animationTarget.intensity);
                }
                // 更新缩放
                if (this.node && this.node.isValid) {
                    this.node.scale = new Vec3(
                        originalScale.x * animationTarget.scale,
                        originalScale.y * animationTarget.scale,
                        originalScale.z
                    );
                }
            }
        })
        // 第二阶段:保持半白状态 + 保持放大
        .delay(holdDuration)
        // 第三阶段:从半白到透明(淡出)+ 缩小
        .to(fadeOutDuration, {
            intensity: 0.0,
            scale: 1.0
        }, {
            onUpdate: () => {
                // 更新shader参数
                if (this.whiteMaterial && this.icon) {

                    this.whiteMaterial.setProperty('whiteIntensity', animationTarget.intensity);
                }
                // 更新缩放
                if (this.node && this.node.isValid) {
                    this.node.scale = new Vec3(
                        originalScale.x * animationTarget.scale,
                        originalScale.y * animationTarget.scale,
                        originalScale.z
                    );
                }
            }
        })
        .call(() => {
            // 动画完成,恢复原始材质和缩放
            if (this.icon && this.icon.isValid) {
                this.icon.customMaterial = originalMaterial;
            }
            if (this.node && this.node.isValid) {
                this.node.scale = originalScale;
            }
            this.isUsingWhiteShader = false;
            this.isPlayingHitAnimation = false;
        })
        .start();
}

3.8.7的7月31日社区版shader有bug,代码里面已经加载好闪白的shader,然后在敌人受击的时候暂停可以看到shader已经加载了,但是页面上看不到闪白的效果,同样的代码和shader在3.8.6里面是没问题

自定义资源的方法我们还没有正式对外哦,不保证接口的稳定性,在正式推出的时候不一定是那样的,谨慎参考,仅供个人研究。

请问有解决节点复用 drawcall 升高吗?
问题版本:3.8.6
问题描述:节点从父节点 A回收后再复用加回父节点 A,drawcall 就会变高,猜测是渲染顺序之类变了?
验证方式:隐藏父节点 A 再激活,dc就恢复正常
测试方式:节点数量可能需要多一点,比较好观察

我有尝试看源码调用一些 Sprite 和其基类 UIRenderer 的方法看能不能重置渲染,但没找到。有没什么接口是可以重置的?目前发现可以重置的方法就是重新激活父节点

你们都那么勇敢的吗测试版本就拿来做项目了

如果3.8.6没崩溃闪退的问题,我就不升级社区版了。。

ScrollView 的滚动事件如何区分 开始,滚动中,结束? @引擎组

距离7.31又快2周了,什么时候发版啊?

开始这个项目的时候用的是3.8.6,然后spine动画事件监听有问题,就转到3.8.7了,哪里知道又有新的BUG :joy:

一样 为了用spine4.2 不得不用

听说是8月中,不是这周就是下周

请问v8升级到12.4可以吗?编译了个12.4版本的v8,但是运行时报沙箱配置错误。

我发现我家里和公司都是7月30号的版本。但是家里电脑比较low,启动较慢,是OK的。但是公司电脑比较强大。启动较快,就还是不行。我估计是时序问题。

如果用 scrollview.node.on() 来注册 事件的话。 scrollview 自带的scrollEvents=【】 作用是啥?而且,如果.on()注册也没没有生效,如果生效也不是不可以将就。 但是有时候不生效,麻烦引擎组重视一下 这个组建,挺重要的组建。@引擎组