最新Cocos Creator 3.x 如何动态修改3D物体的透明度

news2024/12/25 2:00:59

Cocos Creator 3.x 的2D UI有个组件UIOpacity组件可以动态修改UI的透明度,非常方便。很多同学想3D物体上也有一个这样的组件来动态的控制与修改3D物体的透明度。今天基于Cocos Creator 3.8 来实现一个可以动态修改3D物体透明度的组件Opacity3D。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

一个3D物体如何才能够半透明显示呢?

编写Opacity3D组件之前,我们先搞懂一个3D物体如何半透明的显示?其实这个原理很简单,满足两个条件就可以了:

  1. 3D物体所在的渲染队列为”透明队列”;
  2. 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 {
 @property
 private alpha: number = 255; // 【0, 255】
 @property
 isSharedMode: 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;
 // end
 this.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课程,您肯定不会后悔!

谢谢大家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OkHttpClient实例

以下是OkHttpClient的一个简单用法示例&#xff1a; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException;public class Main {public static void main(String[] args) {OkHttpClient client new OkHttpClient();Re…

将全连接层替换为卷积层的意义(CNN和FCN)

全连接层&#xff1a;CNN 将特征整合&#xff0c;用于分类&#xff0c;在图像中具体化为知道图像中有猫&#xff0c;但是不知道猫在哪儿。 在传统CNN中&#xff0c;输入是唯一确定大小的。因为全连接层要求输入是固定的。 全卷积网络&#xff1a;FCN 不仅可以用来分类&…

2023年化工自动化控制仪表证考试题库及化工自动化控制仪表试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年化工自动化控制仪表证考试题库及化工自动化控制仪表试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证…

无人零售奶柜:革新牛奶购买体验

无人零售奶柜&#xff1a;革新牛奶购买体验 无人零售奶柜的投放地点覆盖了社区、写字楼等靠近居民的场所&#xff0c;大大提升了消费者购买牛奶的体验。这一创新不仅令消费者能够享受到与电商平台相媲美的直供价格优势&#xff0c;还让他们能够购买更多、更丰富的知名品牌牛奶。…

左手 Jira,右手 Polarion,驶入互联网和制造业十字路口的新能源汽车

笔者之前一直在互联网公司从事软件研发&#xff0c;创立 Bytebase 之后&#xff0c;才开始接触到各行各业的用户。最近来自汽车行业的客户不少&#xff0c;所以就翻翻相关资料。周末微信收到了一条推送&#xff0c;提到汽车行业的软件研发管理&#xff0c;也由此了解到了 Polar…

c语言从入门到实战——操作符详解

操作符详解 前言1. 操作符的分类2. 二进制和进制转换2.1 2进制转10进制2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制2.2.1 2进制转8进制2.2.2 2进制转16进制 3. 原码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~6. 单目…

Chrome插件精选 — 广告拦截插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. Adblock Plus 广…

【Linux】:初识git || centos下安装git || 创建本地仓库 || 配置本地仓库 || 认识工作区/暂存区(索引)以及版本库

&#x1f4ee;1.初识git Git 原理与使用 课程⽬标 • 技术⽬标:掌握Git企业级应⽤&#xff0c;深刻理解Git操作过程与操作原理&#xff0c;理解⼯作区&#xff0c;暂存区&#xff0c;版本库的含义 • 技术⽬标:掌握Git版本管理&#xff0c;⾃由进⾏版本回退、撤销、修改等Git操…

vue3中生命周期函数

CSDN文章质量分数查询&#xff1a;https://www.csdn.net/qc 前言&#xff1a; Vue.js由于其丰富的API和灵活易用等特性&#xff0c;能够帮助我们快速构建单页应用程序&#xff0c;&#xff0c;是目前最受欢迎的javascript框架之一。 再过去几年里&#xff0c;我们一直停留在Vu…

多维时序 | MATLAB实现TCN时间卷积神经网络多变量时间序列预测

多维时序 | MATLAB实现TCN时间卷积神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现TCN时间卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现TCN时间卷积神经网络多变量时间序列预测 模型描述 MATLAB实现TCN时间卷…

用户缓冲区概念

先看现象&#xff0c;printf / fprintf / fwrite 一定封装了write , 但是执行代码看到大家都是去掉\n 和close(1),库函数无法打印&#xff0c;write可以 你不是说的库函数封装了write&#xff0c;怎么打印不出来&#xff1f; 如果执行这两句代码你会发现程序会等待一会最后结…

入门自动化测试框架知识,读这一篇就够了!

自动化测试因其节约成本、提高效率、减少手动干预等优势已经日渐成为测试人员的“潮流”&#xff0c;从业人员日益清楚地明白实现自动化框架是软件自动化项目成功的关键因素之一。本篇文章将从什么是真正的自动化测试框架、自动化脚本如何工作以及自动化测试框架会如何在测试过…

【Mybatis】3 的操作类型对象

前言知识汇总 上篇文章中我们已经详细介绍了Mybatis的存储类对象。我们上篇提到了&#xff1a; Mapper.xml当中的SQL标签都被解析成了一个一个的MappedStatement对象。那么我们当中的SQL是基于什么形式进行封装的呢&#xff1f; 我们要知道&#xff0c;Java当中一切皆对象。M…

工业路由器网关的网络协议之NAT技术

在物联网通讯领域&#xff0c;NAT技术能将内网的一个私有IP转换成一个公网IP去接入互联网&#xff0c;解决组建局域网络时私有IP地址无法在公网上进行路由的问题。 NAT&#xff08;Network Address Translation&#xff09;的三种方式&#xff1a; 静态NAT 1、一个私有IP对应…

【form校验】3.0项目多层list嵌套

const { required, phoneOrMobile } CjmForm.rules; export default function detail() {const { query } getRouterInfo(location);const formRef useRef(null);const [crumbList, setCrumbList] useState([{url: "/wenling/Reviewer",name: "审核人员&quo…

Cesium 展示——将每个点和点所在线段进行关联

文章目录 需求分析1. 数据结构2. 点线绘制3. ID获取4. 进行关联需求 点的集合和线的集合已知,现需将每个点和每个点所在的关联的线进行关联起来 输入 输出 分析 1. 数据结构 l

Mac平台文件传输工具Transmit 5

Transmit 是一款由Panic开发的文件传输软件&#xff0c;它可以帮助用户在不同的服务器间进行文件传输。Transmit 支持多种协议&#xff0c;包括FTP、SFTP、WebDAV等&#xff0c;同时它也内置了一个强大的文件管理器&#xff0c;可以方便地对文件进行管理和操作。 Transmit 的界…

分享86个节日庆典PPT,总有一款适合您

分享86个节日庆典PPT&#xff0c;总有一款适合您 链接&#xff1a;https://pan.baidu.com/s/1oE2LIr6en4js9L0fzUyqgw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付费甚欢…

web —— css(1)

Web —— css基础 1. CSS样式表2. CSS的三种引入方式3. CSS 语法4. CSS 选择器4.1 元素选择器4.2 类选择器4.3 ID选择器4.4 属性选择器4.5 后代选择器4.6 子元素选择器4.7 伪类选择器4.8 分组选择器 5. 颜色和字体6. 显示方式display7. 盒子模型7.1 盒子模型 - 外边距塌陷7.2 盒…

Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】

一、Gateway整合sentinel限流 网关作为内部系统外的一层屏障,对内起到-定的保护作用&#xff0c;限流便是其中之- - .网关层的限流可以简单地针对不同路由进行限流,也可针对业务的接口进行限流,或者根据接口的特征分组限流。 1、添加依赖 <dependency><groupId>c…