一种是alpha检测
一种是设置collider
参考:
https://zhuanlan.zhihu.com/p/34204396
下面给出第二种方案代码
///按钮多边形点击方案,注意Canvas模式应该是Screen Space - Camera 需设置 Render Camera ///选中按钮右键UI->变更为多边形按钮,编辑子物体的Collider2D即可 ///如果无法编辑Collider 则是Unity编辑器bug 切换下Unity编辑器的布局模式,即可恢复正常 using UnityEngine; using UnityEngine.UI; #if UNITY_EDITOR using UnityEditor; #endif [RequireComponent(typeof(PolygonCollider2D))] public class NonRectangularButtonImage : Image { private PolygonCollider2D areaPolygon; protected NonRectangularButtonImage() { useLegacyMeshGeneration = true; } private PolygonCollider2D Polygon { get { if (areaPolygon != null) return areaPolygon; areaPolygon = GetComponent<PolygonCollider2D>(); return areaPolygon; } } protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); } public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) { return Polygon.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint)); } #if UNITY_EDITOR protected override void Reset() { base.Reset(); transform.localPosition = Vector3.zero; var w = rectTransform.sizeDelta.x * 0.5f + 0.1f; var h = rectTransform.sizeDelta.y * 0.5f + 0.1f; Polygon.points = new[] { new Vector2(-w, -h), new Vector2(w, -h), new Vector2(w, h), new Vector2(-w, h) }; } #endif } #if UNITY_EDITOR [CustomEditor(typeof(NonRectangularButtonImage), true)] public class CustomRaycastFilterInspector : Editor { public override void OnInspectorGUI() { } } public class NonRectAngularButtonImageHelper { [MenuItem("GameObject/UI/变更为多边形按钮")] public static void CreateNonRectAngularButtonImage() { var goRoot = Selection.activeGameObject; if (goRoot == null) return; var button = goRoot.GetComponent<Button>(); if (button == null) { Debug.Log("Selecting Object is not a button!"); return; } // 关闭原来button的射线检测 var graphics = goRoot.GetComponentsInChildren<Graphic>(); foreach (var graphic in graphics) { graphic.raycastTarget = false; } var polygon = new GameObject("NonRectangularButtonImage"); polygon.AddComponent<PolygonCollider2D>(); polygon.AddComponent<NonRectangularButtonImage>(); polygon.transform.SetParent(goRoot.transform, false); polygon.transform.SetAsLastSibling(); //设置锚点方案,注意rect transfrom的框必须包住多边形,否则超出的部分无效 polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 0); polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 0); polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 0); polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 0); polygon.GetComponent<RectTransform>().anchorMin = new Vector2(0, 0); polygon.GetComponent<RectTransform>().anchorMax = new Vector2(1, 1); } } #endif
原文地址:https://www.cnblogs.com/sanyejun/p/11231406.html
时间: 2024-10-15 01:39:36