一、事件监听接口
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、主要属性