我正在 Unity 的 2D 空间中创建我的游戏。
删除脚本(当其他对象位于其上时删除其他对象的对象)不会删除脚本创建的对象(第一次)
public class Create : MonoBehaviour, IPointerDownHandler {
public void OnPointerDown(PointerEventData eventData) {
CreateClone(eventData);
}
private IEnumerator WaitForMouseDown(DragDrop newDragDrop, PointerEventData eventData) {
newDragDrop.OnBeginDrag(eventData); //Calling OnBeginDrag
while (Input.GetMouseButton(0)) { //Looping if LMB is Down
newDragDrop.OnDrag(eventData);
yield return null; //Waiting the next Frame
}
newDragDrop.OnEndDrag(eventData);
}
public void InitiateDragDrop(DragDrop newDragDrop, PointerEventData eventData) {
StartCoroutine(WaitForMouseDown(newDragDrop, eventData));
}
private void CreateClone(PointerEventData eventData) {
//Create Clone like Prefab
RectTransform rectTransform = _clone.GetComponent<RectTransform>();
rectTransform.SetParent(_canvas.transform, false); //Clone correct position
//Add Component DragDrop for Clone
DragDrop newDragDrop = _clone.AddComponent<DragDrop>(); //Add Component DragDrop for Clone
//Get canvas for DragDrop for correct work
InitiateDragDrop(newDragDrop, eventData);
Destroy(_clone.GetComponent<Create>()); //Delete Script Create on the Clone
}
}
这段代码已经被稍微清理了一下,它的任务是创建一个单击时将跟随鼠标的对象,直到您释放 LMB(使用 DragDrop 事件实现)这部分代码可以完美地运行一点,但是
public class Delete : MonoBehaviour, IDropHandler {
public void OnDrop(PointerEventData eventData) {
Debug.Log("Destroyed the Object");
if (eventData.pointerDrag != null) {
Destroy(eventData.pointerDrag); //Destroy OnDrop Object
}
}
}
删除脚本(也称为使用事件,也可以正常工作,为了清楚起见,在这里)
如果在创建对象时,不释放鼠标,将其拖动到删除,那么什么也不会发生,说实话,我认为整个点都在 IEnumerator (Corutina) 中,因为其他一切都可以正常工作,即使是通过连接 Debug.Log 它显示一切正常,但要删除该对象,您首先必须放开它,然后再次拾起它并在删除器上释放它
简而言之:代码创建了对象的副本,并允许在我们按住 LMB 时移动它。但由于某种原因,如果将对象拖到删除器中,则无法删除该对象(您需要再次尝试删除)
如果你在Unity中手动创建一个对象并赋予它所需的拖放属性,那么删除它不会有任何问题,即使你删除了Create脚本的删除功能,问题仍然存在
public class DragDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
public void OnBeginDrag(PointerEventData eventData) {
Debug.Log("DragDrop | On Being Drag");
canvasGroup.alpha = .2f;
canvasGroup.blocksRaycasts = false;
}
public void OnDrag(PointerEventData eventData) {
rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;
}
public void OnEndDrag(PointerEventData eventData) {
Debug.Log("DragDrop | On End Drag");
canvasGroup.alpha = 1f;
canvasGroup.blocksRaycasts = true;
}
}