首页 > 其他分享 >【泰裤辣 の Unity百宝箱】Canvas组件四件套讲解

【泰裤辣 の Unity百宝箱】Canvas组件四件套讲解

时间:2023-12-28 20:33:25浏览次数:32  
标签:四件套 Canvas 百宝箱 元素 摄像机 UI 组件 屏幕

【泰裤辣 の Unity百宝箱】Canvas组件四件套讲解

原创 打工人小棋 打工人小棋 2023-05-16 13:24 发表于广东

1. 介绍

在上一期内容中,我分享了一套简单易用的UI框架。没想到大家的学习热情这么高,讨论度是目前所有内容最高的。

由此可见,天下苦UI(秦)久已!!!

图片

接下去,我们继续深入探讨UI这个话题。

今天分享的是:Canvas四件套,什么是四件套呢?

他们分别是如下四个组件:

  • Canvas组件
  • Canvas Scaler组件
  • Graphics Raycaster组件
  • Canvas Group组件

在每次创建UI界面时,默认会为我们添加前三个组件,而最后一个组件在很多时候也非常常用。今天统一对这四个组件进行讲解~

2. Canvas的四大组件介绍

这里吐槽下Unity官方文档,真的写的太干燥了,好歹举几个例子说明下吧,生怕我们学会是吧?

下面的讲解,我会尽可能结合自己的理解,用“人话”说明白这些组件。

2.1. Canvas

当我们在Unity中创建UI界面时,Canvas组件是最基本的元素之一。它充当着UI元素的容器,并提供了许多参数用于控制UI的显示行为。

下面是Canvas的三种模式(Render Mode)介绍:

2.1.1. Screen Space - Overlay

UI元素将绘制在屏幕最上层,不受摄像机的影响。

图片

  1. Pixel Perfect

    Pixel Perfect参数用于确保UI元素在不同屏幕分辨率下的像素对齐。当启用Pixel Perfect后,UI元素的位置和尺寸会按照像素对齐到屏幕上的整数像素。简单理解就是,开启后,一些像素风的游戏效果会更好。

  2. Sort Order

    用于控制UI的遮挡顺序,SortOrder越大的,会出现在屏幕的越顶层。

  3. Target Display

    用于多屏显示,一般用不到

  4. Additional Shader Channels

    获取或设置创建 Canvas 网格时要使用的附加着色器通道的掩码,一般用不到

下面这张图很好的呈现了这种模式的表现效果,UI始终在立方体物体的前面:

图片ScreenSpace

2.1.2. Screen Space - Camera

UI元素将绘制在指定的摄像机下,通常用于在3D场景中嵌入2D UI元素。

图片

  1. Pixel Perfect

    同上

  2. Render Camera

    选择渲染的相机,需要创建一个UICamera用于渲染这种UI模式

  3. Order in Layer

    可以控制相同层级下UI的遮挡顺序

  4. Additional Shader Channels

    同上


总结

在这种模式下,游戏中至少需要两个摄像机,一个是3D摄像机(主摄像机),另一个就是UI摄像机了。我们需先渲染3D摄像机,然后再渲染UI摄像机,这样UI就会盖在3D场景的前面。我们可以设置 UICamera 里的 Depth 值。

下图是我的UICamera设置,Depth在3D摄像机上的设置是-1,在UI摄像机设置的就是0(或者大于-1)了。另外,UICamera需要设置正交摄像机,此时只需在Projection中选择Orthographic即可。Clipping Planes的最小值建议设置成0,不然有时候某些UI会被剔除掉。

图片


下面这张图很好的呈现了这种模式的表现效果,UI的显示根据相机看到的表现效果进行渲染,如果UICamera的深度比物体深度大,则可能被物体遮挡:

图片CameraMode

2.1.3. World Space

图片


  1. Event Camera

    定义Canvas的事件系统应该使用的相机。当用户与Canvas进行交互时,该相机将用于确定用户点击的UI元素。

  2. Sorting Layer

    将Ui分为多个排序层级,层级越高的显示在越上方

  3. Order in Layer

    在同一个排序层级内,进一步用数字区分遮挡顺序,结合Sorting Layer实现两级排序

下面这张图很好的呈现了这种模式的表现效果,UI和物体使用同一个相机进行渲染,根据z轴大小来判断深度。简单理解就是,把UI当成物体处理。

图片WorldSpace

2.2. Canvas Scaler

图片CanvasScaler

用于控制Canvas中UI元素的缩放和布局。它可以确保在不同分辨率和屏幕大小下,UI元素在屏幕上的大小和位置始终保持一致

Canvas Scaler也有三种模式:

  1. Constant Pixel Size:

  2. Scale With Screen Size:

  3. Constant Physical Size:

但是这里我不打算一一讲解了,只讲最常用的设置方式:自适应屏幕,也就是第二种模式Scale With Screen Size

图片

  • Reference Resolution:

    以移动平台为例,现在主流的受击大多数是16:9的分辨率比例,不能把分辨率设置得太高,得考虑兼容低配的受击。这里可以设置分辨率1136 x 640。(我这里设置800 x 600是用于植物大战僵尸项目)

  • Screen Match Mode:

    屏幕相对模式一般设置成Expand,表示Canvas下的UI始终保持在屏幕内,当屏幕宽度变窄后,它会整体缩放高度来保持自适应。

    你还可以在下拉框选择始终保持宽度始终保持高度,这样当分辨率变化时,超出屏幕部分会被裁切掉。

2.3. Graphic Raycaster

用于检测UI元素是否被点击或触摸。当使用鼠标或触摸屏幕时,Graphic Raycaster会向场景中的UI元素发射一条射线,以确定被点击或触摸的元素是哪一个

图片


  1. Ignore Reversed Graphics

    控制是否忽略逆向的图形。如果启用此选项,则Graphic Raycaster将忽略与其背面朝向的UI元素进行交互。例如,如果你在场景中有一个UI元素,它只有一个正面,那么启用此选项可以确保只有当该元素的正面朝向相机时才会检测到点击或触摸。

  2. Blocking Objects

    控制哪些对象会被忽略,以确保射线只与UI元素进行交互。这个参数的下拉框中,可以选择忽略2d物体/3d物体,这样当UI前面存在这些物体时,射线也能够到达UI。

  3. Blocking Mask

    和上面的选项类似,只是这次屏蔽的是Mash,而不是Objects了。

2.4. CanvasGroup:


图片

官方的解释是:用于控制整个UI组某些方面的元素,而不需要单独处理他们。

所以我的理解,这个组件就是用于控制Canvas以下所有UI元素的一些特征,比如UI的透明度、UI的交互等等。

他包含四个参数:

  • Alpha:

    控制整个画布组的透明度,参数范围 [0-1]

  • interactable:

    控制按钮的交互,设置为False后,你的按钮将无法点击。并且所有的按钮会呈现半透明的状态(标识其无法交互)。

  • Blocks Raycasts:

    控制点触穿透,如果在鼠标所在位置有两个按钮,顶层的UI会拦截掉这次点触,以至于底层的UI不响应本次点触。是否穿透或拦截,由这个参数来控制。

    比如,控制"更改用户按钮"是否被"用户列表界面"点触拦截:

    若勾选上Blocks Raycasts,则按钮将接收不到用户点触事件。

     

  • 图片

  • Ignore Parent Groups:

    忽略父CanvasGroup的影响,这个很好理解,我们可以在一个Panel的不同位置添加CanvasGroup,我们想让当前位置的CanvasGroup不受父节点CanvasGroup的影响,就需要勾选这个选项。

 

比如我想实现界面打开和关闭时候的淡入淡出,这时候就可以将Canvas GroupDoTween结合使用:

具体代码如下

    public virtual void OpenPanel(string name)
    {
        // ...

        CanvasGroup canvasGroup = GetComponent<CanvasGroup>();
        canvasGroup.alpha = 0.0f;
        DOTween.To(() => canvasGroup.alpha, x => canvasGroup.alpha=x, 1, 2);

        // ...
    }

    public virtual void ClosePanel()
    {
        isRemove = true;
        CanvasGroup canvasGroup = GetComponent<CanvasGroup>();
        DOTween.To(() => canvasGroup.alpha, x => canvasGroup.alpha = x, 0, 1).onComplete(
            () =>
            {
                SetActive(false);
                Destroy(gameObject);
                if (UIManager.Instance.panelDict.ContainsKey(name))
                {
                    UIManager.Instance.panelDict.Remove(name);
                }
            }
        );
    }


更多

以上就是小棋对Canvas四件套的分享啦~

文章的视频版本已经同步发布在b站的同名账号(打工人小棋)上,感兴趣的同学可以去看看~

相信看完这些内容,对你的游戏开发技能一定有所帮助。

同学们有任何关于Canvas的时候经验,或者文章中出现了什么纰漏,都欢迎在评论区进行讨论。

我们下期再见~~~

 

打工人小棋

赞赏二维码喜欢作者

2 人喜欢

Unity百宝箱5 Unity百宝箱 · 目录 上一篇【泰裤辣 の Unity百宝箱】分享一套简单易用的游戏UI框架下一篇最新版UI框架代码 阅读 267 打工人小棋    

标签:四件套,Canvas,百宝箱,元素,摄像机,UI,组件,屏幕
From: https://www.cnblogs.com/Jimmy104/p/17933510.html

相关文章

  • 在nodejs环境里使用canvas和sharp生成图片
    1.安装依赖包npminstalljsdomcanvas2.实例代码const{JSDOM}=require('jsdom');const{createCanvas}=require('canvas');//创建一个虚拟DOM环境constdom=newJSDOM('<!DOCTYPEhtml><html><head></head><body>&......
  • canvas操作图片像素点保证你看的明明白白
    开场白今天遇到一个场景;就是更改一个图片的颜色;当听到这个。我直呼好家伙;这个是要上天了呀。但是仔细一思考;借助canvas好像也能实现;于是下来研究了一下,并不难;我们下面来看看怎么实现的基本思路主要是获取图片的像素点;ctx.getImageData()然后去更改图片的像素点;最后绘制在画布......
  • canvas操作图片像素点保证你看的明明白白
    开场白今天遇到一个场景;就是更改一个图片的颜色;当听到这个。我直呼好家伙;这个是要上天了呀。但是仔细一思考;借助canvas好像也能实现;于是下来研究了一下,并不难;我们下面来看看怎么实现的基本思路主要是获取图片的像素点;ctx.getImageData()然后去更改图片的像素点;最后绘制......
  • Canvas三种模式
    1.ScreenSpace-OverlayCanvas永远撑满屏幕并显示在最上层,不绑定Camera(有没有Camera都能显示)。适合用来做最上层的UI。导航栏、分辨率自适应两边的框等。2.ScreenSpace-CameraCanvas自动填充指定摄像机的屏幕,但其他游戏对象(模型等)可以在它之前显示,根据和指定摄像机距离调整是......
  • Lucky-Canvas抽奖插件的使用
    官方网站:https://100px.net/新建一个空白的js文件’lucky-canvas.js‘,复制官网的JS代码'https://unpkg.com/[email protected]/dist/index.umd.js'新建一个html网页'lucky-canvas.html',引入刚刚新建的js文件<!doctypehtml><html><head><metacharset="......
  • 微信小程序canvas实现人员签名
    这里使用获取canvas节点实现的小程序最新的api签字面板效果图        wxml部分:<view class="container" >  <view class="sig_txt">    <canvas type="2d" id="myCanvas"      style="width:{{width}}px;height:{{height}}p......
  • 手把手教你使用ArkTS中的canvas实现签名板功能
     一、屏幕旋转● 实现签名板的第一个功能就是旋转屏幕。旋转屏幕在各种框架中都有不一样的方式,比如:在H5端,我们一般是使用CSS中的transform属性中的rotate()方法来强制将网页横屏,然后实现一系列功能● 在嵌套第三方APP中,我们一般是调用对应的SDK提供的方法,即可实现旋转屏幕......
  • 开发案例:使用canvas实现图表系列之折线图
     一、功能结构实现一个公共组件的时候,首先分析一下大概的实现结构以及开发思路,方便我们少走弯路,也可以使组件更加容易拓展,维护性更强。然后我会把功能逐个拆开来讲,这样大家才能学习到更详细的内容。下面简单阐述下折线图组件的功能结构:以上是基础的功能结构框架,包含一些比......
  • js(canvas) 图片压缩
    1functioncompress(url,width,height){2returnnewPromise((resolve,reject)=>{3letimg=document.createElement('img')4img.onload=()=>{5letw=width6leth=img.naturalH......
  • uniapp 微信小程序使用canvas
    微信小程序基础库大于2.9.0后,canvas(画布)支持一套新Canvas2D接口(需指定type属性),同时支持同层渲染,原有接口不再维护。在这种情况下使用原有接口会报错,报错例如:1、使用ctx.draw()会报错:drawisnotafunction,原因:新版Canvas2D接口没有draw方法2、使用ctx.setfillStyle......