이번 게시글에서는 EnemyAI의 정보를 출력하는 UI를 만들고, 띄우는 방법에 대해 정리하였다.
🎨 UI 만들기 : EnemyAI 정보, 체력바
Enemy AI 위에 Enemy의 정보와 HealthBar를 표시하기 위한 위젯을 생성하였다. (Text와 Border, ProgressBar 이용)
위젯 블루프린트의 부모로 CUserWidget_Label 클래스를 생성하였다.
위젯 블루프린트의 그래프 탭에서 코드를 작성할 수 있도록 BlueprintImplementableEvent 속성을 부여한 함수들을 선언하였다.
이후, 위젯 블루프린트에서 각 함수들의 내용을 구현해주었다.
🖼️ UI 붙이기 : WidgetComponent
이렇게 완성된 Label 위젯은 Enemy_AI 클래스의 WidgetComponent로 추가해주었다.
Enemy_AI 클래스의 생성자에서 WidgetComponent를 초기화해주었고, 기본적인 위젯 속성들을 초기화해주었다.
블루프린트에서는 위젯을 따로 초기화시키지 않아도 적용이 됐는데, C++ 프로젝트에서는 생성한 위젯을 처음 초기화 해줘야 플레이 시 화면에 보인다.
따라서 BeginPlay 함수에서 InitWidget 함수를 호출해주었고, Enemy의 기본 체력바, 이름, 컨트롤러 이름을 초기화해주었다.
체력바는 Enemy가 피격당했을 때 Health 값이 변경되기 때문에 Update가 필요한데,
좋은 방법은 Damage를 입은 경우마다 UpdateHealthBar를 호출하는 것이지만, 현재는 간단한 위젯 연결을 위해 Tick 함수에서 지속적인 Update를 수행하도록 구현하였다. 이것이 좋은 방법은 아니다!!
(더 좋은 방법은 EnemyAI의 부모 클래스인 Enemy의 Hitted 함수를 재정의하여 처리하는 것이다)
컴파일 후 실행시켜보면 정상적으로 Enemy 위에 EnemyAI의 정보가 출력되는것을 확인할 수 있었다.
🎨 거리에 따라 작아지는 Health Bar
추가적인 기능으로 Enemy와 Player의 거리에 따라 크기가 작아지는 Health Bar를 구현해보았다.
Enemy_AI 클래스에 어느 거리까지 떨어지면 HealthBar를 숨길 것인지에 대한 변수를 하나 선언해주었다.
UpdateLabelRenderScale 함수를 제작하여, HealthBar를 출력하는 Label 위젯을 불러와 AI Controller와 카메라 사이의 거리 값을 구하였다.
해당 거리를 Max 거리값(LabelViewAmount)으로 나눈 뒤, 1에서 빼 비례식을 세웠고, 해당 비례식 값을 기반으로 Label 위젯 블루프린트의 Scale을 조정하였다.
컴파일 후 확인해보면 거리가 멀어질수록 점점 Enemy의 Label 위젯이 작아지고, 3000 이상의 거리만큼 떨어지면 Set Visibility가 Collapsed로 변경되어보이지 않게 되었다.