GameObject 在 OnDrag 期间消失
GameObject disappears during OnDrag
我有一个主要基于 this tutorial 的库存系统,我目前正在修改它。 OnBeginDrag
和 OnEndDrag
按预期工作,但 OnDrag
虽然不断更新项目的位置,但不显示项目。它会在 OnDrag
期间消失,并在将其放入新位置后重新出现。
这是我的层次结构:
值得注意的是两个摄像头。据我所知,DungeonGroup
(和 DungeonUICanvas
)使用 DungeonCamera
。 (直到最近,DungeonGroup
还是一个完全不同的场景。OnDrag
在我整合场景之前按预期工作,让我认为相机问题 可能 罪魁祸首。)
这是我目前正在使用的代码:
public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public static GameObject item; //itemBeingDragged
public static Vector3 startPosition;
public static Transform startParent;
public void OnBeginDrag(PointerEventData eventData)
{
item = gameObject;
startPosition = transform.position;
startParent = transform.parent;
GetComponent<CanvasGroup>().blocksRaycasts = false;
transform.SetParent(transform.root);
}
public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{
item = null;
if (transform.parent == startParent || transform.parent == transform.root)
{
transform.position = startPosition;
transform.SetParent(startParent);
}
GetComponent<CanvasGroup>().blocksRaycasts = true;
}
}
Canvas 与 WorldSpace 对象的工作方式略有不同。从 Unity 的 UICanvas documentation 中可以看出:
UI elements in the Canvas are drawn in the same order they appear in the Hierarchy. The first child is drawn first, the second child next, and so on. If two UI elements overlap, the later one will appear on top of the earlier one.
当您将转换移动到根目录时,您是在 UI 层次结构中将对象向上移动,导致它成为 "drawn first"。因为它先被绘制,所有其他元素都被绘制在它前面,使它成为 "disappear"。我的建议是将 .SetParent 设置为透明的 UI 游戏对象,而不是根目录。
我有一个主要基于 this tutorial 的库存系统,我目前正在修改它。 OnBeginDrag
和 OnEndDrag
按预期工作,但 OnDrag
虽然不断更新项目的位置,但不显示项目。它会在 OnDrag
期间消失,并在将其放入新位置后重新出现。
这是我的层次结构:
值得注意的是两个摄像头。据我所知,DungeonGroup
(和 DungeonUICanvas
)使用 DungeonCamera
。 (直到最近,DungeonGroup
还是一个完全不同的场景。OnDrag
在我整合场景之前按预期工作,让我认为相机问题 可能 罪魁祸首。)
这是我目前正在使用的代码:
public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public static GameObject item; //itemBeingDragged
public static Vector3 startPosition;
public static Transform startParent;
public void OnBeginDrag(PointerEventData eventData)
{
item = gameObject;
startPosition = transform.position;
startParent = transform.parent;
GetComponent<CanvasGroup>().blocksRaycasts = false;
transform.SetParent(transform.root);
}
public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{
item = null;
if (transform.parent == startParent || transform.parent == transform.root)
{
transform.position = startPosition;
transform.SetParent(startParent);
}
GetComponent<CanvasGroup>().blocksRaycasts = true;
}
}
Canvas 与 WorldSpace 对象的工作方式略有不同。从 Unity 的 UICanvas documentation 中可以看出:
UI elements in the Canvas are drawn in the same order they appear in the Hierarchy. The first child is drawn first, the second child next, and so on. If two UI elements overlap, the later one will appear on top of the earlier one.
当您将转换移动到根目录时,您是在 UI 层次结构中将对象向上移动,导致它成为 "drawn first"。因为它先被绘制,所有其他元素都被绘制在它前面,使它成为 "disappear"。我的建议是将 .SetParent 设置为透明的 UI 游戏对象,而不是根目录。