UGUI—Canvas Group及其常见应用场景

画布组能够集中控制画布上的全部元素的某些方面,而无需单独的处理每个元素。画布组的属性会影响到所在的游戏对象以及全部子对象。c#

属性:

alpha: 不透明度,介于0-1之间,0是全透明,1是不透明,UI元素会保留本身的alpha值,因此最后元素实际展现效果显示的是alpha属性是画布组的alpha值 * 元素自己的alpha值。markdown

interactable: 肯定此组件是否接收输入。若是不勾选的话表明禁止交互(组件自身的交互功能),值为false。svn

Block Raycasts: 此组件是否做为射线投射的碰撞体?须要在链接到画布的图形射线投射器上调用RayCast函数。若是不勾选的话表明不做为射线投射的碰撞体,值为false。函数

Ignore Parent Groups: 此组是否会受到游戏对象层级视图中更上层的Canvas Group组件的设置所影响。勾选则接收检测,值为true。oop

10.png


测试案例:

建立一个Canvas,添加Canvas Group组件。在这个Canvas下添加一个GameObject在GameObject中添加两个颜色同样的Button组件,而且第一个Button的alpha值设置为146;性能

  • 调节Canvas上的Canvas Group组件的alpha值,观察到两个Button的颜色变化为:
    2.gif
  • 设置Canvas上的Canvas Group组件的interactable为不勾选状态,观察到两个Button为不可点击状态: 3.gif
  • 将GameObject的Ignore Parent Group勾选上,再改变Canvas上的Canvas Group组件的alpha值,以及将其interactable设置为不勾选状态,观察到两个Button的颜色和交互状态不收影响: 4.gif

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;
            }
        }
    }
}
复制代码

参考引用

# Unity中CanvasGroup组件flex

相关文章
相关标签/搜索