UE5) 드래그 앤 드롭의 문제와 해결

언리얼 엔진 공식 문서에 보면,

드래그 엔 드롭에 대한 예제 및 설명이 아주 친절하게 되어 있어서

그냥 코드로 옮겨서 쓰던가 블루프린트 그대로 배껴서 쓰던가 하면 되는데,

공식 그대로 만들 경우에 생기는 문제점이 하나 있다

문제점

미리 메인이 될 위젯에 여러가지 다른 타 위젯들을 생성해놓고 숨김처리 한 뒤,

필요에 따라 Visibility를 변경하는 경우

공식 문서대로 따라하면 항상 드래그 했던 위젯이 가장 맨 앞에 위치하게 된다.

이유

원래 드래그할 위젯은 메인위젯 내부 캔버스패널 내부에 있던 위젯이다.

캔버스 패널 내부에 있던 위젯을 끄집어 내서 새로 붙이는 식으로 구현되어 있기 때문에 항상 맨 앞으로 나오는 것이다.

해결

매인 위젯의 캔버스를 오퍼레이션에 저장해주고,

드롭할 때, 캔버스의 자식으로 추가해 주면 된다.

	  //오퍼레이션으로 가져온 드래그중인 위젯을 잠깐 제거합니다.
			Oper->DraggedWidget->RemoveFromParent();
			//캔버스 패널에 다시 추가합니다.
			CanvasPanel->AddChildToCanvas(Oper->DraggedWidget.Get());
			if(UCanvasPanelSlot* CanvasSlot = Cast<UCanvasPanelSlot>(Oper->DraggedWidget->Slot))
			{
        //크기를 재 설정 합니다.
				CanvasSlot->SetSize(Oper->DesiredSize);
				CanvasSlot->SetPosition(UWidgetLayoutLibrary::GetMousePositionOnViewport(this) - Oper->DragOffset);
			}