如何缩小按钮的碰撞箱
How to scale down button hitbox
在我的项目中我有一个按钮,这个按钮有一定的大小并且有children。我的问题是所述按钮的点击框太大,您可以从它显示的图像外部单击它。
为此,我想保留按钮附带的所有动画和事件,但我想缩小它的点击框。要么通过仅允许在图像的非透明部分上调用 OnClick 事件来缩小它,要么通过缩小矩形命中来缩小它这可能吗?我在网上查了下,没说缩小,只说放大。
这是我的按钮的样子:
MyButton:图片、按钮、动画师
标题:正文
乘数:文本
发光:图像、动画
当我按下按钮时,我更改了 MyButton 的图像并启用了带有动画的发光图像,使其看起来像是在发光。
有什么方法可以缩小按钮的点击框吗?
谢谢。
您可以通过将此脚本添加到所述按钮然后向其添加某种 2D 碰撞器来实现。我将此用于一些不规则的按钮 shape.You 可以使用适合您的按钮的任何对撞机。请注意,还有一种方法可以使点击忽略透明部分,但我更喜欢这种方法。
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(RectTransform), typeof(Collider2D))]
public class Collider2DRaycastFilter : MonoBehaviour, ICanvasRaycastFilter
{
Collider2D myCollider;
RectTransform rectTransform;
void Awake()
{
myCollider = GetComponent<Collider2D>();
rectTransform = GetComponent<RectTransform>();
}
#region ICanvasRaycastFilter implementation
public bool IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera)
{
var worldPoint = Vector3.zero;
var isInside = RectTransformUtility.ScreenPointToWorldPointInRectangle(
rectTransform,
screenPos,
eventCamera,
out worldPoint
);
if (isInside)
isInside = myCollider.OverlapPoint(worldPoint);
return isInside;
}
#endregion
}
在我的项目中我有一个按钮,这个按钮有一定的大小并且有children。我的问题是所述按钮的点击框太大,您可以从它显示的图像外部单击它。
为此,我想保留按钮附带的所有动画和事件,但我想缩小它的点击框。要么通过仅允许在图像的非透明部分上调用 OnClick 事件来缩小它,要么通过缩小矩形命中来缩小它这可能吗?我在网上查了下,没说缩小,只说放大。
这是我的按钮的样子:
MyButton:图片、按钮、动画师
标题:正文
乘数:文本
发光:图像、动画
当我按下按钮时,我更改了 MyButton 的图像并启用了带有动画的发光图像,使其看起来像是在发光。
有什么方法可以缩小按钮的点击框吗?
谢谢。
您可以通过将此脚本添加到所述按钮然后向其添加某种 2D 碰撞器来实现。我将此用于一些不规则的按钮 shape.You 可以使用适合您的按钮的任何对撞机。请注意,还有一种方法可以使点击忽略透明部分,但我更喜欢这种方法。
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(RectTransform), typeof(Collider2D))]
public class Collider2DRaycastFilter : MonoBehaviour, ICanvasRaycastFilter
{
Collider2D myCollider;
RectTransform rectTransform;
void Awake()
{
myCollider = GetComponent<Collider2D>();
rectTransform = GetComponent<RectTransform>();
}
#region ICanvasRaycastFilter implementation
public bool IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera)
{
var worldPoint = Vector3.zero;
var isInside = RectTransformUtility.ScreenPointToWorldPointInRectangle(
rectTransform,
screenPos,
eventCamera,
out worldPoint
);
if (isInside)
isInside = myCollider.OverlapPoint(worldPoint);
return isInside;
}
#endregion
}