게임엔진/Unreal

    [Unreal] 멀티플레이 개념잡기 Replicated

    정의 일반적인 게임들은 Steam에 연동하는 등의 플랫폼 작업이 뒤따르거나, DB에 현재 상태의 값을 저장하는 등 서버로서 필요한 작업이 더욱 많다. 다만 이러한 부분은 일단 제쳐두고 별다른 save data 없이 단판 게임으로서 멀티플레이 게임을 어떻게 만들 것인지 부터 생각해보자. ​ 개인적으로는 dedicated server를 연습하기 위해 멀티플레이 개념을 잡고 있으므로 리슨 서버(listen server)에 대해서는 별도로 다루지 않는다. ​ 참고로 Editor에서 dedicated server를 이용해 여러 클라이언트를 띄우려면 아래와 같이 설정하면 된다. Replicated 속성 적용하기 기본적으로 위의 그래프를 보면 replicated 속성은 아래 구조체에 적용할 수 있다. - GameSt..

    [Unreal] 디버깅용 드로워 이용 방법 (Draw Debug)

    Debug Draw Unreal engine 개발 과정에서 화면상에 원하는 도형을 그려서, 디버깅을 수월하게 도와주는 함수들에 대한 예제이다. DrawDebugHelpers.h 헤더파일 내에 구현 되어있다. Draw Debug #include "DrawDebugHelpers.h" ... void Examples::DebugDrawExample(UWorld* World) { FVector StartOffset = FVector(0, 0, 200); FVector LocationOne = FVector(0, 0, 600) + StartOffset; FVector LocationTwo = FVector(0, -600, 600) + StartOffset; FVector LocationThree = FVector..

    [Unreal] UI(위젯)에서 메인 캐릭터 가져오기

    UUserWidget 클래스 내에 연관된 플레이어 캐릭터를 가져오는 함수가 존재한다. T같은 경우엔 미리 캐스팅해서 반환해준다는 점이 다르다. FLocalPlayerContext 구조체 변수에 의해 가져오게 된다. // 템플릿 함수 캐스팅해서 반환한다 template T* GetOwningPlayerPawn() const { return Cast(GetOwningPlayerPawn()); } // 플레이어 폰을 가져오는 함수 APawn* UUserWidget::GetOwningPlayerPawn() const { if (APlayerController* PC = GetOwningPlayer()) { return PC->GetPawn(); } return nullptr; } // 플레..

    [Unreal] 포인터 널 체크는 조심히 하도록 하자

    UStaticMeshComponent* StaticMeshComp; // 아래 널 체크는 예기치않은 크래시를 초래할 수 가 있음. if(StaticMeshComp) 또는 if(StaticMeshComp != nullptr) // 아래 함수를 이용하도록 하자. 삭제 대기중인지, 개비지컬렉터가 수집을 안했는지까지 확인해준다. if(IsValid(StaticMeshComp))

    [Unreal] 리깅 및 리타겟터 (각기 다른 메시 애니메이션 연동 Mixamo)

    MIXAMO 사이트에서 제공해주는 애니메이션은 언리얼에서 제공해주는 메시와 스켈레톤이 맞지가 않는다 따라서 연동을 해줘야한다 (IK Rigging,IK Retargeter) 우선 변경된 블렌더 버전을 다운로드한다. [FREE] Custom Blender Version for Easy Mixamo Retargeting in UE5 (gumroad.com) 그 담 아래와 같이 생성될텐데 다운로드한 Mixamo fbx 파일을 In에다 넣어준다. n키 누르고 Mixamo 선택 후 Batch Convert 버튼을 눌러준다. 해당 옵션이 없을 시 아래 참고 Edit > Preferences > Add-ons에서 플러그인을 선택해준다. Anims Out에서 생성됐다면 정상적으로 실행된거다 Animation 부분에서 ..

    [Unreal] 애니메이션 이벤트 관련 / Notify 및 NotifyState

    두 가지의 Notify 즉 메시지가 존재하는데, 이건 애니메이션 내에서 설정이 가능하다 이 둘의 가장 큰 차이점은 AnimNotify는 일회성이고 AnimNotifyState는 시작 (Begin), 진행 중일 때 (Tick) 그리고 끝날 때 (End) 각각 다른 이벤트를 처리하도록 설정할 수 있다는 점이다. UAnimNotify / Super:: 해서 부모 클래스 오버라이딩 함수 호출 생략 UE_DEPRECATED(5.0, "Please use the other Notify function instead") virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation); virtual void Notify(USkele..

    [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..

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

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