【问题标题】:Get gameObject released on获取发布的游戏对象
【发布时间】:2016-02-10 06:02:50
【问题描述】:

我正在尝试创建一个简单的拖放清单,它的工作原理与使用下面的脚本一样:

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

我的问题是。如何获取和存储释放拖动的游戏对象的游戏对象?

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

【问题讨论】:

标签: c# unity3d


【解决方案1】:

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

如果您不能对您的对象进行光线投射,而是将它们放在某种集合中,您可以获取PointerEventDataposition 属性并遍历列表并获取最接近的对象,前提是它是在可接受的距离内。

【讨论】:

    【解决方案2】:

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

    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 来实现这一点 :-) 不过谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多