• 【Unity100个实用小技巧】世界Canvas自动隐藏,包含子物体


    • ☀️博客主页:CSDN博客主页
    • 💨本文由 萌萌的小木屋 原创,首发于 CSDN💢
    • 🔥学习专栏推荐:面试汇总
    • ❗️游戏框架专栏推荐:游戏实用框架专栏
    • ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正
    • 📆 未来很长,值得我们全力奔赴更美好的生活✨

    • ------------------❤️分割线❤️-------------------------

    请添加图片描述请添加图片描述请添加图片描述

    Unity 小科普

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

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

    Unity100个实用小技巧

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

    1. using UnityEngine;
    2. public class AutoHide : MonoBehaviour
    3. {
    4. public float alphaSpeed = 1f; //渐隐渐显的速度
    5. private float m_UIAlpha = 1; //初始化时让UI显示
    6. private CanvasGroup m_CanvasGroup;
    7. // Use this for initialization
    8. void Start()
    9. {
    10. m_CanvasGroup = this.GetComponent();
    11. }
    12. // Update is called once per frame
    13. void Update()
    14. {
    15. if (m_CanvasGroup == null) return;
    16. if (m_UIAlpha != m_CanvasGroup.alpha)
    17. {
    18. m_CanvasGroup.alpha = Mathf.Lerp(m_CanvasGroup.alpha, m_UIAlpha, alphaSpeed * Time.deltaTime);
    19. GetComponent().SetAllSceneModelAlpha(m_CanvasGroup.alpha);
    20. if (Mathf.Abs(m_UIAlpha - m_CanvasGroup.alpha) <= 0.01f)
    21. {
    22. m_CanvasGroup.alpha = m_UIAlpha;
    23. }
    24. }
    25. }
    26. ///
    27. /// 显示
    28. ///
    29. public void UIFadeInEvent()
    30. {
    31. m_UIAlpha = 1;
    32. if (m_CanvasGroup != null)
    33. {
    34. m_CanvasGroup.blocksRaycasts = true; //可以和该对象交互
    35. }
    36. }
    37. ///
    38. /// 隐藏
    39. ///
    40. public void UIFadeOutEvent()
    41. {
    42. m_UIAlpha = 0;
    43. if (m_CanvasGroup != null)
    44. {
    45. m_CanvasGroup.blocksRaycasts = false; //不可以和该对象交互
    46. }
    47. }
    48. }

    原理:通过修改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;

    参考链接

    官方说明


  • 相关阅读:
    v-show和v-if指令的共同点和不同点
    关于VIT模型训练自己的数据集报错为无效的数据
    让chatgpt编写一个微信小程序的对话页面,它是这么整的,我懵了
    密码正确无法登陆Linux系统
    tasklet的实现(原理篇)
    基于 MinIO 对象存储保障 Rancher 数据
    前端代码规范化的解决方案
    (持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点
    harbor的安装及使用
    我的创作纪念日2048天
  • 原文地址:https://blog.csdn.net/qq_42555291/article/details/130890948