C# 游戏对象在OnDrag期间消失

C# 游戏对象在OnDrag期间消失,c#,unity3d,eventhandler,unity-ui,C#,Unity3d,Eventhandler,Unity Ui,我有一个库存系统,主要是基于我目前正在修改的过程。OnBeginDrag和OnEndDrag按预期工作,但OnDrag虽然不断更新项目的位置,但不显示项目。它在OnDrag期间消失,并在放入新插槽后重新出现 以下是我的层次结构: 值得注意的是这两个摄像头。据我所知,地下城小组和地下城画布使用地下城摄影机。直到最近,地下城组还是一个完全不同的场景。在我整合场景之前,OnDrag工作正常,这让我觉得可能是相机问题造成的 以下是我目前使用的代码: 公共类DragHandler:MonoBehavior

我有一个库存系统,主要是基于我目前正在修改的过程。OnBeginDrag和OnEndDrag按预期工作,但OnDrag虽然不断更新项目的位置,但不显示项目。它在OnDrag期间消失,并在放入新插槽后重新出现

以下是我的层次结构:

值得注意的是这两个摄像头。据我所知,地下城小组和地下城画布使用地下城摄影机。直到最近,地下城组还是一个完全不同的场景。在我整合场景之前,OnDrag工作正常,这让我觉得可能是相机问题造成的

以下是我目前使用的代码:

公共类DragHandler:MonoBehavior、IBeginDragHandler、IDragHandler、IENDragHandler { 公共静态游戏对象项;//项被拖动 公共静态矢量3起始位置; 公共静态转换起始租金; 在BegindRagPointerEventData事件数据上公共无效 { 物品=游戏对象; startPosition=transform.position; startParent=transform.parent; GetComponent.blocksRaycasts=false; transform.SetParenttransform.root; } 公共无效OnDragPointerEventData事件数据 { transform.position=Input.mousePosition; } 公共无效OnEndAddressPointerEventData事件数据 { item=null; 如果transform.parent==startParent | | transform.parent==transform.root { transform.position=起始位置; transform.SetParentstartParent; } GetComponent.blocksRaycasts=true; } }
画布的工作原理与世界空间对象略有不同。从Unity的报告中可以看出:

画布中的UI元素按照它们在层次结构中出现的相同顺序绘制。首先绘制第一个子对象,然后绘制第二个子对象,依此类推。如果两个UI元素重叠,则后一个元素将显示在前一个元素的顶部


将变换移动到根时,将对象在UI层次结构中向上移动,从而首先绘制该对象。因为它是先绘制的,所以所有其他元素都绘制在它前面,使它消失。我的建议是。将父对象设置为层次结构中较低的透明UI游戏对象,而不是根对象。

Input.mousePosition的z=0是否可能太靠近相机?@derHugo,很遗憾,没有骰子。我的地下城摄像头的z值为-10,可以在z=0时显示各种瓷砖。即使如此,我只是测试了一下,以防你已经解决了它,在这种情况下,我会感谢你,并请你发布一个答案,以便我能够接受它:也许原因是transform.SetParenttransform.root;?transform.root仍然是画布吗?如果层次结构中不在画布下,UI元素不可见,是吗?我的意思是,SetParent不是导致它成为该父级的最后一个子级,因此它将被呈现在所有其他子级之上吗?SetParent没有指定层次结构中的同级顺序。在为元素创建父对象后,可以使用它将元素移动到UICanvas的底部。我必须在UI列表的末尾创建一个空的GameObject来完成此操作,但它起到了作用。这是一种出人意料的做事方式;由于一个级别内从上到下的顺序不影响加载顺序,因此该系统似乎是为了使此类放置不相关而设计的。不是这样!很好,谢谢。对我来说,SetAsLastSibling听起来比在层次结构中添加内容更可取。虽然这是一个直接的解决方案,在这里有效,但它使对象在层次结构中的确切位置更难放置。例如,假设您有一个HUD和一个库存面板。当你在“资源清册”面板中拖动某物时,它应该在面板的前面移动,但可能不是你的HUD。如果它们共享相同的UI画布,则需要指定特定的子索引才能实现这一点。或者你也可以让一个变换做同样的事情。