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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章