首页 > 其他分享 >Cocos Creator 3.x 如何动态修改3D物体的透明度

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

时间:2023-11-17 10:24:45浏览次数:35  
标签:Cocos Creator 物体 透明度 组件 mainColor Opacity3D 3D

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来实现。

 

 

我们自己来编写Opacity3D的时候,就利用shader的这个特性,如果自己开发的shader没有mainColor机制,又需要使用Opacity3D组件的时候,可以给shader添加mainColor的机制或修改代码使用类似的颜色变量。

 

 

Opactity3D组件的具体实现

 

  找到要半透明的3D物体,创建一个材质,使用内置的build-unlit shader,它有mainColor机制。设置该物体材质的渲染队列为Transparent。如图所示:

 

 

 

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

 

 

 

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

 

Opacity3D组件核心实现

 

Opactity3D的核心实现其实非常简单,先上源码(Cocos Creator 3.8):

 

 

 

 

 

 

核心原理就是定义成员变量alpha,然后编写get/set,get获取返回aplah值,set 设置alpha值并同步到材质里面,编写get/set的主要目的是配合tween的机制。这里有个很重要的数据成员isSharedMode,我们大家都知道,当我们给一个材质改变参数的时候,所有使用改材质的物体的参数全部都改变了,有时候我们有100个物体,可能只要其中的1个物体改变透明度,其它不改变,这时我们就可以让isSharedMode为false,这样会单独的为每个物体创建一个材质对象实例出来。

 

 

结合Tween来渐变的改变3D物体的透明度

 

  我们都知道Tween实际是一个模板机制,给定一段时间,来利用update不断地改变某个属性,只要这个属性有get/set。我们在Opacity3D里面实现了Alpha的get/set,所以就可以与Tween进行配合,做到渐变,代码如下:

 

 

 

今天的分享就到这里了

 

标签:Cocos,Creator,物体,透明度,组件,mainColor,Opacity3D,3D
From: https://www.cnblogs.com/rainy1unity/p/17838047.html

相关文章

  • Cocos Creator 项目实战《3D切水果》
    今天跟大家分享一个CocosCreator3D切水果的实战案例,帮助大家掌握CocosCreator开发3D微信抖音小游戏,开发工具我们采用的是CocosCreator3.6。先上一波游戏操作效果图,接下来通过本文来讲解这个游戏的一些核心的技术点。   游戏项目资源准备 我们刚开始做项目的时候......
  • Unity3D:ECS架构详解
    Unity3D是目前游戏开发领域最为流行的引擎之一,而Unity3DECS架构则是在Unity3D引擎的基础上,针对游戏开发中的实体组件系统进行优化和改进而设计的一种架构。本文将详细介绍Unity3DECS架构的技术细节和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开......
  • Cocos Creator 常见错误排查方法
    CocosCreator新手开发的时候经常会遇到一些错误不知道如何解决,今天把这些错误总结一下,下次遇到的时候,自己知道如何分析。 到底谁为null或undefine 我们在使用CocosCreator开发的时候,运行游戏项目,经常会遇到这样的问题: TypeError:Cannotreadpropertiesofnull(rea......
  • Cocos Creator中定时任务的实现
    在CocosCreator游戏开发中,经常需要使用定时任务,例如,赛车游戏游戏开始前的倒计时,玩家游戏结束之后等待3秒进入下一局,打地鼠游戏中,地鼠出洞3秒后消失,飞机大战中飞机每隔1秒钟发射一颗子弹等等。由于其应用场景非常多,因此,CocosCreator中为我们提供了方便的计时器,这个计时器源自......
  • 一篇文章搞定Cocos Creator中动画编辑器的使用
    在CocosCreator游戏开发中,动画特效的使用非常频繁,而动画特效的操作对初学者来说又相对复杂,所以,初学者一定要引起重视。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~动画编辑器使用1:创建一个节点;2:为这个节点添加一个动画组件cc.Anima......
  • Cocos Creator开发中的事件响应
    在CocosCreator游戏开发中,我们经常需要处理事件响应。所以,我们有必要对其中的事件响应内容熟记于心,因此,将其中重要内容归纳如下:对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。触摸事件1:触摸事......
  • CocosCreator脚本属性在属性面板的显示
    声明属性要声明属性,需要在cc.Class定义的properties字段中,填写属性名字和属性参数。cc.Class({extends:cc.Component,properties:{score:{default:0,type:cc.Integer,displayName:"分数",tooltip:"玩家的分数"}}}); 下拉列表要在属性检查器上显示为下拉......
  • g2o(5-2)2d-3d BA优化
    https://github.com/gaoxia   #include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/features2d/features2d.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/calib3d/calib3d.hpp>#include<Eig......
  • g2o(5-3)3d-3d BA优化
    https://github.com/gaoxiang12/slambook/blob/master/ch7/pose_estimation_3d3d.cpp #include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/features2d/features2d.hpp>#include<opencv2/highgui/highgui.hpp>#include&l......
  • Cocos Creator中骨骼动画组件的使用
    在CocosCreator游戏开发中,骨骼动画对于优化系统资源占用有很大帮助,很多时候我们都会使用。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~spine骨骼动画工具1:骨骼动画:把动画打散,通过工具,调骨骼的运动等来形成动画2:spine是一个非常流......