게임엔진/Unreal
[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 함수..
[Unreal] 클래스 생성시 FObjectInitializer 사용법 (기본 컴포넌트 변경)
FObjectInitializer 구조체를 이용해서 특정 맴버를 초기화 시키는 두가지의 방법이 있다. 1. 클래스 생성자 매크로를 GENERATED_BODY() -> GENERATED_UCLASS_BODY() 로 변경하고 const FObjectInitializer& ObjectInitializer 가 있는 생성자를 구현하는 방법 // .h 파일 UCLASS() class XXXX_API ClassA : public APawn { GENERATED_UCLASS_BODY() // 언리얼에서 클래스를 생성하면 GENERATED_BODY()가 디폴트 // 기타 클래스 세팅... } // .cpp 파일 // GENERATED_UCLASS_BODY()사용시 선언이 들어가므로 .cpp에 해당 구현만 처리하면 됨 C..
[Unreal] 캐릭터 이동 관련 컴포넌트 (UCharacter / UPawn MovementComponent*)
캐릭터의 이동 관한 행동을 담당하며 대표적인 기능들은 아래와 같다. 캐릭터 최대치 변경 수영 속도 하중 힘 걸음 속도 숙인 채 걷는 속도 캐릭터가 특정 행동 진행 중일 시 숙이는 중 낙하하는 중 날아다니는 중 지상에 다니는 중 (걷기, 운전 등) 수영 하는 중 걸을 수 있는 상태 또는 걷는 중 캐릭터가 숙이는 함수와 숙인 상태에서 일어서는 함수 플레이어가 수영하는 함수 플레이어가 점프하는 함수 플레이어가 엎드리는 함수는 따로 구현할 필요가 있다. 관련 도튜먼트 : https://docs.unrealengine.com/5.0/enUS/API/Runtime/Engine/GameFramework/UCharacterMovementComponent/
[Unreal] C++ 인터페이스 (UInterface)
생성 방법은 우클릭 후 > New C++ Class > Unreal Interface 언리얼에선 모든 오브젝트들은 인스턴스화가 되어야 되기 때문에 인터페이스가 단순한 가상함수 (순수 가상 함수 X)이다. 원형은 아래와 같다. UWeaponInterface는 그대로 놔둔다, 리플렉션 전용이기에 절대로 지워서는 안된다. 아래에 있는 I로 시작되는 IWeaponInterface에 구현부를 넣는다. 헤더파일 #pragma once #include "CoreMinimal.h" #include "UObject/Interface.h" #include "WeaponInterface.generated.h" // This class does not need to be modified. UINTERFACE(MinimalAP..
[Unreal] csv 파일 불러온 후 읽어들이기
불러오기 우선 .csv 파일을 준비한다. 빈 클래스가 생성 될텐데 싹 지워버린다. .csv 파일을 연동시키기 위해선 데이터 테이블이 필요하다 FTableRowBase 로부터 상속받은 구조체를 하나 생성한다. #include "Engine/DataTable.h" 및 "파일명.generated.h" 추가 USTRUCT(BlueprintType) 와 GENERATED_BODY() 메크로 필히 추가 #pragma once #include "CoreMinimal.h" #include "Engine/DataTable.h" #include "Test.generated.h" USTRUCT(BlueprintType) struct FsTestData : public FTableRowBase { GENERATED_BODY(..
[Unreal] 자료구조 순회 방법
TMap 변수명; Key = 키, Value = 값 범위 기반 for문 사용 구현, . 멤버 변수 접근자 사용 예) 변수명.Key, 변수명.Value for (auto 변수명 : TMap 변수명) { } 이터레이터 사용 구현, it-> 화살표 연산자 참조 또는 (*it) 역참조로 접근 예) it->Key, (*it).Value 주의) TConstIterator 형이지만 != 연산자는 nullptr과 비교 불가다. ++ 연산자는 파라미터를 봐서는 전위 연산자인데 후위 연산자는 복사 오버헤드로 인해 막아놓은듯 하다. for (auto it = TMap 변수명.CreateConstIterator(); it; ++it) { }