画布组可以集中控制画布上的所有元素的某些方面,而无需单独的处理每一个元素。画布组的属性会影响到所在的游戏对象以及所有子对象。
属性:
alpha: 不透明度,介于0-1之间,0是全透明,1是不透明,UI元素会保留自己的alpha值,所以最后元素实际展示效果显示的是alpha属性是画布组的alpha值 * 元素本身的alpha值。
interactable: 确定此组件是否接收输入。如果不勾选的话代表禁止交互(组件自身的交互功能),值为false。
Block Raycasts: 此组件是否作为射线投射的碰撞体?需要在连接到画布的图形射线投射器上调用RayCast函数。如果不勾选的话代表不作为射线投射的碰撞体,值为false。
Ignore Parent Groups: 此组是否会受到游戏对象层级视图中更上层的Canvas Group组件的设置所影响。勾选则接收检测,值为true。
测试案例:
创建一个Canvas,添加Canvas Group组件。在这个Canvas下添加一个GameObject在GameObject中添加两个颜色一样的Button组件,并且第一个Button的alpha值设置为146;
- 调节Canvas上的Canvas Group组件的alpha值,观察到两个Button的颜色变化为:
- 设置Canvas上的Canvas Group组件的interactable为不勾选状态,观察到两个Button为不可点击状态:
- 将GameObject的Ignore Parent Group勾选上,再改变Canvas上的Canvas Group组件的alpha值,以及将其interactable设置为不勾选状态,观察到两个Button的颜色和交互状态不收影响:
CanvasGroup的Alpha与SetActive()方法比较:
- Canvas Group的Alpha与SetActive()两者之间的性能区别不大。
- Canvas Group的Alpha由0设置为1时,并不会让自己活着的子节点中脚本执行Awake()方法,而SetActive(true)则会执行Awake()方法。
- Canvas Group的Alpha设为0和SetActive(false)的时候,同样不会调用drawcall。
常见应用场景:
- 在窗口的GameObject上添加一个Canvas Group组件,通过控制它的Alpha值来淡入淡出整个窗口;
- 通过给父级GameObject上添加一个Canvas Group组件并设置它的Interactable值为false来设置一套没有交互(灰色)的控制;
- 通过将元素或元素的一个父级添加Canvas Group并设置BlockRaycasts值为false来制作一个或多个不阻止鼠标事件的UI元素。
小案例(淡入淡出)
test脚本挂在案例的Canvas上面
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour
{
private float alphaBegin = 0.0f;
private float alphaSpeed = 2.0f;
bool isShow = false;
private CanvasGroup ex;
// Start is called before the first frame update
void Start()
{
ex = this.transform.GetComponent<CanvasGroup>();
}
// Update is called once per frame
void Update()
{
if(!isShow)
{
ex.alpha = Mathf.Lerp(ex.alpha, alphaBegin, alphaSpeed * Time.deltaTime);
if (Mathf.Abs(alphaBegin - ex.alpha)<= 0.01)
{
isShow = true;
ex.alpha = alphaBegin;
alphaBegin = 1;
}
}
else
{
ex.alpha = Mathf.Lerp(ex.alpha, alphaBegin, alphaSpeed * Time.deltaTime * 0.5f);
if(Mathf.Abs(alphaBegin - ex.alpha)<=0.01)
{
isShow = false;
ex.alpha = alphaBegin;
alphaBegin = 0;
}
}
}
}