Unity学习之UGUI进阶

一、事件监听接口

1、作用

用于实现类型长按、双击、拖拽等基础控件无法实现的功能

所有控件都能够添加更多的事件监听来处理对应的逻辑

2、事件监听接口类型

(1)常用事件接口

(2)不常用事件接口

3、使用事件监听接口

(1)使用方法

a、引用命名控件using UnityEngine.EventSystems;

b、继承接口

c、实现接口中的内容

d、将该脚本挂载到想要监听自定义事件的UI控件上

(2)具体实现例子

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class L8 : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerDownHandler,IPointerUpHandler
{

    public void OnPointerEnter(PointerEventData eventData)
    {
        print("鼠标进入");
        
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        print("鼠标离开");
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        print("鼠标抬起");
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        print("鼠标按下");
    }
}

4、PointerEventData参数的关键内容

5、总结

(1)好处

可以实现一些长按、双击拖拽等功能

(2)坏处

不方便管理,需要自己写脚本继承接口挂载到对应控件上,比较麻烦

二、事件触发器

1、作用

EventTrigger,集成了所有事件接口的脚本,可以更加方便地位控件添加事件监听

2、如何使用事件触发器

(1)拖拽脚本进行关联


(2)使用代码进行添加关联

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class EnvTrigger : MonoBehaviour
{
    public EventTrigger envTrigger;
    // Start is called before the first frame update
    void Start()
    {
        //声明一个希望监听的事件对象
        EventTrigger.Entry entry = new EventTrigger.Entry();
        //声明 事件的类型
        entry.eventID = EventTriggerType.PointerDown;
        //监听函数关联
        entry.callback.AddListener((data) =>
        {
            print("鼠标按下" + "  " + data);
        });

        //将声明好的事件对象 加入到EventTrigger中
        envTrigger.triggers.Add(entry);
    }
}

3、总结

EventTrigger可以让我们写更少的代码,可以在面板类中处理面部控制的事件逻辑,更加的面向对象,便于管理

三、屏幕坐标转UI坐标

1、RectTransformUtility类

RectTransformUtility类,是RectTransform的辅助类

主要用于进行一些坐标的转换

其中最重要的函数就是将屏幕控件上的点,转换成UI本地坐标下的点

2、将屏幕坐标转换成UI本地坐标系下的点

(1)方法

RectTransformUtility.ScreenPointToLocalPointInRectangle(参数一,参数二,参数三,参数四)

参数一:相对父对象

参数二:屏幕点

参数三:摄像机

参数四:最终得到的点

一般配合拖拽事件使用

csharp 复制代码
public void OnDrag(PointerEventData eventData)
    {
        Vector2 UIposition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(this.transform.parent as RectTransform,eventData.position,eventData.pressEventCamera,out UIposition);
        this.transform.localPosition = UIposition;
        print("屏幕坐标" + eventData.position);
        print("UI坐标" + UIposition);
    }

四、遮罩

1、作用

在不改变图片的情况下,让图片在游戏中只显示其中一部分

2、使用方法

(1)关键组件 Mask

实现遮罩效果需要添加Mask组件

通过在父对象上添加Mask组件即可遮罩其子对象

(2)注意点

想要被遮罩的Image需要勾选Maskable

只要父对象添加了Mask组件,那么所有的UI子对象都会被遮罩

遮罩父对象图片的制作,不透明的地方显示,透明的地方被遮罩

五、模型和粒子显示在UI之前

1、模型显示在UI之前

(1)方法一:直接用摄像机渲染3D物体

Canvas的渲染模式不能是覆盖模式

摄像机模式和世界模式都可以让模型显示在UI之前(Z轴元素在UI元素之前即可)

注意点:

摄像机模式时建议用专门的摄像机渲染UI相关

面板上的3D物体建议也用UI摄像机进行渲染

(2)方法二:将3D物体渲染在图片上,通过图片显示

专门使用一个摄像机渲染3D模型,将其渲染内容输出到Render Texture上

类似小地图的制作方式

再将渲染的图显示在UI

该方式,不管Canvas的渲染模型是哪种都可以使用

2、粒子特效显示在UI之前

粒子特效的显示和3D物体类似

注意点:

在摄像模式下时,可以在粒子组件的Renderer相关参数Order in Layer中改变排序层,让粒子特效始终显示在其之前不受z轴影响

六、异形按钮

1、什么是异形按钮

图片形状不是传统矩形的按钮

2、如何让异形按钮能够准确点击

(1)通过添加子对象的形式

增加多个透明子对象,将透明子对象拼凑出异形形状,从而实现异形按钮

(2)通过代码改变图片的透明度相应阈值

csharp 复制代码
	public Image image;
    // Start is called before the first frame update
    void Start()
    {
        image.alphaHitTestMinimumThreshold = 0.1f;
    }

七、CanvasGroup

1、作用

实现整体控制一个面板的淡入淡出或者整体禁用

2、主要属性


相关推荐
AH_HH8 小时前
如何学习Vue设计模式
vue.js·学习·设计模式
雪碧透心凉_8 小时前
Win32汇编学习笔记09.SEH和反调试
汇编·笔记·学习
XWM_Web8 小时前
JavaAPI.02.包装类与正则表达式
java·开发语言·学习·eclipse
破浪前行·吴9 小时前
【初体验】【学习】Web Component
前端·javascript·css·学习·html
PangPiLoLo9 小时前
架构学习——互联网常用架构模板
java·学习·微服务·云原生·架构·系统架构·nosql
跳跳的向阳花9 小时前
05、Docker学习,常用安装:Mysql、Redis、Nginx、Nacos
学习·mysql·docker
14_1110 小时前
Cherno C++学习笔记 P51 创建并使用库
c++·笔记·学习
浅陌sss10 小时前
Unity中 Xlua使用整理(一)
unity·游戏引擎
Heavydrink11 小时前
Spring学习笔记2
笔记·学习·spring