unity不规则按钮透明点击偏移问题

来源:互联网 发布:eva分析软件 编辑:程序博客网 时间:2024/05/29 15:52

因为最近做的东西需要不规则的UI,或者不规则的热点区域

使用eventAlphaThreshold(用的是5.3当然之后版本这个换成了alphaHitTestMinimumThreshold)

首先就想到了以前看过的使用alpha透明点击的方法(图片比较复杂,不适合画线)如下图


简单的代码如下,然后图片设置勾一个read/write,放在按钮上一般就可以了

using UnityEngine;using System.Collections;using UnityEngine.UI;using UnityEngine.EventSystems;public class alphaClick : MonoBehaviour, IPointerClickHandler{// Use this for initializationvoid Start () {        GetComponent<Image>().eventAlphaThreshold = 0.5f;    }    public void OnPointerClick(PointerEventData eventData)    {        Debug.Log("这是一个圆形!");    }    // Update is called once per frame    void Update () {}}


但后来发现有的图片居然点击位置居然会不是很准确,一般点击区域会偏下

透明地方会响应,上面不透明的地方反而没反应

一开始还以为阈值设置问题或者是ps保存png的问题

后来才发现是unity图片设置问题

因为这样图片没有问题


而下面周边为了调整空间位置和大小故意留空白的图就有问题


从而发现了unity图片sprite设置里一般教程都没提到的一个问题

那就是mesh type设置


简单说用Tight模式如果你的图片周围有空白像素,它会帮你压缩掉减小面积(大量半透明绘制就减少drawcall啦),但是使用sprite的时候会增加面数;

如果用Full Rect模式不会压缩,也不会增加面数,其实就是一个quad,但是东西很多时候在渲染的时候空白的地方会产生大量drawcall,你把可以放到场景里看下就知道了面数了,但这个也造成了偏移,要注意了

这个功能很像2D物理碰撞的碰撞体的边界,不同的是这个是影响drawcall的(和碰撞没关系,要是有关系的话就是算法比较类似吧,但这个不能手动调,只能通过Extrude Edges里面参数调整),就像其他3d物体的渲染边界框(bounds)一样



绿色是2d碰撞体

黑色是mesh type 里tight模式分割结果


当然这个设置,unity本身也并不能处理很好,就像polygon collider 2d一样有其他生成方法

比如SpriteSharp  https://www.assetstore.unity3d.com/en/#!/content/37599


参考

https://docs.unity3d.com/ScriptReference/UI.Image-eventAlphaThreshold.html

https://forum.unity3d.com/threads/wip-tight-mesh-sprites-configurable-and-optimized.319608/

0 0
原创粉丝点击