最新Cocos Creator 3.x 如何动态修改3D物体的透明度
Cocos Creator 3.x 的2D UI有个组件UIOpacity组件可以动态修改UI的透明度,非常方便。很多同学想3D物体上也有一个这样的组件来动态的控制与修改3D物体的透明度。今天基于Cocos Creator 3.8 来实现一个可以动态修改3D物体透明度的组件Opacity3D。
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
一个3D物体如何才能够半透明显示呢?
编写Opacity3D组件之前,我们先搞懂一个3D物体如何半透明的显示?其实这个原理很简单,满足两个条件就可以了:
- 3D物体所在的渲染队列为”透明队列”;
- 3D物体的frag片元着色的时候alpha的透明度在(0~1)之间;
满足以上两个条件,3D物体就会半透明。条件(2)中需要片元着色时候的透明度为(0~1)之间是否一定要修改shader呢?答案是不需要,因为CocosCreator 3.x的标准Shader里面提供了一个mainColor的颜色属性,默认是白色,如果你修改mainColor的透明度,传入到shader后,frag片元着色器会叠加mainColor的颜色值,这样我们要修改物体的透明度,可以通过修改mainColor来实现。

图1:内置shader中使用CPU传递过来的mainColor数据)
我们自己来编写Opacity3D的时候,就利用shader的这个特性,如果自己开发的shader没有mainColor机制,又需要使用Opacity3D组件的时候,可以给shader添加mainColor的机制或修改代码使用类似的颜色变量。
Opactity3D组件的具体实现
找到要半透明的3D物体,创建一个材质,使用内置的build-unlit shader,它有mainColor机制。设置该物体材质的渲染队列为Transparent。如图所示:

接下来添加Opacity3D组件到对应的节点,在编辑器上调节它的透明度,如下图:

运行起来,Cube就半透明了。

Opacity3D组件核心实现
Opactity3D的核心实现其实非常简单,先上源码(Cocos Creator 3.8):
import { _decorator, color, Color, Component, Material, MeshRenderer, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('Opacity3D')
export class Opacity3D extends Component {@propertyprivate alpha: number = 255; // 【0, 255】@propertyisSharedMode: boolean = false;private matInstance: Material = null!; // 3D物体的材质;private mainColor: Color = null;public get Alpha(): number {return this.alpha;}public set Alpha(alpha: number) {this.alpha = alpha;this.mainColor.a = this.alpha;this.matInstance.setProperty("mainColor", this.mainColor);}protected onLoad(): void {// 初始化材质对象var mr = this.node.getComponent(MeshRenderer);var mat = mr.sharedMaterial;// endthis.matInstance = mat;if(this.isSharedMode === false) {this.matInstance = new Material();this.matInstance.copy(mat);mr.setMaterial(this.matInstance, 0);}// 初始化我们的mainColor;// 注意:这里有个坑, 如果你从来没有修改过这个mainColor,虽然有白色,但是获取不到的;this.mainColor = this.matInstance.getProperty("mainColor") as Color;// console.log(this.mainColor);if(this.mainColor === null) {// 注意:[0~1], 【0, 255】this.mainColor = color(255, 255, 255, 255);}this.alpha = (this.alpha < 0) ? 0 : this.alpha;this.alpha = (this.alpha >= 255) ? 255 : this.alpha;this.mainColor.a = this.alpha;this.matInstance.setProperty("mainColor", this.mainColor);}
}
核心原理就是定义成员变量alpha,然后编写get/set,get获取返回aplah值,set 设置alpha值并同步到材质里面,编写get/set的主要目的是配合tween的机制。这里有个很重要的数据成员isSharedMode,我们大家都知道,当我们给一个材质改变参数的时候,所有使用改材质的物体的参数全部都改变了,有时候我们有100个物体,可能只要其中的1个物体改变透明度,其它不改变,这时我们就可以让isSharedMode为false,这样会单独的为每个物体创建一个材质对象实例出来。
if(this.isSharedMode === false) {this.matInstance = new Material();this.matInstance.copy(mat);mr.setMaterial(this.matInstance, 0);}
结合Tween来渐变的改变3D物体的透明度
我们都知道Tween实际是一个模板机制,给定一段时间,来利用update不断地改变某个属性,只要这个属性有get/set。我们在Opacity3D里面实现了Alpha的get/set,所以就可以与Tween进行配合,做到渐变,代码如下:
opt = effect.getComponent(Opacity3D);Tween.stopAllByTarget(opt);opt.Alpha = 255;t4.delay(0.4);t4 = tween(opt);t4.to(time, {Alpha: 0});t4.start();
今天的分享就到这里了,这里是获取教程的项目源码。同时我在我们官网放了对应的公开课,地址如下,大家可以看下具体的视频教程。
Creator 3.8 3D物体的透明度渐变 (bycwedu.com)
输入QQ号后即可免费学习,无套路

大家好,我是Blake,我们专注于为游戏开发人员的技术进阶,架构进阶,行业解决方案提供专业的课程指导与服务。我们课程经过9年多的更新与迭代,已经涵盖了CocosCreator 开发中遇到的绝大部分问题,涵盖了CocosCreator主程序进阶,升职加薪所需要的系统的知识体系,主流游戏类型的重点难点技术解决方案。我们的老师10:00~23:00提供实时解答与回复,包含但不限于客户端+服务端。相信我们提供的游戏开发技术服务能很好地帮助到您。选择我们的VIP课程,您肯定不会后悔!
谢谢大家
相关文章:
最新Cocos Creator 3.x 如何动态修改3D物体的透明度
Cocos Creator 3.x 的2D UI有个组件UIOpacity组件可以动态修改UI的透明度,非常方便。很多同学想3D物体上也有一个这样的组件来动态的控制与修改3D物体的透明度。今天基于Cocos Creator 3.8 来实现一个可以动态修改3D物体透明度的组件Opacity3D。 对啦!这里有个游戏…...
golang 2018,go 1.19安装Gin
GOPROXYhttps://mirrors.aliyun.com/goproxy/ 一致提示URL不能有点,给我整郁闷了,换了这个地址好了 但是一致提示zip的包问题,最后还是不行又换回七牛 NEWBEE! [GIN-debug] Environment variable PORT is undefined. Using por…...
常用的三角函数公式
sin 2 x cos 2 x 1 \sin ^2 x \cos ^2 x 1 sin2xcos2x1 tan x sin x cos x \tan x \dfrac{\sin x}{\cos x} tanxcosxsinx cot x 1 tan x cos x sin x \cot x \dfrac{1}{\tan x}\dfrac{\cos x}{\sin x} cotxtanx1sinxcosx sec …...
【MySQL】一文学会所有MySQL基础知识以及基本面试题
文章目录 前言 目录 文章目录 前言 一、主流数据库以及如何登陆数据库 二、常用命令使用 三、SQL分类 3.1 存储引擎 四、创建数据库如何设置编码等问题 4.1操纵数据库 4.2操纵表 五、数据类型 六、表的约束 七、基本查询 八、函数 九、复合查询 十、表的内连和外连 十一、索引…...
self.register_buffer方法使用解析(pytorch)
self.register_buffer就是pytorch框架用来保存不更新参数的方法。 列子如下: self.register_buffer("position_emb", torch.randn((5, 3)))第一个参数position_emb传入一个字符串,表示这组参数的名字,第二个就是tensor形式的参数…...
关于卷积神经网络中如何计算卷积核大小(kernels)
首先需要说明的一点是,虽然卷积层得名于卷积( convolution )运算,但我们通常在卷积层中使用更加直观的计算方式,叫做互相关( cross-correlation )运算。 也就是说,其实我们现在在这里…...
python使用selenium做自动化,最新版Chrome与chromedriver不兼容
目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址: chrome版本118: https://download.csdn.net/download/qq_35845339/88510476 chrome版本119: chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…...
算法进阶指南图论 通信线路
通信线路 思路:我们考虑需要升级的那条电缆的花费,若其花费为 w ,那么从 1 到 n 的路径上,至多存在 k 条路径的价值大于 w ,这具有一定的单调性,当花费 w 越大,我们路径上价值大于 w 的花费会越…...
【QEMU-tap-windows-Xshell】QEMU 创建 aarch64虚拟机(附有QEMU免费资源)
“从零开始:在Windows上创建aarch64(ARM64)虚拟机” 前言 aarch64(ARM64)架构是一种现代的、基于 ARM 技术的计算架构,具有诸多优点,如低功耗、高性能和广泛应用等。为了在 Windows 平台上体验…...
strtok函数详解:字符串【分割】的利器
目录 一,strtok函数简介 二,strtok函数的用法 三,strtok函数的注意事项 一,strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割,从而得到我们想要的子字符串。 🍂函数头文件&am…...
winui3开发笔记(二)自定义标题栏
参考文章链接:https://www.programminghunter.com/article/46392310600/ 注意事项 获取 AppWindowTitleBar 的实例并设置其颜色属性时,InitializeTitleBar(AppWindow.TitleBar);,只适用于Windows App SDK 1.2及以上,所以如果用w…...
MapReduce 读写数据库
MapReduce 读写数据库 经常听到小伙伴吐槽 MapReduce 计算的结果无法直接写入数据库, 实际上 MapReduce 是有操作数据库实现的 本案例代码将实现 MapReduce 数据库读写操作和将数据表中数据复制到另外一张数据表中 准备数据表 create database htu; use htu; creat…...
设计模式 -- 状态模式(State Pattern)
状态模式:类的行为基于它的状态改变 属于行为型模式,创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。在代码中包含大量与对象状态有关的条件语句可以通过此模式将各种具体的状态类抽象出来 介绍 意图:允许对象在…...
qt quick发布程序启动失败
qt quick/qml 程序发布之后,程序启动不了 经过探究测试,程序启动的不了的情况下是因为有dll没有添加。在release文件夹下进行发布操作(不单独复制xx.exe拿出来),再次点击IDE的RUN按钮,则会提示有Moudle没有…...
nginx反向代理报错合集
本文汇集了最近在使用nginx反向代理过程中遇到的一系列错误及其解决办法。 1缺乏支持项导致nginx配置错误 在利用sudo ./configure --with-http_ssl_module --with-http_stub_status_module进行配置时,往往会遇到以下类型的错误 error: the HTTP rewrite module …...
【Linux精讲系列】——vim详解
作者主页 📚lovewold少个r博客主页 ⚠️本文重点:c入门第一个程序和基本知识讲解 👉【C-C入门系列专栏】:博客文章专栏传送门 😄每日一言:宁静是一片强大而治愈的神奇海洋! 目录 目录 作者…...
微信小程序自动化采集方案
本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,拒绝转载,若有侵权请联系我删除! 一、引言 1、对于一些破解难度大,花费时间长的目标,我们可以先采用自动化点击触发请求&…...
操作系统第三章王道习题_内存管理_总结易错知识点
1. 静态重定位和动态重定位 静态重定位(可重定位装入):作业在装入内存的时候,就修改它的物理地址. 静态重定位进程数据一旦确定位置,就不能再移动 动态重定位(动态运行时装入):作业装入内存的时候,不修改物理地址,直到运行的时候,根据重定位寄存器再修改地址. 对…...
uniapp刻度尺的实现(swiper)滑动打分器
实现图(百分制):滑动swiper进行打分,分数加减 <view class"scoring"><view class"toggle"><view class"score"><text>{{0}}</text><view class"scoreId&quo…...
cordova Xcode打包ios以及发布流程(ionic3适用)
第一步 1、申请iOS证书 2、导入证书到钥匙串 第二步 1、xcode配置iOS证书 1.1用Xcode打开你的项目(我的Xcode版本是新版) 修改如下图 回到基本信息设置界面,Bundie 这项填写,最先创建的那个appid,跟创建iOS描述文件时选…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
