【问题标题】:GameObject disappears during OnDrag游戏对象在 OnDrag 期间消失
【发布时间】:2019-08-20 15:37:50
【问题描述】:

我有一个主要基于this tutorial 的库存系统,我目前正在修改该系统。 OnBeginDragOnEndDrag 按预期工作,但 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;
    }
}

【问题讨论】:

  • Input.mousePositionz=0 是不是离相机太近了?
  • @derHugo 不幸的是,没有骰子。我的DungeonCamera 有一个z-10,以允许它在z=0 显示各种TileGrids。 (即便如此,我只是测试了一下,以防你解决了它,在这种情况下,我会感谢你并要求你发布答案以便我接受它:)
  • 可能原因是transform.SetParent(transform.root);transform.root 还是 Canvas 吗?如果层次结构中不在 Canvas 下,则 UI 元素不可见

标签: c# unity3d eventhandler unity-ui


【解决方案1】:

Canvas 与 WorldSpace 对象的工作方式略有不同。来自 Unity 的 UICanvas documentation 声明:

画布中的 UI 元素的绘制顺序与它们在层次结构中出现的顺序相同。首先绘制第一个孩子,然后绘制第二个孩子,依此类推。如果两个 UI 元素重叠,则后面的元素将出现在前面的元素之上。

当您将变换移动到根目录时,您将对象在 UI 层次结构中向上移动,导致它被“首先绘制”。由于它是先绘制的,所以所有其他元素都绘制在它的前面,使其“消失”。我的建议是将 .SetParent 设置为层次结构中更靠下的透明 UI 游戏对象,而不是根。

【讨论】:

  • 是吗?我的意思是不是SetParent 导致它成为该父母的最后一个孩子,因此它总是会呈现在所有其他人之上?
  • SetParent 未指定层次结构中的同级顺序。可以使用Transform.SetAsLastSibling 将元素移到 UICanvas 的底部,然后将其作为父元素。
  • 我必须在 UI 列表的末尾创建一个空的 GameObject 来完成此操作,但它确实有效。这是一种非常出人意料的做事方式。由于关卡中从上到下的顺序不会影响加载顺序,因此该系统似乎旨在使此类放置无关紧要。不是这样!很好的收获,谢谢。
  • SetAsLastSibling 对我来说听起来比在层次结构中添加东西更可取
  • 虽然它是一个直接的解决方案并且适用于这里,但它使得将对象放置在层次结构中的确切位置变得更加困难。例如,假设您有一个“HUD”和一个“库存面板”。当您在清单面板中拖动某些东西时,它应该在面板前面移动,但可能不是您的 HUD。如果它们共享相同的 UI 画布,则需要指定特定的子索引才能实现这一点。或者你可以让一个变换做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多