Unity 不规则按钮实现
阅读原文时间:2023年07月09日阅读:2

  1.先重写Image类,实现对Image图形范围的重写;

  2.对不规则按钮添加Polygon Collider2D组件,调整大小圈中要点击的范围;

  3.将重写的Image类添加到不规则按钮上时,需要移除不规则按钮上原来的Image组件,因为这个是继承Image,一个物体上不能同时有两个Image组件,并取消注释下面不绘制图片的代码;

或者在不规则按钮下新建个空物体添加脚本,此时需要注意取消勾选父物体的Image组件的Raycast Target属性,并且不规则按钮下的Image、Text等都需要取消勾选该属性。

  4.注意 IsRaycastLocationValid(判断点击是否生效的范围) 的判断区域是RectTransform的区域。 如果 polygon Collider编辑出来的区域大于RectTransform , 必须调节RectTransform的区域。

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(PolygonCollider2D))]
public class MyUIPolygon : Image
{
// Polygon -- 多边形
private PolygonCollider2D polygon = null;
public PolygonCollider2D Polygon {
get {
if (polygon == null)
polygon = transform.GetComponent();
return polygon;
}
}

#region 不绘制图片  
//protected MyUIPolygon()  
//{  
//    useLegacyMeshGeneration = true;  
//}

////UI元素需要生成顶点时的回调函数  
////由 Text、Image 和 RawImage 使用,例如用于生成特定于其用例的顶点  
////VertexHelper:可辅助为 UI 生成网格的 Utility 类。  
//protected override void OnPopulateMesh(VertexHelper vh)  
//{  
//    vh.Clear();  
//}  
#endregion

//检测点击到的图片位置是否生效  
//相机必须为正交视角。具体不知道  
//IsRaycastLocationValid 给定一个点和一个摄像机,判断射线投射是否有效。  
//重载该方法 该方法会在父类中调用  
//重新该方法还可以阻断子物体接收射线检测  
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)  
{  
    //point 世界空间中的点。  
    bool isResult = Polygon.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint));  
    print(isResult);  
    return isResult;  
}

#if UNITY_EDITOR
//重置PolygonCollider2D大小和图片位置
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)
};
}
[CustomEditor(typeof(MyUIPolygon), true)]
public class MyUIPolygonInspector : Editor
{
public override void OnInspectorGUI()
{

    }  
}  

#endif

}

详细的可以看雨松大大的文章 https://www.xuanyusong.com/archives/3492