C++ 93

[언리얼 C++] 이벤트

언리얼 엔진에서 이벤트는 여러 함수를 바인딩하여 모두 동시에 실행시킬 수 있는 델리게이트입니다. 이벤트는 멀티캐스트 델리게이트와 매우 유사합니다. (멀티캐스트 델리게이트에 대한 설명은 [언리얼 C++] 멀티캐스트 델리게이트 (tistory.com) 글을 참고하시기 바랍니다.) 이벤트도 멀티캐스트 델리게이트와 마찬가지로 아무 클래스에서나 함수 바인딩이 가능합니다. 하지만 이벤트는 멀티캐스트 델리게이트와 다른 점이 있습니다. 바로 멀티캐스트 델리게이트는 아무 클래스에서나 해당 델리게이트의 함수를 호출할 수 있는데, 이벤트는 해당 이벤트를 선언한 클래스만이 이벤트의 Broadcast(), IsBound(), Clear() 함수를 호출할 수 있습니다. 즉, 이벤트 오브젝트는 퍼블릭 인터페이스에 노출시켜도 Bro..

[언리얼 C++] 멀티캐스트 델리게이트

언리얼 엔진에서 멀티캐스트 델리게이트는 여러 함수를 바인딩시켜 바인딩된 모든 함수들을 동시에 실행시킬 수 있는 델리게이트입니다. 멀티캐스트 델리게이트는 싱글캐스트 델리게이트의 기능 대부분을 가지고 있습니다. - 오브젝트로의 약참조만 가지고 있습니다. - 구조체와 함께 사용이 가능합니다. - 쉽게 복사할 수 있습니다. - 로드/세이브가 가능하며 원격으로 트리거됩니다. 하지만 멀티캐스트 델리게이트는 보통의 델리게이트와 다른 점이 있습니다. 멀티캐스트 델리게이트의 함수 시그너처에서는 반환값을 사용할 수 없습니다. 그러므로 멀티캐스트 델리게이트에 바인딩시킬 함수들은 모두 void로 선언되어져야 합니다. 1. 멀티캐스트 델리게이트 선언하기 DECLARE_MULTICAST_DELEGATE(FMultiDele) //..

[언리얼 C++] 다이내믹 델리게이트

언리얼 엔진에서 다이내믹 델리게이트는 serialize가 가능하면서 리플렉션도 지원하는 델리게이트입니다. 언리얼 엔진에서 델리게이트는 C++ 객체에서만 사용할 수 있는 델리게이트와 C++과 블루프린트 객체가 모두 사용할 수 있는 델리게이트로 나뉩니다. 블루프린트 객체는 멤버 함수에 대한 정보를 저장하고 로딩하는 직렬화 매커니즘이 들어있기 때문에 일반 C++ 언어가 관리하는 방법으로 멤버 함수를 관리할 수 없습니다. 그래서 블루프린트와 관련된 C++ 함수는 모두 UFUNCTION 매크로로 선언해서 사용해줘야 합니다. 이렇게 블루프린트 객체와도 연동하는 델리게이트를 다이내믹 델리게이트라고 합니다. 다이내믹 델리게이트는 이러한 동작원리 때문에 일반 델리게이트보다 다소 느릴 수 있습니다. 1. 다이내믹 델리게이..

[언리얼 C++] 싱글캐스트 델리게이트

델리게이트는 C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형입니다. 델리게이트를 사용하여 C++ 오브젝트 상의 멤버 함수를 안전한 방식으로 호출할 수 있습니다. 델리게이트를 사용하여 오브젝트의 멤버 함수에 동적으로 바인딩 시킬 수 있으며, 해당 함수를 다른 오브젝트에서 호출할 수 있습니다. 호출하는 오브젝트에서 멤버 함수가 정의된 오브젝트의 유형을 몰라도 가능합니다. 델리게이트 오브젝트는 값 복사를 해도 안전하지만 추천하지는 않습니다. Heap에 메모리를 할당해야 하기 때문입니다. 그래서 가급적이면 델리게이트는 항상 참조 전달을 해줘야 합니다. 델리게이트의 종류에는 싱글캐스트와 멀티캐스트가 존재하고, 디스크에 안전하게 Serialize 시킬 수 있는 다이내믹 델리게이트 또한 존재합니다...

[언리얼 C++] 타이머 사용하기

언리얼 엔진에서는 게임플레이 타이머를 제공해줍니다. 게임플레이 타이머는 설정된 주기마다 동작을 수행하는 타이머 구조체입니다. 타이머를 통해 딜레이 이후 또는 일정 시간에 걸쳐 동작을 수행하도록 스케쥴을 잡을 수 있습니다. 그래서 타이머를 사용해서 게임에 여러가지 효과를 구현할 수 있습니다. 예를 들어, 플레이어가 사용한 버프가 지속시간 이후에 사라지는 것 등이 있을 것입니다. 1. 타이머 관리 타이머는 글로벌 타이머 매니저에서 관리합니다. 글로벌 타이머 매니저는 게임 인스턴스 오브젝트와 각 월드에 존재합니다. 타임 매니저와 함께 타이머를 셋업하는 데 사용되는 주 함수는 SetTimer와 SetTimerForNextTick 두 가지가 있는데, 둘다 다양한 파라미터로 셋업할 수 있도록 다수의 오버로드로 선언..

[언리얼 C++] UMG와 UI - 위젯 인터렉션 C++로 제작하기

1. 위젯 블루프린트 생성 위젯 인터렉션을 제작하기 위해서 먼저 위젯 블루프린트를 생성해 줘야 합니다. 위젯 블루프린트 생성은 (UMG와 UI - Viewport에 위젯 띄우기) 글을 참고하시면 됩니다. 2. 위젯 블루프린트 꾸미기 위젯 블루프린트 클래스를 생성하고 더블클릭하면 블루프린트 디자이너 창이 열리며, 여기서 메뉴 레이아웃을 만들 수 있습니다. 언리얼 엔진에서 여러가지 공용 위젯들을 제공해주는데, 예제에선 버튼과 텍스트 블록을 배치해 보았습니다. 그런 다음 블루프린트의 클래스 세팅에서 C++ 클래스를 부모 클래스로 지정해주었습니다. (UMG와 UI - Viewport에 위젯 띄우기) 글에서와 마찬가지로 UIMainHUD 클래스를 부모 클래스로 지정해주었습니다. 3. 위젯 인터렉션 제작하기 cla..

[언리얼 C++] UMG와 UI - Viewport에 위젯 띄우기

1. 모듈 추가 PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" }); PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); 언리얼 엔진에서 UMG와 인터페이스를 사용하기 위해서 일단 프로젝트의 Build.cs 파일에서 위에 해당하는 모듈들을 추가해 줘야 합니다. 2. 위젯 블루프린트 생성 유저 인터페이스 카테고리에서 위젯 블루프린트 클래스를 찾을 수 있습니다. 해당 블루프린트 클래스를 생성하고 더블클릭하면 블루프린트 디자이너 창이 열리며, 여기서 메뉴 레이아웃을 만들 수 있습니다. ..

[언리얼 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() 함수는 블루프린트에서도 사용할 수 있습니다. 하지만 위의 예제처럼 게임 오브젝트에 종속되어 있는 함수는 해당 오브젝트를 통해서만 호출할 수 있습니다. 공유 ..