Unity中使用RenderTexture判断不规则形状按钮的点击

对于判断不规则形状的按钮的点击,一般使用的方式是:

  1. 打开按钮图片的“Read/Write Enabled”选项,并设置图片的Image.alphaHitTestMinimumThreshold来判断alpha低于阈值的区域响应点击;
  2. 使用 PolygonCollider2D 并重写 Image 的 IsRaycastLocationValid 方法来判断;

但是上述方法都有各自的缺点,第一种方法开启 Read/Write 之后会使图片的内存占用翻倍,并且不支持Crunched压缩图片格式,第二种方法需要编辑多边形形状,对于有大量不规则图片按钮的项目来说有点耗时耗力。

为了解决上述问题,研究了另外一种方法来进行点击判断,原理很简单,就是用一个单独的shader将按钮的id(或者序号)通过同一个摄像机渲染到一张RenderTexture上,然后监听点击事件,点击之后根据点击的屏幕坐标从之前渲染的图上读取颜色信息,并转化回按钮的id(或者序号)来判断点中了哪个按钮。

此方法对于按钮位置变化不大,按钮数量又非常多的情况是比较合适的。只有在按钮有变化的情况下需要重新渲染一张位置贴图,其余时间只要监听点击事件并取样判断即可。如果精度要求不高,取样贴图的分辨率可以进一步降低以提高采样效率。对于原按钮图片几乎没有要求,可以关闭 Read/Write Enable,也可以设置任意压缩格式。

示例代码和shader如下:


public class TouchDetectHelp : MonoBehaviour {
   
	public Texture2D renderTex; // 渲染图,可以在Inspector面板检查
	public float sizeScale = 0.5f;
	
	// 在判断点击之前需要先调用,渲染一张按钮位置贴图
	public void CaptureButton()
	{
   
		var uiCam = ZGameRuntime.Instance.cameras.ui;
		var shaderToRender = Shader.Find("Custom/TouchDetect");
		RenderTexture rt = RenderTexture.GetTemporary(Mathf.RoundToInt(Screen.width * sizeScale), Mathf.RoundToInt(Screen.height * sizeScale));

		uiCam.targetTexture = rt;
		uiCam.RenderWithShader(shaderToRender, "RenderType");
		uiCam.targetTexture = null;

		Texture2D texture = new Texture2D(rt.width, rt.he

你可能感兴趣的:(unity开发,shader,unity3d,渲染,点击,不规则图形)