Unity 小科普

老规矩,先介绍一下Unity的科普小知识:

unity模型隐藏 unity 物体隐藏_vr


unity模型隐藏 unity 物体隐藏_vr


unity模型隐藏 unity 物体隐藏_vr


  •  Unity 是行业领先的实时3D开发平台。
  • 包括游戏开发,电影,AR/VR,虚拟现实在内的所有创作者,可以将梦想照进现实。
  • Unity提供了一套完整完善的软件解决方案,可用于创作,运营和模拟任何2D和3D的内容,进本全平台支持
  • 实际上Unity就是一个游戏引擎,大名鼎鼎的原神就是用它制作的。

Unity100个实用小技巧

需求:世界模式Canvas自动隐藏,包含所有的子UI控件


using UnityEngine;

public class AutoHide : MonoBehaviour
{
    public float alphaSpeed = 1f;          //渐隐渐显的速度
    private float m_UIAlpha = 1;             //初始化时让UI显示
    private CanvasGroup m_CanvasGroup;
    // Use this for initialization
    void Start()
    {
        m_CanvasGroup = this.GetComponent<CanvasGroup>();
    }

    // Update is called once per frame
    void Update()
    {
        if (m_CanvasGroup == null) return;

        if (m_UIAlpha != m_CanvasGroup.alpha)
        {
            m_CanvasGroup.alpha = Mathf.Lerp(m_CanvasGroup.alpha, m_UIAlpha, alphaSpeed * Time.deltaTime);

            GetComponent<MainScenePanel>().SetAllSceneModelAlpha(m_CanvasGroup.alpha);

            if (Mathf.Abs(m_UIAlpha - m_CanvasGroup.alpha) <= 0.01f)
            {
                m_CanvasGroup.alpha = m_UIAlpha;
            }
        }
    }

    /// <summary>
    /// 显示
    /// </summary>
    public void UIFadeInEvent()
    {
        m_UIAlpha = 1;
        if (m_CanvasGroup != null)
        {
            m_CanvasGroup.blocksRaycasts = true;      //可以和该对象交互
        }
    }

    /// <summary>
    /// 隐藏
    /// </summary>
    public void UIFadeOutEvent()
    {
        m_UIAlpha = 0;
        if (m_CanvasGroup != null)
        {
            m_CanvasGroup.blocksRaycasts = false;     //不可以和该对象交互
        }
    }
}


原理:通过修改CanvasGroup.alpha实现

CanvasGroup

一种可放置 Canvas 的元素,可用于修改子 Alpha、Raycasting、Enabled 状态。

画布组可用于修改子元素的状态。

参数:

Alpha : 该组UI元素的透明度。注:每个UI最终的透明度是由此值和自身的alpha数值相乘得到。

Interactable : 是否需要交互(勾选的则是可交互),同时作用于该组全部UI元素。

Blcok Raycasts : 是否可以接收图形射线的检测(勾选则接受检测)。注:不适用于Physics.Raycast.。

Ignore Parent Group : 是否需要忽略父级对象中的CanvasGroup的设置。(勾选则忽略)
应用场景:

  1. 在窗口的GameObject上添加一个CanvasGroup,通过控制它的Alpha值来淡入淡出整个窗口;
  2.   通过给父级GameObject上添加一个CanvasGroup并设置它的Interactable值为false来设置一套没有交互(灰色)的控制;
  3. 通过将元素或元素的一个父级添加Canvas Group并设置BlockRaycasts值为false来制作一个或多个不阻止鼠标事件的UI元素;

CanvasGroup的Alpha与SetActive()方法比较:

  1. CanvasGroup的Alpha与SetActive()两者之间的性能区别不大。
  2. CanvasGroup的Alpha由0设为1的时候,并不会让自己活着的子节点中脚本执行Awake()方法,而SetActive(true)则会执行Awake()方法。
  3. CanvasGroup的Alpha设为0和SetActive(false)的时候,同样不会调用drawcall;

参考链接

官方说明