게임엔진

    [Unreal] UDragDropOperation 클래스를 이용한 인벤토리 슬롯 구현

    UDragDropOperation 클래스는 언리얼에서 드래그 앤 드롭 기능을 구현한 클래스다. Payload) 아이템 슬롯이 들고있는 정보 예) 아이템 개수, 용도 DefaultDragVisual) 커서를 따라가는 모형이 될 클래스 (CreateWidget 함수로 생성 후 사용해야됨) Pivot) 기준점이 될 위치 Ofsset) 기준점으로부터 얼마만큼 벗어났는지 지정해줌 슬롯 초기화 DefaultDragVisual = pSlot; Payload = pSlot; Pivot = EDragPivot::MouseDown; 슬롯 위치 설정, FGeomety 즉 UI가 뷰포트에서 차지하는 위치에서 마우스가 클릭된 시점(절대 위치)를 뷰포트 위치로 변환 해줘야함. // const FGeometry& InGeometr..

    [Unreal] UI를 마우스 위치에 따라가게 하기

    CanvasPanel 밑으로 가있기 때문에 Canvas Panel Slot이 존재한다 여기서 위치를 수정해서 이동시킬 것이다. finalPos 변수는 달라질 수 있음. 마우스의 위치는 현재 뷰포트 기준으로 가져온다 라이브러리 참고, PlayerController에서 주어지는 마우스 위치는 월드 기준이다. FVector2D mousePos = UWidgetLayoutLibrary::GetMousePositionOnViewport(GetWorld()); FVector2D viewportSize = UWidgetLayoutLibrary::GetViewportSize(GetWorld()); FVector2D finalPos{ mousePos.X + 38.5f,mousePos.Y + 0.5f }; if (auto..

    [Unreal] 위젯 관련 함수 오버라이딩

    // 위젯이 뷰포트에 붙여질때 호출. 초기화. virtual void NativeConstruct() // 마우스 드래그 시작 dragBegin virtual void NativeOnDragDetected(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent, UDragDropOperation*& OutOperation) // 마우스 드래그 취소 dragCancel virtual void NativeOnDragCancelled(const FDragDropEvent& InDragDropEvent, UDragDropOperation* InOperation) // 마우스 드래그로 들어올 때 virtual void NativeOnDragEnter(con..

    [Unity] Sprite (UI, SpriteRenderer) 색상 관련

    유니티에선 아래와 같이 RGB가 각각 255로 설정되있는 모습인데 코드상으론 전혀 다르다 public readonly Color orange = new Color(255, 165, 0); GetComponent().color = orange; 따라서 이와같이 바꿔줘야 정상적으로 바뀐다. public readonly Color orange = new Color(1f, 0.6f, 0f); GetComponent().color = orange;

    [Unreal] UI 마우스 관한 동작 이벤트 설정방법

    UI내 버튼이다. 총 5개의 이벤트가 존재하는데 On Clicked : 클릭할 시 On Pressed : 클릭한 후 지속적으로 누르고 있을 시 On Released : 클릭 후 뗐을 시 On Hovered : 마우스가 UI 범위 안에 들어왔을 시 On Unhovered : 마우스가 UI 범위 안에 들어온 후 벗어날 시 이벤트 그래프에서 각각의 함수들의 원형을 봤더니 리턴형 void에 파라미터 void이다. 즉 void 함수이름() C++로 구현하고자 하는데 각각 해당되는 동작 클래스 변수로 되어있다. 각 클래스 원형들을 봤더니 아예 빈 껍데기이다 그래서 동적으로 바인딩하면 어떨까해서 해봤다. 클릭 이벤트 클래스 변수에 할당 해줬다. void UInventoryListUI::InitButtons() { B..

    [Unreal] 화면 정중앙 값 구하기

    뷰포트 통해 구할 수가 있다. GetGameViewport 함수는 UGameViewportClient형 클래스를 반환한다, 이는 뷰포트의 UI, 오디오 그리고 입력 시스템이다. 이걸 바탕으로 뷰포트 클래스(FViewport )를 가져온다. auto gameViewport = GetWorld()->GetGameViewport(); FVector2D viewportSize; gameViewport->GetViewportSize(viewportSize); viewportSize /= 2; // 최종 중앙값 참고 : https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Engine/UGameViewportClient/ https://docs.unrealeng..

    [Unreal] 플레이 누른 직후 또는 인벤토리 열 때 인게임 모드 설정

    플레이를 누르면 마우스 커서가 보이고 입력을 받질 않는다 따라서 입력을 받으려면 한번 클릭해줘야 한다, 언리얼 엔진의 기본 세팅은 GameAndUIEx이다 이건 UWidgetBlueprintLibrary 클래스 내에 static 함수를 사용하여 설정할 수가 있다. 각각 함수들의 용도는 다음과 같다. GameAndUIEx : UI만 사용자의 입력을 받게끔 한다 만약에 못받는다면 플레이어 컨트롤러가 받게 된다. GameOnly : 게임 컨트롤러만 입력받게끔 한다 (플레이 직후 마우스가 인게임으로 들어가며 커서 또한 사라진다). UIOnlyEx : UI만 입력받게끔 한다 (인벤토리 열고 닫을 때 플레이어 회전이라던지 막는 용도). 시작 직후 인게임 모드를 입력만 받게끔 사용한다. if (auto p_World..

    [Unreal] UI를 뷰포트 위치로 치환 및 이동하는 방법 (UI를 마우스의 위치로 또는 반대)

    기본적으로 뷰포트의 크기는 현재 게임 화면이다 그 중 제일 보편적인건 fhd 1920 x 1080이다. UI의 위치를 지정할 수 있는 방법이 두 가지가 존재한다. Slot을 이용하는거다 피벗 기준이고, 여기서 주의해야할 게 대상 UI는 다른 UI의 자식으로 들어가야한다. RenderTransform의 Translation 이용하는 것이다, 하지만 RenderTransform은 할당만 가능하지 따로 가져올 방법이 존재하지가 않는다. 주의해야할건 바로 아래의 경우다, Slot이 없을 경우 널 포인터다. 아래는 UI의 위치 > 뷰포트 위치 또는 뷰포트 위치 > UI의 위치로 치환할 수 있는 함수들인데 여기서 UObject*는 GetWorld()로 보내주고 FGeometry&는 현재 UI의 위치에 대한 정보를 ..

    [Unreal] Static Mesh (스태틱 메쉬) 그림자 끄는/키는 방법 C++

    EditorStaticMeshLibrary 내 EnableSectionCastShadow 스태틱 전역 함수가 존재하는데 언리얼 5부턴 레거시화가 됐다. 아래 소스코드 내 유심히 살펴보니 힌트를 얻을 수가 있었다, StaticMeshEditorSubsystem를 대신 사용하라고 쓰여져있다. StaticMeshEditorSubsystem에선 클래스 멤버 함수라 참조를 해야한다. 여기서 좀 헷갈릴 수가 있는데 아래와 같이 세 개의 모듈을 추가 해줘야한다. "UnrealEd", "EditorSubsystem", "StaticMeshEditor" UnrealEd 모듈은 (UEditorEngine 클래스 포인터) GEditor에 대한 매핑 EditorSubsystem 모듈은 UEditorSubsystem 클래스 포..

    [Unreal] 사용자 정의 컴포넌트 (UActorComponent)

    생성 방법은 간단하다, C++ 클래스 생성 > Actor Component를 선택한다. 아래와 같이 함수들이 기본으로 설정될텐데 처음 보는 것들이다. 엑터일 시 PrimaryActorTick.bCanEverTick = true; 이지만 엑터 컴포넌트 일땐 PrimaryComponentTick.bCanEverTick = true; 이다. BeginPlay 함수는 동일하다 Tick 함수 대신 TickComponent 함수이다. 사용 조건은 간단한데 다른 컴포넌트가 들어가면 안된다 즉 데이터 들고있는 용도 또는 오버라이딩을 하여 여러군데에 같은 함수를 선언하는걸 방지용으로만 생각하면 된다. HP Comp에서 저런 형태가 나오는게 정상이다 만약에 헤더파일에 다른 기타 컴포넌트를 선언할 시 BeginPlay 함수..