🎮Unreal4/C++_TPS

[UE4] UI(UserWidget, BlueprintImplementableEvent, WidgetComponent), 블루프린트 부모변경

공대 컴린이 2023. 3. 14. 22:21
728x90

총의 연사 기능을 구현하기에 앞서 현재 연사 모드인지 아닌지에 대한 표시를 나타내기 위해 간단한 UI를 만들어보았다.

🎨 UserWidget 상속받은 C++ 클래스

먼저 블루프린트에서도 UI를 제작하기 위해 Widget을 생성하고 나면 UserWidget이 부모클래스로 상속되어 있기 때문에 C++ 클래스로 Widget을 만들때도 UUserWidget을 상속받으면 된다.

 

C++ Widget 클래스에서는 함수를 선언만 해두고 구현하진 않는다. 실제 구현은 Widget 블루프린트에서 배치해둔 컴포넌트들을 변경해야 하기 때문에 구현은 블루프린트에서 해야 한다. 

따라서 C++ 클래스에서 선언만 해두고 실제 구현은 블루프린트에서 진행되므로 BlueprintImplementableEvent 속성을 적용하였다.

🎨 Widget Blueprint 만들기

이제 위젯 블루프린트 클래스를 생성할 차례인데, 평소 Actor를 생성했던 것 처럼 C++기반 블루프린트를 생성하면 안된다 !

이렇게되면 위젯 블루프린트에 디자이너 영역이 사라지고 그래프 영역만 생성되기 때문에 일반 블루프린트 생성 과정으로 위젯 블루프린트를 만들어 주었다.

 

이후 작성한 C++ 클래스로 부모를 변경하여 선언해놓은 함수를 사용할 수 있도록 하였다.

 

이후 블루프린트 창의 부모클래스 정보를 보면 C++ 클래스로 생성한 CUser Widget HUD가 나타남을 확인할 수있었다.

연사모드 정보와, 총기 이름, 총알 개수 까지 간단한 UI 컴포넌트들을 배치하고 변수로써 모두 설정해주었다면 그래프 영역으로 들어가 선언된 함수 내용을 구현해주었다.

 

위젯의 On Initialized 이벤트Begin Play와 같은 역할을 수행하고, Construct 이벤트생성자와 같은 역할을 수행한다.

먼저 위젯의 생성자에서 Auto Fire 텍스트의 기본 색상을 저장해놓았다. On Auto Fire 이벤트Auto Fire(연사모드)가 실행될 때 텍스트를 빨간색으로 변경하였고, Off Auto Fire 이벤트원래의 색상(흐릿한 흰색)으로 돌아올 수 있도록 구현해주었다.

🎨 UserWidget 객체 불러오기

위젯 블루프린트의 생성이 끝났으니 C++ 클래스에서 불러와 사용할 수 있도록 하였다. UI는 모든 무기의 공통으로 사용되므로 WidgetComponent 클래스에서 불러왔다.

 

위젯 블루프린트 클래스를 받아올 HUDClass 변수와 위젯 객체를 저장할 HUD 변수를 선언하였다.

 

생성자에서 아까 만든 위젯 블루프린트의 레퍼런스를 복사해 클래스를 불러왔고

 

Begin Play 함수에서 불러와진 HUD 클래스가 있다면 해당 위젯 객체를 HUD 변수에 저장할 수 있도록 구현하였다.

 

CreateWidget 함수의 원형을 보면 보면 "템플릿(WidgetT) = 클래스(UUserWidget)" 라는 신기한 문법을 볼 수 있는데 이는 언리얼의 C++ 에서만 허용되는 문법으로, Widget T에 들어갈 수있는건 UUserWidget 클래스를 상속받은 이하의 클래스들만 들어갈 수 있다는 의미로 클래스를 제한하는 것이다.

초기화된 HUD 객체를 이용해서 AddToViewport 해주었고, 기본적으로는 화면에 띄우지 않도록 Hidden 처리해주었다.

 

HUD 객체는 무기를 장착할 때(Set Mode) 보이도록 설정하고, 장착을 해제할 때(Set Unarmed Mode) 다시 숨겨지도록 하였다. 

 

또한 Tick 함수에서 IsAutoFire(연사모드) 의 상태에 따라 위젯 블루프린트에서 재정의 했었던 OnAutoFire, OffAutoFire 이벤트를 호출하여 텍스트 색상을 실시간으로 변경해주었다.

 

728x90