我正在Unity中编码库存窗口,该窗口看起来类似于点击游戏。有一个具有子对象(设备窗口图像)的画布,该画布具有在循环(插槽)中创建的子对象,并且每个插槽都有一个子对象(插槽中的图像项)。每个图像项(插槽的子项)都附加了特殊的脚本,该脚本允许处理拖放操作。该脚本的主要部分如下:
public InventoryPatternItem PatternItem;
private Vector3 defaultPosition;
public void OnBeginDrag (PointerEventData eventData)
{
this.GetComponent<CanvasGroup>().blocksRaycasts = false;
EquipmentManager.Instance.SelectedSlot = this.gameObject;
this.transform.parent.SetAsLastSibling();
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData)
{
this.GetComponent<CanvasGroup>().blocksRaycasts = true;
EquipmentManager.Instance.SelectedSlot = null;
this.transform.localPosition = this.defaultPosition;
}
public void OnDrop(PointerEventData eventData)
{
this.TryToConnectDroppedItems();
}
当我在图像上按住鼠标按钮时,单击项目,它紧随鼠标,然后释放鼠标按钮后,它又回到插槽,但在许多情况下,突然卡住了。尤其是如果FPS低于30帧,那么它就会经常发生。我将Debug.Log添加到函数OnBeginDrag,OnDrag和OnEndDrag中,看来当项目卡住时,不会调用OnEndDrag。另外,blocksRaycasts方法完全阻止了项目,使其无法移动,因此卡在插槽中或两个插槽之间,有时甚至卡在另一个插槽中。但是如果没有它,我将无法检查我是否可以将我正在放置的物品与其他物品连接起来。目前,唯一的解决方案是关闭(setActive(bool))并再次打开库存以使物品分类并能够工作。
我的问题是,我在做什么错,这是我的错吗?我写错了吗?或者也许是统一故障?
我添加了我的朋友制作的视频,以明确问题:https://www.youtube.com/watch?v=2ue0RxeqDQk
也是GFY:https://gfycat.com/HealthyHeartyAsiaticgreaterfreshwaterclam
最佳答案
我在工作中遇到OnEndDrag问题。似乎在各种情况下都不会调用它,并且它似乎是已知的Unity Bug:
https://issuetracker.unity3d.com/issues/onenddrag-slash-ienddraghandler-callback-is-not-invoked
https://issuetracker.unity3d.com/issues/ios-onenddrag-is-not-called-when-touch-input-module-is-used-and-it-is-above-standalone-input-module-in-the-inspector
不幸的是,后一个错误是“修复中的错误”,而前一个错误已在Unity的未来版本中修复。如果您可以更新,那就太好了,但是如果您不喜欢我,或者如果您的OnEndDrag问题有其他原因,我可以与您分享我们所使用的工作。根据以下链接中的用户Glurth:
https://answers.unity.com/questions/915214/onenddrag-event-not-called-after-alttab-bugs-or-wr.html
我们已经在跟踪拖动状态,因此我们使用Input.GetMouseButton(0)添加了对不再被按下的指针的检查。因此,如果拖动为true,而GetMouseButton(0)为false,则强制调用OnEndDrag逻辑。