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

/**
* :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()注册也没没有生效,如果生效也不是不可以将就。 但是有时候不生效,麻烦引擎组重视一下 这个组建,挺重要的组建。@引擎组

ios 原生用摄像机拍照显示,多次打开关闭后,就会出问题。链接: https://pan.baidu.com/s/15p1UtndREwZEQINVn7_BPA?pwd=lqbh 提取码: lqbh
–来自百度网盘超级会员v8的分享

有解决spine wasm手动加载失败没有reject 与wasm手动加载失败后不能重试的问题吗
@引擎组

引擎用的是 12.7.140, 若急需使用,可以参考这个链接下载,需要修改v8 相关的接口。

12.4不确定是否可以

没遇到过,若有问题,请上传可复现demo

想问下,12.7 iOS编译开了 v8_enable_drumbrake 吗?

@Knox @song2008_2001 大佬这个问题已知不,有结论吗