变灰色 给组件 设置变灰材质

Creator 版本:v2.4.2 web和模拟器测试ok app未测试
/**
* 设置灰色滤镜
* @param node node节点 或 label、sprite组件
* @param gray true变灰
* @param children 子项是否变灰 默认false 只有node会有子项
*/
setGray(node: cc.Node | cc.Label | cc.Sprite, gray: boolean = true, children?: boolean): void {
let target: any = node
var material = cc.Material.createWithBuiltin(gray ? cc.Material.BUILTIN_NAME.GRAY_SPRITE : cc.Material.BUILTIN_NAME.SPRITE, 0)
material.define(“USE_TEXTURE”, true, 0);
if (node instanceof cc.Node) {
target = node.getComponent(cc.Sprite);
target && target.setMaterial(0, material);
target = node.getComponent(cc.Label);
target && target.setMaterial(0, material);
children && node.children.forEach(subNode => {
target = subNode.getComponent(cc.Sprite);
target && target.setMaterial(0, material);
target = subNode.getComponent(cc.Label);
target && target.setMaterial(0, material);
}, this)
} else {
target && target.setMaterial(0, material);
}
}

//给设置一个强类型 《any》cc.Material.BUILTIN_NAME.GRAY_SPRITE : 《any》cc.Material.BUILTIN_NAME.SPRITE

[USE_TEXTURE] define not found. 警告 的朋友 可以修改成这样
// var material = cc.Material.createWithBuiltin(gray ? cc.Material.BUILTIN_NAME.GRAY_SPRITE : cc.Material.BUILTIN_NAME.SPRITE, 0)
// material.define(“USE_TEXTURE”, true, 0);
var material = cc.Material.getBuiltinMaterial(gray ? cc.Material.BUILTIN_NAME.GRAY_SPRITE : cc.Material.BUILTIN_NAME.SPRITE);

4赞

感谢分享。

(帖子被作者删除,如无标记将在 24 小时后自动删除)

太及时了,直接就用上去了,感谢感谢!

帮我看看这是什么原因呗

好像只适用于小游戏,app无效

版本 2.3.2 同样的问题

const BUILTIN_MATERIAL = {
GRAY_SPRITE:null,
SPRITE:null,
}
//设置组件材质变灰
setComMaterial(com, active){
BUILTIN_MATERIAL.SPRITE = BUILTIN_MATERIAL.SPRITE || cc.Material.getBuiltinMaterial(cc.Material.BUILTIN_NAME.SPRITE);
BUILTIN_MATERIAL.GRAY_SPRITE = BUILTIN_MATERIAL.GRAY_SPRITE || cc.Material.getBuiltinMaterial(cc.Material.BUILTIN_NAME.GRAY_SPRITE);
com.setMaterial(0, active ? BUILTIN_MATERIAL.SPRITE : BUILTIN_MATERIAL.GRAY_SPRITE);
},

我是使用cc.Material.getBuiltinMaterial(cc.Material.BUILTIN_NAME.GRAY_SPRITE)来设置的,不需要再设置USE_TEXTURE,目前没发现有什么BUG

1赞

这个功能不香吗?

引擎button不是自带变灰吗

1赞

有时候需要置灰一些sprite总不能拖个button上去使用一下按钮的置灰效果吧这样做不优雅

node传label或是sprite target都没有赋值这个方法可能有点瑕疵喔

已修改,测试ok

3q 已修改 let target: any = node

感觉可以这么修改直接将node的子子孙孙都置灰

1赞

赞 可以这样

我这样写的,跟楼主不同点在于获取组件使用的cc.RenderComponent,就不用去区分Sprite或Label了。

1赞

这个6 从1.x兼容到2.4.3了

可惜不支持字体描边

字体描边你就在置灰的时候直接disable正常显示就enable就可以了