获取gameObject发布

时间:2016-02-09 19:21:37

标签: c# unity3d

我正在尝试创建一个简单的拖放库存,它正在使用下面的脚本:

public static GameObject itemBeingDragged;
Vector3 startPosition;
Transform startParent;

#region IPointerDownHandler implementation
public void OnPointerDown(PointerEventData eventdata){
    transform.SetParent(PREFABS.instance.canvas);
    itemBeingDragged = gameObject;
    transform.SetAsLastSibling();

    Vector3 zoomUp = PREFABS.instance.originalTileSize*1.5f;
    LeanTween.scale(itemBeingDragged.GetComponent<RectTransform>(), zoomUp, 0.1f).setDelay(0f);
}
#endregion

#region IBeginDragHandler implementation
public void OnBeginDrag(PointerEventData eventdata){
    startPosition = transform.position;
    startParent = transform.parent;
    GetComponent<CanvasGroup>().blocksRaycasts = false;
}
#endregion

#region IDragHandler implementation
public void OnDrag(PointerEventData eventData){
    transform.position = Input.mousePosition;
}
#endregion

#region IEndDragHandler implementation
public void OnEndDrag(PointerEventData eventData){
    itemBeingDragged = null;
    GetComponent<CanvasGroup>().blocksRaycasts = true;

    if(transform.parent == startParent){
        transform.position = startPosition;
    }
}
#endregion

#region IPointerUpHandler implementation
public void OnPointerUp(PointerEventData eventData){
    LeanTween.scale(itemBeingDragged.GetComponent<RectTransform>(), PREFABS.instance.fieldSize, 0.2f).setDelay(0f);
}
#endregion

我的问题是。如何获取并存储拖动游戏对象发布的游戏对象?

任何帮助都表示赞赏,并提前感谢: - )

2 个答案:

答案 0 :(得分:0)

这取决于您的对象结构的设置方式,我认为您的代码中没有足够的信息来确切知道您的对象是如何拥有的。如果您的对象已设置为可以对它们执行光线投射,则传递给OnEndDrag方法的PointerEventData中有一个有用的属性。该属性为pointerCurrentRaycast,并且应该能够抓取正在拖动的对象正下方的对象(前提是您关闭该对象的光线投射[可能带有LayerMask]。

如果您无法使用对象进行光线投射,而是将它们放在某种集合中,则可以获取PointerEventData的{​​{3}}属性并运行列表并将最近的对象移至如果它在一定的可接受距离内。

答案 1 :(得分:0)

实际上......我自己得到了答案: - )

public void OnPointerUp(PointerEventData eventData){
    Vector3 toSize = PREFABS.instance.fieldSize;
    if(transform.parent == PREFABS.instance.startParent){
        var pointer = new PointerEventData(EventSystem.current);
        pointer.position = Input.mousePosition;

        var raycastResults = new List<RaycastResult>();
        EventSystem.current.RaycastAll(pointer, raycastResults);
        if (raycastResults.Count > 0) {
            PREFABS.instance.parentObject = raycastResults[0].gameObject;
        }

        if(PREFABS.instance.parentObject.GetComponent<CtrlField>() != null){
            if(PREFABS.instance.parentObject.GetComponent<CtrlField>().isField == false){
                lastHolder = false;
                toSize = PREFABS.instance.invSize;
            } else {
                lastHolder = true;
            }
        } else {
            if(lastHolder == false){
                toSize = PREFABS.instance.invSize;
            }
        }
    }

    LeanTween.scale(itemBeingDragged.GetComponent<RectTransform>(), toSize, 0.2f).setDelay(0f);
}

我正在使用RayCast来实现这个目标:-)谢谢。