系列文章目录
unity工具
文章目录
- 系列文章目录
- 前言
- 一、使用rect.Contains()判断
- 1-1、转换坐标
- 1-2、代码如下:
- 1-3、注意事项
- 1-3、测试效果如下
- 二、使用坐标计算在不在区域内
- 2-1、方法如下:
- 2-2、注意事项
- 三、使用RectTransformUtility.ScreenPointToLocalPointInRectangle和坐标一起配合计算
- 3-1、代码如下:
- 3-2、注意事项
- 总结
前言
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
有时候需要判断玩家此时点击的某个点是否在某个指定的UI区域内,如果在区域内则响应点击事件,不在区域内时不进行响应事件。所以记录一下
一、使用rect.Contains()判断
1-1、转换坐标
把屏幕坐标转换成本地坐标
API:RectTransformUtility.ScreenPointToLocalPointInRectangle
然后在使用**Contains()**判断某个坐标点在不在该RectTransform里面了
1-2、代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIClickPosition : MonoBehaviour
{//判断的UI区域public RectTransform rectTrans;//用于坐标点是否在区域内的标记public Text txtFlag;private void Update(){GetClickArea(Input.mousePosition);}///传入某个坐标点进行判断public void GetClickArea(Vector2 point){Vector2 localPoint;//将屏幕坐标转化为相对rectTrans的本地坐标if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTrans, point, Camera.main, out localPoint)){//rectTrans.rect是rectTrans的本地坐标,不能rectTrans.rect.Contains(point)直接判断,必须先转为本地坐标localPoint//判断点击的坐标点是否在rectTrans.rect矩形内if (rectTrans.rect.Contains(localPoint)){txtFlag.color = Color.green;txtFlag.text = "鼠标在UI区域内哦";}else{txtFlag.color = Color.red;txtFlag.text = "鼠标不在UI区域内哦";}}}
}
1-3、注意事项
1.需要将Canvas设置成相机模式 ScreenSpace-Camera ,要不然没有反应
2.
1-3、测试效果如下
Unity判断屏幕中某个坐标点的位置是否在指定UI区域内
二、使用坐标计算在不在区域内
2-1、方法如下:
/// <summary>/// 使用坐标计算位置/// </summary>/// <param name="pos"></param>public void GetClickArea_pos(Vector3 pos){float _mapWidth = rectTrans.sizeDelta.x;float _mapHight = rectTrans.sizeDelta.y;//目标区域锚点为居中时使用 Pivot(0.5,0.5)if (pos.x < (rectTrans.position.x + _mapWidth / 2) && pos.x > (rectTrans.position.x - _mapWidth / 2) &&pos.y < (rectTrans.position.y + _mapHight / 2) && pos.y > (rectTrans.position.y - _mapHight / 2)){txtFlag.color = Color.green;txtFlag.text = "鼠标在UI区域内哦";}else{txtFlag.color = Color.red;txtFlag.text = "鼠标不在UI区域内哦";}}
2-2、注意事项
1.根据坐标计算位置不需要设置Canvas的渲染模式,反之设置成第二种模式,到不行了,不能使用了
2.但是目标图片中心点需要设置成居中
如下图
三、使用RectTransformUtility.ScreenPointToLocalPointInRectangle和坐标一起配合计算
1.把第一种第二种相结合,无需考虑中心点,锚点,
3-1、代码如下:
/// <summary>/// 第三种方法:使用RectTransformUtility配合坐标计算,无需考虑中心点,锚点/// </summary>/// <param name="pos"></param>public void GetClickArea_(Vector3 pos){Vector2 localPoint;//将选中的点转换为Image区域内的本地点RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTrans, pos, Camera.main, out localPoint);Vector2 pivot = rectTrans.pivot;Vector2 normalizedLocal = new Vector2(pivot.x + localPoint.x / rectTrans.sizeDelta.x, pivot.y + localPoint.y / rectTrans.sizeDelta.y);if ((normalizedLocal.x >= 0 && normalizedLocal.x <= 1) && ((normalizedLocal.y >= 0 && normalizedLocal.y <= 1))){txtFlag.color = Color.green;txtFlag.text = "鼠标在UI区域内哦";}else{txtFlag.color = Color.red;txtFlag.text = "鼠标不在UI区域内哦";}}
3-2、注意事项
1.第三种也是需要把相机模式改成和第一种里面使用的模式一样(ScreenSpace-Camera)
总结
不定时更新Unity开发技巧,觉得有用记得一键三连哦。
以上就是今天要讲的内容,有需要会继续补充