분류 전체보기 121

[언리얼 C++] 플레이어 입력 환경설정

플레이어로 부터 입력을 받기 위해 언리얼 엔진의 입력 환경설정을 해주어야 합니다. 입력 매핑에는 액션 매핑과 축 매핑 두가지 종류가 존재합니다. - 액션 매핑 : 플레이어의 단일적인 입력을 감지합니다. 키를 누르거나, 눌렀다 떼거나, 더블클릭하거나, 누르고 있거나 할 때의 입력을 감지한다고 생각하시면 됩니다. 점프, 슈팅, 오브젝트 상호작용 등 별도의 동작이 액션 매핑 유형에 좋은 후보가 됩니다. - 축 매핑 : 플레이어의 연속적인 입력을 감지합니다. 플레이어가 움직이지 않더라도 매 프레임마다 그 값을 감지합니다. 걷기나 화면의 회전처럼 세기나 방향이 있는 것들을 처리하는데 축 매핑이 주로 사용됩니다. 1. 액션 매핑 입력 설정 프로젝트 세팅 옵션을 들어가서 왼쪽의 엔진 탭의 입력 옵션을 선택합니다. 그..

[언리얼 C++] Pawn 커스터마이즈

언리얼 엔진에서 Pawn이란, 실제 플레이어 또는 AI의 제어를 받도록 디자인된 액터를 의미합니다. 1. 클래스 생성 우선, Pawn을 커스터마이즈 하기 위해서 Pawn 클래스를 상속받는 MyPawn 클래스를 생성해줍니다. 2. Pawn 객체 생성 및 설정 AMyPawn::AMyPawn() { // 이 폰을 가장 빠른 번호의 플레이어가 조종하도록 설정합니다. AutoPossessPlayer = EAutoReceiveInput::Player0; // 무언가를 붙일 더미 루트 컴포넌트를 만듭니다. RootComponent = CreateDefaultSubobject(TEXT("RootComponent")); // 카메라와 메쉬 오브젝트를 만듭니다. UCameraComponent* OurCamera = Cre..

[언리얼 C++] 블루프린트 펑션 라이브러리

언리얼 엔진을 통해 개발을 하면 종종 자신이 구현한 함수를 C++ 클래스에서 뿐만 아니라 블루프린트에서도 사용하고 싶은 욕구가 생기기 마련입니다. 이를 위해서 언리얼 엔진은 UFUNCTION() 매크로를 제공해줍니다. UCLASS() class SampleTest { GENERATED_UCLASS_BODY() UFUNCTION(BlueprintCallable) void SampleFunction(); } 이처럼 함수의 선언부에서 UFUNCTION(BlueprintCallable) 매크로를 사용하여 함수를 선언해주면 해당 SampleFunction() 함수는 블루프린트에서도 사용할 수 있습니다. 하지만 위의 예제처럼 게임 오브젝트에 종속되어 있는 함수는 해당 오브젝트를 통해서만 호출할 수 있습니다. 공유 ..

[언리얼 C++] Asset 레지스트리

Asset 레지스트리는 에디터가 로드되면서 로드되지 않은 Asset에 대한 정보를 비동기적으로 모으는 에디터 서브시스템입니다. 이 정보는 에디터가 Asset을 로드하지 않고 목록을 만들 수 있도록 메모리에 저장됩니다. 이 정보는 메모리의 Asset이나 디스크의 파일이 변경되면 최신으로 자동 유지됩니다. 1. Asset 목록 구하기 클래스별 Asset 목록을 만들려면, Asset 레지스트리 모듈을 로드한 다음 Module.Get().GetAssetsByClass() 함수를 부르기만 하면 됩니다. FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); TArray AssetData; const..

[언리얼 C++] Asset 레퍼런스

언리얼 엔진 4에서 Asset 레퍼런스는 두 가지 방식으로 생각해 볼 수 있습니다. 하나는 오브젝트 A가 오브젝트 B를 참조하여 오브젝트 A 로드시 오브젝트 B도 함께 로드되도록 만드는 강참조이고, 다른 하나는 오브젝트 경로가 같은 문자열 형태의 간접 메커니즘을 통해 오브젝트 A가 오브젝트 B를 참조하게 만드는 약참조입니다. 1. 직접 프로퍼티 참조(강참조) Asset 레퍼런스의 가장 흔한 경우로 UPROPERTY 매크로를 통해 노출됩니다. C++ 클래스에서 UPROPERTY로 지정한 변수를 선언하고, 해당 클래스를 상속 받는 블루프린트를 생성하면 블루프린트에서 UPROPERTY로 지정한 변수를 참조할 수 있습니다. UPROPERTY(EditAnywhere, Category=Mesh) UStaticMes..

[언리얼 C++] 클래스, 열거형, 프로퍼티, 함수 명 변경하는 방법 - 코어 리디렉트

개발 도중 기존 클래스, 열거형, 프로퍼티, 함수 명을 변경해야 할 경우가 있습니다. 이 변경에 영향받는 애셋 수가 많으면 이름 변경 후 프로젝트를 리컴파일해도 언리얼 엔진이 더이상 기존 애셋을 인식하지 못해 엄청난 데이터 손실이 발생합니다. 이 문제를 해결하기 위해 언리얼 엔진에서는 코어 리디렉트를 사용합니다. 코어 리디렉트는 프로젝의 DefaultEngine.ini, 플러그인의 경우 그 플러그인 접두사 이름의 .ini에 구성해야 합니다. 어느 경우든, 코어 리디렉트는 "[CoreRedirects]" 섹션에 배치됩니다. 이 코어 리디렉트는 애셋을 로드하는 동안 폐기된 데이터를 자동 리매핑하여 이름 변경 프로세스로 인한 데이터 손실을 방지합니다. 현재 사용되는 코어 리디렉트 실제 예는, BaseEngin..

[언리얼 C++] 비동기 애셋 로딩

UE4에서 비동기 애셋 로딩이란 실행시간에 애셋을 로드/언로드하는 메서드를 의미합니다. 비동기 애셋 로딩은 개발 도중이나 디바이스상에서 쿠킹된 데이터로 실행할 때나 동일하게 작동하므로, 필요에 따라 데이터를 로딩하기 위한 별도의 코드 패스를 유지할 필요가 없습니다. 이렇게 필요에 따라 데이터를 로드 및 참조에 사용되는 방법은 일반적으로 두가지가 있습니다. 1. FSoftObjectPath와 TSoftObjectPtr FSoftObjectPath는 애셋의 전체 이름으로 된 스트링이 들어있는 단순한 구조체입니다. 클래스에 이 유형의 프로퍼티를 만들면, 에디터에는 마치 UObject* 프로퍼티인 양 나타납니다. 쿠킹과 리디렉터도 제대로 처리되므로, FSoftObjectPath가 있다면 디바이스에서의 정상 작동..

[언리얼 C++] Assert 매크로

Assert란 주어진 코드 조각이 가정하는 상황을 검증하는 도구입니다. UE4에선 다양한 유형의 검증을 제공하기 위해 매크로 시리즈를 제공합니다. 런타임 Assert 매크로는 실행 중지, 디버그 빌드에서 실행 중지, 실행 중지하지 않고 오류 보고 이렇게 총 3가지 카테고리에 들어갑니다. 실행 중지와 실행 중지하지 않고 오류 보고 유형은 DO_CHECK 디파인에 따라 컴파일되며, 디버그 빌드에서 실행 중지 유형은 DO_GUARD_SLOW 디파인을 사용하여 컴파일됩니다. 해당 디파인 중 어느 하나가 0으로 설정되면 매크로는 비활성화되어 실행에 영향을 끼치지 않습니다. 1. check(표현식) 이 매크로는 표현식을 실행한 뒤, Assert 결과가 false이면 실행을 중지시킵니다. 표현식은 매크로가 빌드에 컴..

Clean Swift(VIP) 패턴

일반적인 Clean Swift(VIP) 패턴 VIP 패턴은 VIPER 패턴과 디렉토리와 생성되는 클래스는 동일하지만 플로우를 다른 관점에서 보는 아키텍처입니다 VIPER는 양방향으로 로직이 순환해서 순환참조에 의한 메모리 누수가 발생할 수 있고, 또한 하나의 액션의 기대 결과값을 위해 각 클래스의 프로토콜에 메소드를 만들어야하는 수고스러움이 있습니다 그래서 이런 수고스러움을 덜고자 VIP는 닫는 방향으로 로직이 순환하여 액션에 대한 결과값을 보여주는 형태입니다 역할 및 동작 원리 View 스토리보드, XiB와 같은 사용자와 상호작용이 발생하는 인터페이스 Controller View를 코드에 바인딩하는 레이어 Interactor Controller의 요청을 보내야하는 비즈니스 로직 계층 Presenter ..

디자인 패턴 2021.04.13

VIPER 패턴

일반적인 VIPER 패턴 VIPER 패턴은 MV(X)의 패턴을 대체하기 위해 만들어진 패턴입니다. 역할 및 동작 원리 View 사용자에게 보여지는 View를 생각하시면 됩니다 유저 인터랙션을 받는 역할을 담당합니다 이벤트가 발생할 시 Presenter에게 해당 일을 전달합니다 Presenter의 요청대로 디스플레이하고 사용자의 입력을 Presenter에게 보냅니다 Presenter Entity로부터 받은 업데이트 이벤트를 실행하지만 데이터를 직접적으로 보내지는 않습니다 View 모델의 변경사항을 Interactor에게 알립니다 Interactor로부터 데이터를 가져오고 View로 보내기 위해 데이터를 준비하여 View로 데이터를 디스플레이할 시기를 결정합니다 Interactor Presenter로부터 받..

디자인 패턴 2021.04.13