我想要实现的目标是:无论用户点击
我尝试过的方法是:更改层的顺序。
当用户在框碰撞器
我认为问题是一个
我正在使用透视相机。但在此场景中,所有元素都在相同的
如果我点击
A
中的哪个位置,包括 B
中的空间,牙刷都应该出现。但是显然,在 B
中单击不会显示牙刷(OnPointerDown
没有被触发)。我尝试过的方法是:更改层的顺序。
当用户在框碰撞器
A
内单击时,牙刷就会显示出来,但是如果用户在框碰撞器 B
内单击,则牙刷不会显示出来,这意味着 OnPointerDown
没有被触发。我认为问题是一个
BoxCollider2D
在另一个 BoxCollider2D
内部重叠造成的。在我的情况下,B
在 A
中,我认为这是罪魁祸首,但我不知道如何解决它,或者是否有另一种实现 OnPointerDown
的方法?我正在使用透视相机。但在此场景中,所有元素都在相同的
z 位置
,即0。是否可能在每个相应的 BoxCollider2D
中触发 IPointerHander 事件?
DragableObject.cs
这个脚本附加在牙刷上。 BoxCollider2D
A 也属于牙刷。
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("pointer down");
if (GetComponent<DragableObject>() == null)
return;
currentObject = GetComponent<DragableObject>();
MeshRenderer renderer = GetComponent<MeshRenderer>();
if (ShowOnTouch)
ShowObject();
// Store original state
originalPosition = transform.position;
originalOrderLayer = renderer.sortingOrder;
// Snap to mouse
Vector3 newPos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 30));
newPos.z = 30;
transform.position = newPos;
if (BringToFront)
{
if (renderer != null)
{
renderer.sortingOrder = 90;
}
}
ObjectActive.Invoke();
}
TargetListener.cs
这个脚本附加到了 BoxCollider2D
B 上。
public void OnPointerDown(PointerEventData eventData)
{
for (int i = 0; i < Affectors.Count; i++)
{
if (Affectors [i] == DragableObject.currentObject)
{
DragableObject.currentObject.OnEnterTarget(transform);
ITriggerEffect[] iTrigger = GetComponents<ITriggerEffect>();
for (int j = 0; j < iTrigger.Length; j++)
{
Debug.Log("iTrigger enter");
Debug.Log(iTrigger [j]);
iTrigger [j].Execute(eventData, PointerState.Down);
}
}
else
continue;
}
}
如果我点击
A
,牙刷会出现,但当我在 B
内部点击时不会出现。下面是调试日志。
这是附加了 dragable.cs
脚本的 *Toothbrush
本身所连接的 BoxCollider2D
。请注意,保留 HTML 标签。
更新:感谢其他回答者,问题对我来说变得更加清晰了。以下是BoxCollider2D
A和BoxCollider2D
B。它们都有脚本,其中大部分包含OnPointerHandler
。我如何确保在各自的BoxCollider2D
上触发所有OnPointerHandler
?
我遇到的问题:
- 当我的指针进入
B
时,A
上的 OnPointerExit 被触发。 - 如果在
B
内部点击,则只有在B
上触发 OnPointerDown,而不是在A
上。
BoxCollider2D B
的OnPointerDown代码中放置Debug.Log
并让我们知道是否正在调用。如果可能,请禁用除BoxCollider2D B
以外的其他碰撞器,并查看问题是否仍然存在。这是解决问题和帮助人们解决您的问题的方法,否则您将获得随机答案。 - Programmer