当前位置:   article > 正文

UGUI笔记—Canvas、Image_unity 怎么设置canvas 上的 render camera

unity 怎么设置canvas 上的 render camera

UGUI基础

Unity版本 2021.3.9f

UI容器Canvas

UI元素想要被相机渲染,要么挂载在Canvas节点下
在这里插入图片描述

要么自带Canvas组件
在这里插入图片描述
在场景中的UI元素的渲染以场景相机位置为准
在这里插入图片描述

Canvas的属性
在这里插入图片描述

1. Render Model 有三个参数
Screen Space - Overlay

Canvas 覆盖屏幕,且永远覆盖在其它元素的上层。UI会遮盖住场景中的其它元素。
Overlay模式下的参数
  Pixel Perfect: UI元素精确大像素对齐,边缘会更加清晰。
  Sort Order: Canvas的深度值。存在多个Canvas时,Sort Order值更大的Canvas会覆盖住值较小的Canvas。多个Canvas深度值相等时,Hierarchy视图中后面的Canvas显示在下面。这一点与UI元素的规则(下面的元素显示在前面)相反。
  Additional Shader Channels: 设置要在创建 Canvas 网格时使用的附加着色器通道的遮罩。

Screen Space - Camera

和Overlay模式相似,Canvas覆盖整个屏幕空间。不同之处在于Canvas被放置于指定摄像机的前方。这种模式下场景中的3D元素可以渲染在UI元素之上。
在这里插入图片描述
Camera模式下的参数
  Pixel Perfect : 与Overlay模式相同
  Render Camera: 指定用来渲染的相机
  Plane Distance Canvas: 平面与相机的距离
  Sorting Layer: 指定Canvas的深度,可以手动添加。当存在多个Camera模式的Canvas时,Sorting Layer 决定显示的优先级
  Order in Layer: 多个Canvas具有相同的Sorting Layer时,根据Order in Layer决定显示优先级。
  Additional Shader Channels: 同上
必须在相机的远近平面中才会被渲染
相机的平移旋转缩放以及fov不会影响Canvas显示结果,Canvas位置依旧固定
即使相机是Perspective模式,Canvas距离摄像机的远近也不会影响其显示的大小

World Space

这种模式下,Canvas与场景中的3D元素没有区别
World Space模式下的参数
  Event Camera: 指定接受事件的相机
  Sorting Layer:同上
  Order in Layer:同上
  Additional Shader Channels:同上

Canvas Scaler
UI Scale Mode

需要EventCamera来指定接受事件的相机
相机的平移旋转缩放以及fov都会影响Canvas显示

1. Image

图片Inspector面板常用的参数

Texture Type :
    Default: 普通贴图,此时不能添加给Image
    Normal map:法线贴图
    Editor GUI and Legacy GUI:UI贴图
    Sprite(2D and UI):精灵,此时可以添加给Image使用
    Cursor:鼠标指针
    Cookie:遮罩贴图
    Lightmap:烘焙贴图
    Reflection:反射贴图
    Advanced:高级(可自定义一些贴图属性)
    Single Channel 单通道
    UI编辑中一般选择Sprite
Sprite Mode:
    Single: 单一,将图片设置为单独的精灵。
    Multiple: 多个,将图片切割成多个小图或者一张需要的图。
    Polygon: 多边形,设置图片自己的纹理网格。
打开Sprite Editor可以看到以上模式的差别。
    这个一般默认选择Single
Packing Tag:: 打包的标签,图片资源最后打包的时候会将相同Tag的小图打包成一个大图。2019以后Unity自行打包图集,所以这个选项就无法使用了。当然也可以手动创建图集进行打包。
如何打包图集
Pixels Per Unit: 设置像素单位与Unity单位的转换比例,默认:100。表示100个像素等于一个Unity单位(一格)
Mesh Type:
    Full Rect:使用和纹理大小一样的矩形。这个模式下生成的网格数量少,适用于精灵较多使用的场景。
    Tight:基于alpha尽可能多的裁剪像素。这个模式下生成的网格很多,适用于较少使用的精灵。
    Extrude Edges:精灵生成的网格周围要留下多少空白区域。
    Pivot: 锚点(图片自身原点)的位置,center(0.5,0.5);
Sprite Editor:精灵编辑器:编辑精灵数据的窗口,根据Sprite Mode会显示不同的编辑模式。Single模式下编辑精灵的九宫格切割数值。

Multiple切图及使用
  1. Texture Type选择 Sprite(2D and UI)

  2. Sprite Mode 选择 Multiple

  3. 点击Sprite Editor,提示编辑器未安装的:打开Window->Package Manager,勾选Unity Registry,等刷新出来列表后选择2D Sprite,点击install进行安装即可使用。

  4. 在这里插入图片描述

  5. 在Sprite Editor中点击Slice在这里插入图片描述点击右下角的Slice就自动裁切了。在这里插入图片描述

  6. 在这里插入图片描述
    点击Apply应用即可。

  7. 代码中加载及使用:

private Sprite[] sprites_green;
private void Awake()
    {
    	// 图片地址:Assets/Resources/ui_images/bag/btn_tab.png
    	// 加载方式1
        sprites_green = Resources.LoadAll<Sprite>("ui_images/bag/btn_tab");
        // 加载方式2
        // sprites_green = AssetDatabase.LoadAllAssetsAtPath("Assets/Resources/ui_images/bag/btn_tab.png").OfType<Sprite>().ToArray();
        // 使用
        img_0.GetComponent<Image>().sprite = sprites_green[0];
        img_1.GetComponent<Image>().sprite = sprites_green[1];
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
Image组件

在这里插入图片描述
**Source Image:**图片来源,将设置好的图片直接拖进去即可。
Color: 设置图片混色参数,白色就是原色,A值为图片的透明度。
Material: 图片材质,可以将需要的材质球拖进去。
Raycast Target 射线检测目标。设置是否接受点击。
Image Type: 图片类型:
  simple 缩放的类型为拉伸
  Tiled 缩放的类型是平铺
  Slice 缩放的类型是九宫格缩放(选择的精灵要先设置九宫格数据,点击目标精灵,选择Single模式,在Inspector面板中选择Sprite Editor,设置九宫格切割线图片的四个角不变,拉伸缩放其它5个矩形区域
  Filed 指定区域显示:
    Filed Method: Radial 90/180/360。按照角度裁剪。Vertical垂直裁剪,Horizontal水平裁剪。
    Filed Origin: 裁剪起始的点。
    Filed Amount: 裁剪的比例,0-1进度条是递增的,1-0进度条是递减的。
    Clock Wise: 逆时针/顺时针(勾选的时候为顺时针)。

如何给图片添加点击事件?

点击事件代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class EventListener : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler
{
    public Action onclick;
    public Action onPointDown;
    public Action onPointUp;

    public Action onLongPress;
    public float durationThreshold = 0.4f;
    private bool isPointerDown = false;
    private bool longPressTriggered = false;
    private float timePressStarted;

    void Update()
    {
        if (onLongPress != null && isPointerDown && !longPressTriggered)
        {
            if (Time.time - timePressStarted > durationThreshold)
            {
                longPressTriggered = true;
                onLongPress.Invoke();
            }
        }
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (!longPressTriggered)
        {
            if (onclick != null) onclick();
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        timePressStarted = Time.time;
        isPointerDown = true;
        longPressTriggered = false;

        if (null != onPointDown) onPointDown();
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        if (null != onPointUp) onPointUp();
        isPointerDown = false;
    }

    public static EventListener AddEventListenr(GameObject obj)
    {
        EventListener listener = obj.GetComponent<EventListener>();
        if (listener == null)
        {
            listener = obj.AddComponent<EventListener>();
        }

        return listener;
    }

    public static void RemoveEventListener(GameObject obj)
    {
        EventListener listener = obj.GetComponent<EventListener>();
        if (listener == null) return;
        GameObject.Destroy(listener);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
UI界面中调用
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ListenerTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Action action = new Action(onClick);
        EventListener listener = EventListener.AddEventListenr(transform.gameObject);
        listener.onclick += action;
    }

    private void onClick()
    {
        Debug.Log("点击事件");
        EventListener.RemoveEventListener(transform.gameObject);
		// 获取到Image组件
        Image img = transform.GetComponent<Image>();
        // 修改颜色,透明度,数值0-1对应色值0-255
        img.color = new Color(img.color.r, img.color.g, img.color.b, 0.3f);
        // 接受点击
        img.raycastTarget = true;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/111221
推荐阅读
相关标签
  

闽ICP备14008679号