- ☀️博客主页:CSDN博客主页
- 💨本文由 萌萌的小木屋 原创,首发于 CSDN💢
- 🔥学习专栏推荐:面试汇总
- ❗️游戏框架专栏推荐:游戏实用框架专栏
- ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正
📆 未来很长,值得我们全力奔赴更美好的生活✨
------------------❤️分割线❤️-------------------------
Unity 小科普
老规矩,先介绍一下Unity的科普小知识:
- 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的设置。(勾选则忽略)
应用场景:
- 在窗口的GameObject上添加一个CanvasGroup,通过控制它的Alpha值来淡入淡出整个窗口;
- 通过给父级GameObject上添加一个CanvasGroup并设置它的Interactable值为false来设置一套没有交互(灰色)的控制;
- 通过将元素或元素的一个父级添加Canvas Group并设置BlockRaycasts值为false来制作一个或多个不阻止鼠标事件的UI元素;
CanvasGroup的Alpha与SetActive()方法比较:
- CanvasGroup的Alpha与SetActive()两者之间的性能区别不大。
- CanvasGroup的Alpha由0设为1的时候,并不会让自己活着的子节点中脚本执行Awake()方法,而SetActive(true)则会执行Awake()方法。
- CanvasGroup的Alpha设为0和SetActive(false)的时候,同样不会调用drawcall;
参考链接
官方说明