Cavans Group 详解

本文深入探讨Unity中CanvasGroup组件的功能,包括控制透明度(Alpha)、禁用交互(Interactable)、阻挡射线(BlocksRaycasts)以及忽略父级设置(IgnoreParentGroups),并通过实例演示这些属性的作用。

首先来看看Canvas Group这个组件样子:
这里写图片描述
如图所示,这个组件拥有4个属性:
1.Alpha,这是一个很常见的属性,很多组件上面都有,作用都相同,就是控制所在对象或子级对象的透明度,从而可以实现一些渐隐渐现的效果。

一般如上图所示类似的组件其值为0~1;
其一般情况下会对所在对象本身及子级对象都产生影响,所以Canvas Group组件的这个属性可以用来控制整个UI界面的透明度,实现整体的渐隐渐现效果。子级不受影响的情况后面再说明。

在我们设置如Image组件(或Text组件)上图片的颜色时,会由4个值共同控制,RGBA,其中这个A就是代表的Alpha透明度,这时候其值范围是0~255,这个相信都很熟悉啦!
Image组件上设置图片的Alpha值,可以控制其本身所在对象的透明度,如让一张图片实现渐隐渐现效果,注意这里是本身所在的对象哦,这个时候可不会对子级对象的透明度产生影响。

2.Interactable,这个单词翻译过来就是相互作用的意思,官方原本的解释是:确定该组件是否会接受输入。当它被设置为false时,交互被禁用;
举例说明,创建一个Canvas,在其下面创建一个Button,给这个按钮组件添加一个Canvas Group组件,然后再在这个Button下面创建一个Button,同样也给加上Canvas Group组件,将这两个按钮的位置分开一点并设置他们不同状态下的颜色,便于观察,我们分别叫他们父级按钮和子级按钮。
当我们设置父级按钮 Canvas Group组件下的Interactable为FALSE时,会发现其本身和子级按钮都变成了禁用状态,也就是都失去了交互作用,不会响应点击事件了。我们可以利用这一点设置界面变灰色。
由此可以看出这个属性的具体功能了,并且还会影响子级对象(当然这也是一般情况)。

扩展一下,我们不管Canvas Group组件的Interactable了,来看看Button组件自己本身的Interactable属性会不会对子级产生影响,设置子级按钮Button组件的Interactable为true,设置父级按钮组件的Interactable为false,试验过后我们发现子级按钮还是可以点击,说明Button组件的Interactabl属性只会影响自己本身所在的对象的交互作用,而不会对子级产生影响。这里对比一下Canvas Group组件的Interactabl属性就可以看出差别了。

3.Blocks Raycasts,翻译过来的意思是阻止射线投射,也就是当你设置其为true并点击时,他会阻止你点击产生的射线,从而检测到你的操作并作出响应。当你设置其为false时,这个组件所在的对象就不会遮挡射线的投射了,从而会穿透。
一般情况下,他也会影响子级对象是否会阻止射线投射。

4.Ignore Parent Groups,字面意思翻译过来是忽略父组的意思,上面我们举例说明了各种的一般情况,就是父级的Canvas Group属性设置会对子级产生影响,现在终于能知道不一般的情况了,没错就是和现在要介绍的这个属性有关系。
字面意思已经说了,就是忽略父级关于Canvas Group属性的设置,咱要使用自己的设置,例如,当你勾选了这个属性后,无论你父级的Alpha、Interactable、Blocks Raycasts如何设置,都不会影响自己的设置,这时你影藏父级自己却不会,你关闭了父级的相互交互但不会影响自己,你关闭父级的阻止射线投射但不会影响自己的。
那么这个父级包不包括爷爷级呢?经过试验发现这个是忽略不了爷爷级及以上层次的Canvas Group属性设置的。

需要注意的是,Canvas Group组件的前三个属性设置是不会相互影响的,各管各的。

最后希望有不对的或者有所缺失的能有大神指点指点!!!

提供的引用中未提及“cavans3d”,推测可能是“Canvas 3D”。一般来说,在 HTML5 里,单纯的 Canvas 主要用于 2D 绘图,不过借助 WebGL(Web Graphics Library)能在 Canvas 上实现 3D 绘图效果。 ### 介绍 HTML5 的 Canvas 本身是一个绘图 API,用于绘制 2D 图形,可在网页上绘制各种复杂图形、图像和动画效果,为网页开发者提供了较大创作自由度,能创造出更生动、有趣且交互性强的网页内容 [^4]。而通过 WebGL 技术,可在 Canvas 上实现 3D 绘图效果,WebGL 是一种 3D 绘图标准,它把 OpenGL ES 2.0 引入到了浏览器中,让网页开发者能在 Canvas 元素上进行硬件加速的 3D 渲染。 ### 使用方法 以下是一个简单的使用 WebGL 在 Canvas 上绘制 3D 图形(立方体)的示例代码: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>WebGL 3D Cube</title> </head> <body> <canvas id="glCanvas" width="640" height="480"></canvas> <script> // 获取 canvas 元素 const canvas = document.getElementById('glCanvas'); // 获取 WebGL 上下文 const gl = canvas.getContext('webgl'); if (!gl) { alert('Unable to initialize WebGL. Your browser or machine may not support it.'); return; } // 顶点着色器代码 const vsSource = ` attribute vec4 aVertexPosition; attribute vec4 aVertexColor; uniform mat4 uModelViewMatrix; uniform mat4 uProjectionMatrix; varying lowp vec4 vColor; void main(void) { gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition; vColor = aVertexColor; } `; // 片元着色器代码 const fsSource = ` varying lowp vec4 vColor; void main(void) { gl_FragColor = vColor; } `; // 创建着色器程序 function initShaderProgram(gl, vsSource, fsSource) { const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource); const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource); const shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertexShader); gl.attachShader(shaderProgram, fragmentShader); gl.linkProgram(shaderProgram); if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { alert('Unable to initialize the shader program: ' + gl.getProgramInfoLog(shaderProgram)); return null; } return shaderProgram; } // 加载着色器 function loadShader(gl, type, source) { const shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { alert('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader)); gl.deleteShader(shader); return null; } return shader; } const shaderProgram = initShaderProgram(gl, vsSource, fsSource); // 创建缓冲区 function initBuffers(gl) { const positionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); const positions = [ // 前面 -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, // 后面 -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, // 顶面 -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, // 底面 -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, // 右面 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, // 左面 -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0 ]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); const colorBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer); const faceColors = [ [1.0, 1.0, 1.0, 1.0], // 前面:白色 [1.0, 0.0, 0.0, 1.0], // 后面:红色 [0.0, 1.0, 0.0, 1.0], // 顶面:绿色 [0.0, 0.0, 1.0, 1.0], // 底面:蓝色 [1.0, 1.0, 0.0, 1.0], // 右面:黄色 [1.0, 0.0, 1.0, 1.0] // 左面:紫色 ]; let colors = []; for (let j = 0; j < faceColors.length; ++j) { const c = faceColors[j]; colors = colors.concat(c, c, c, c); } gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW); const indexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); const indices = [ 0, 1, 2, 0, 2, 3, // 前面 4, 5, 6, 4, 6, 7, // 后面 8, 9, 10, 8, 10, 11, // 顶面 12, 13, 14, 12, 14, 15, // 底面 16, 17, 18, 16, 18, 19, // 右面 20, 21, 22, 20, 22, 23 // 左面 ]; gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW); return { position: positionBuffer, color: colorBuffer, indices: indexBuffer }; } const buffers = initBuffers(gl); function drawScene(gl, programInfo, buffers) { gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clearDepth(1.0); gl.enable(gl.DEPTH_TEST); gl.depthFunc(gl.LEQUAL); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); const fieldOfView = 45 * Math.PI / 180; const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight; const zNear = 0.1; const zFar = 100.0; const projectionMatrix = mat4.create(); mat4.perspective(projectionMatrix, fieldOfView, aspect, zNear, zFar); const modelViewMatrix = mat4.create(); mat4.translate(modelViewMatrix, modelViewMatrix, [-0.0, 0.0, -6.0]); { const numComponents = 3; const type = gl.FLOAT; const normalize = false; const stride = 0; const offset = 0; gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position); gl.vertexAttribPointer( programInfo.attribLocations.vertexPosition, numComponents, type, normalize, stride, offset); gl.enableVertexAttribArray( programInfo.attribLocations.vertexPosition); } { const numComponents = 4; const type = gl.FLOAT; const normalize = false; const stride = 0; const offset = 0; gl.bindBuffer(gl.ARRAY_BUFFER, buffers.color); gl.vertexAttribPointer( programInfo.attribLocations.vertexColor, numComponents, type, normalize, stride, offset); gl.enableVertexAttribArray( programInfo.attribLocations.vertexColor); } gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.indices); gl.useProgram(programInfo.program); gl.uniformMatrix4fv( programInfo.uniformLocations.projectionMatrix, false, projectionMatrix); gl.uniformMatrix4fv( programInfo.uniformLocations.modelViewMatrix, false, modelViewMatrix); { const vertexCount = 36; const type = gl.UNSIGNED_SHORT; const offset = 0; gl.drawElements(gl.TRIANGLES, vertexCount, type, offset); } } const programInfo = { program: shaderProgram, attribLocations: { vertexPosition: gl.getAttribLocation(shaderProgram, 'aVertexPosition'), vertexColor: gl.getAttribLocation(shaderProgram, 'aVertexColor') }, uniformLocations: { projectionMatrix: gl.getUniformLocation(shaderProgram, 'uProjectionMatrix'), modelViewMatrix: gl.getUniformLocation(shaderProgram, 'uModelViewMatrix') } }; drawScene(gl, programInfo, buffers); </script> </body> </html> ``` 上述代码实现了在网页上使用 WebGL 在 Canvas 中绘制一个 3D 立方体,基本步骤为:获取 Canvas 元素和 WebGL 上下文;创建并编译顶点着色器和片元着色器;创建着色器程序;创建并填充缓冲区(顶点、颜色、索引);最后进行绘制操作。 ### 应用场景 - **Web 游戏开发**:借助 Canvas 3D 可以创建出具有 3D 效果的游戏场景、角色和道具等,为玩家带来更逼真的游戏体验。 - **数据可视化**:可将数据以 3D 图形的形式展示出来,如 3D 柱状图、3D 散点图等,能更直观地呈现数据之间的关系和趋势。 - **虚拟展示**:在房地产、家居等行业,利用 Canvas 3D 可以创建虚拟样板间,让用户可以 360 度无死角地查看房间布局和装修效果;在工业领域,可用于展示机械产品的 3D 模型和工作原理。 - **教育领域**:在科学、工程等学科的教学中,使用 Canvas 3D 可以创建 3D 模型来展示复杂的结构和过程,如分子结构、天体运动等,帮助学生更好地理解知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值