Unity 不规则按钮Custom2DCollider

来源:互联网 发布:linux安装软件sudo 编辑:程序博客网 时间:2024/06/10 23:24

有时候产品需求按钮不能是长方形,要三角形,五边形,甚至五角星行,这时你是不是方了,怎么做???

别鸡冻,其实unity有现成的哦!!!PolygonCollider2D!!!


给你的UI加上这个组件PolygonCollider2D,你就可以自定义形状了!

当然形状也可以代码控制,就是设置不规则图形的顶点位置,代码如下:

using UnityEngine;using System.Collections;using UnityEngine.EventSystems;public class CustonCollider2D : MonoBehaviour, IPointerClickHandler{    /// <summary>    /// 多边形碰撞器    /// </summary>    private PolygonCollider2D polygonCollider;    private RectTransform rectTransform;    void Start()    {        //获取多边形碰撞器        polygonCollider = transform.GetComponent<PolygonCollider2D>();        //获取RectTransform        rectTransform = transform.GetComponent<RectTransform>();        Vector2[] v = new Vector2[6];        v[0] = new Vector2(-40, -15);        v[1] = new Vector2(-20, 40);        v[2] = new Vector2(25, 30);        v[3] = new Vector2(40, 0);        v[4] = new Vector2(40, -40);        v[5] = new Vector2(-40, -40);        SetPolygonColliderPoints(v);    }    public void OnPointerClick(PointerEventData eventData)    {        //这里做一些鼠标点击位置相对于Collider的位置处理        Vector2 local;        local.x = eventData.position.x - (float)Screen.width / 2.0f - rectTransform.localPosition.x;        local.y = eventData.position.y - (float)Screen.height / 2.0f - rectTransform.localPosition.y;        bool isIn = IsPointInPolygon(local, polygonCollider.points);        Debug.Log("看我有没有点击到你的Collider之内: " + isIn);    }    /// <summary>    /// 设置PolyCollider2D的顶点的位置    /// </summary>    /// <param name="vecs">Collider的顶点位置信息,最好按顺序编排,3个顶点以上才能构成一个平面哦</param>    public void SetPolygonColliderPoints(Vector2[] vecs)    {        polygonCollider.points = vecs;    }    /// <summary>    /// 判断鼠标点击点是否在PolygonCollider2D之内    /// </summary>    /// <param name="point">鼠标点击位置</param>    /// <param name="polygon">Collider的顶点位置信息</param>    /// <returns></returns>    public bool IsPointInPolygon(Vector2 point, Vector2[] polygon)    {        int polygonLength = polygon.Length;        int i = 0;        bool inside = false;        float pointX = point.x;        float pointY = point.y;        float startX, startY, endX, endY;        Vector2 endPoint = polygon[polygonLength - 1];        endX = endPoint.x;        endY = endPoint.y;        while (i < polygonLength)        {            startX = endX;            startY = endY;            endPoint = polygon[i++];            endX = endPoint.x;            endY = endPoint.y;            inside ^= (endY > pointY ^ startY > pointY) && ((pointX - endX) < (pointY - endY) * (startX - endX) / (startY - endY));        }        return inside;    }}

0 0
原创粉丝点击