不规则图片的点击响应

2024-03-19 23:58
文章标签 图片 响应 点击 不规则

本文主要是介绍不规则图片的点击响应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考链接:http://www.xuanyusong.com/archives/3492

当点击一张不规则图片时,点击镂空区域时,还是会发生响应。



对于Image来说,判断是否点击有效的就是IsRaycastLocationValid函数了,因此要重写它。

另外要为不规则图片挂上PolygonCollider2D组件,圈出响应的范围。


using UnityEngine;  
using System.Collections;  
using UnityEngine.UI;  /// <summary>  
/// Image实现了接口ICanvasRaycastFilter  
/// 该接口有函数IsRaycastLocationValid,返回点击是否有效  
/// </summary>  
public class ImagePlus : Image {  PolygonCollider2D collider;  LineRenderer l;  void Awake()  {  collider = GetComponent<PolygonCollider2D>();  l = GetComponent<LineRenderer>();  }  override public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)  {  DrawLine();  return ContainsPoint(collider.points,sp);  }  //多边形顶点,屏幕点击坐标  bool ContainsPoint (Vector2[] polyPoints, Vector2 p)   {   int j = polyPoints.Length - 1;   bool inside = false;   for (int i = 0; i < polyPoints.Length; i++)   {  polyPoints[i].x += transform.position.x;  polyPoints[i].y += transform.position.y;  if ( ((polyPoints[i].y < p.y && p.y <= polyPoints[j].y) || (polyPoints[j].y < p.y && p.y <= polyPoints[i].y)) &&  (polyPoints[i].x + (p.y - polyPoints[i].y) / (polyPoints[j].y - polyPoints[i].y) * (polyPoints[j].x - polyPoints[i].x)) > p.x)   inside = !inside;  j = i;  }   return inside;   }  //画出多边形区域  void DrawLine()  {  l.SetVertexCount(collider.points.Length);  for (int i = 0; i < collider.points.Length; i++)  {  float x = collider.points[i].x + transform.position.x;  float y = collider.points[i].y + transform.position.y;  Vector3 a = new Vector3(x,y,0);  l.SetPosition(i,a);  }  }  
}  

解释:

1.PolygonCollider2D.points得到的点,其坐标是相对于图片中心的,也就是说,无论图片怎么移动,PolygonCollider2D.points中的点的坐标都是不变的,因此,为了得到多边形顶点的屏幕坐标,要加上图片的中心坐标。

2.算法是判断点是否在多边形内,原理可以看这里。其中涉及到射线与线段是否相交,要用到直线方程的点斜式,根据交点个数,从而判断点是否在多边形内。


在测试中,发现响应范围还是有一些误差,在某些离边缘外较近的地方还是会有响应,调整了一些参数还是不能解决,这里先放一放了。


//

后来发现一个更简单的方法:

using UnityEngine;  
using System.Collections;  
using UnityEngine.UI;  public class TestTouch : MonoBehaviour {  private Image image;  private PolygonCollider2D polygonCollider2D;  // Use this for initialization  void Start ()   {  image = GetComponent<Image>();  polygonCollider2D = GetComponent<PolygonCollider2D>();  }  // Update is called once per frame  void Update ()   {  if(Input.GetMouseButtonDown(0))  if (polygonCollider2D.OverlapPoint(Input.mousePosition))  image.enabled = !image.IsActive();  }  
}  



这篇关于不规则图片的点击响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827640

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

恶意PNG:隐藏在图片中的“恶魔”

&lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/bffb187dc3546c6c5c6b8aa18b34b962.jpeg&quot; title=&quot;214201hhuuhubsuyuukbfy_meitu_1_meitu_2.jpg&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;