unity3d - Unity 2D 拖放问题 iDropHandler
问题描述
我有一个实现 IBeginDragHandler、IDragHandler、IEndDragHandler 的可拖动游戏对象(砖)
我还有另一个游戏对象(插槽)可以将砖块放入实现 IDropHandler
快速浏览一下 Bricks 的 OnBeginDrag 方法:
public static GameObject itemBeingDragged;
Vector3 startPosition;
Transform startParent;
public void OnBeginDrag(PointerEventData eventData)
{
itemBeingDragged = gameObject;
startPosition = transform.position;
startParent = transform.parent;
GetComponent<CanvasGroup>().blocksRaycasts = false;
GetComponent<BoxCollider2D>().enabled = false;
}
当我将砖块放入槽中时,砖块将槽假定为父槽并假定槽位置,就像在 IDropHandler 的 OnDrop 方法代码中一样:
public void OnDrop(PointerEventData eventData)
{
DragHandler.itemBeingDragged.transform.SetParent(transform);
DragHandler.itemBeingDragged.transform.position = transform.position;
}
问题是当我拖放砖块时,我希望砖块的位置有轻微的偏移(例如在手机上,这样在拖动砖块时,砖块不会被我的手指在视觉上隐藏)
所以在 Bricks OnDrag 代码中,我有类似的东西来提供视觉偏移:
public void OnDrag(PointerEventData eventData)
{
Vector3 offset = new Vector3(0, 100, 0);
transform.position = Input.mousePosition + offset;
}
我知道以上是针对鼠标位置的,但最终我希望它是触摸位置。
拖动时看起来不错,但是,将其放在插槽上时,似乎仅当鼠标指针在插槽上方时才调用插槽的 OnDrop 方法,而不是在砖块在插槽上方时调用。这意味着当我在砖块位于插槽上方时释放阻力时,不会调用 OnDrop。只有当我以鼠标指针位于插槽内的方式释放插槽外的砖块时才会调用它。说得通?
有没有办法让 OnDrop 在砖块位置而不是鼠标位置上工作?
谢谢凯文
解决方案
这最终是一个 hack,这正是我喜欢使用指针向下/向上事件执行我自己的拖放逻辑的原因,但无论如何:使视觉对象成为附加砖脚本的游戏对象的子对象,然后只移动拖动开始时的视觉效果。拖动完成后,将视觉对象向下移回原位。
顺便说一句,您正在使用SetParent(transform)
看起来像RectTransform
. 您通常希望使用SetParent(transform, false)
rect 变换,因为否则您会弄乱布局系统并失去 rect 变换的好处。
推荐阅读
- c# - 在同一个应用服务中托管多个不相关的 API
- azure - Azure ARM 模板 - vnet 示例
- go - 无法从 Google 获取访问令牌
- java - Catch() 不捕获异常
- flask - 雪花 OAuth 烧瓶
- asp.net-mvc - 在 Razor View 的@html.ActionLink 中,我们如何传递下拉列表的值?
- javascript - 循环开始时,我的函数不会重新触发动画。红绿灯闪烁信号一次工作
- android-layout - 内部空心形状矩形可绘制/画布形状
- html - Bootstrap - 在页面顶部放置导航栏,然后将表单居中
- java - java spring boot oracle cdc debezium