Tip:
Highlight text to annotate it
X
모두들 안녕하세요~ 스케일폼의 매튜 도일 다시 인사드립니다.
UDK HUD 튜토리얼 시리즈의 4편입니다.
기억하실랑가, 지난 번에 GFxMinimapHud.uc 에 대해 얘기하면서 UpdateGameHud() 를 남겨뒀습니다.
자, 바로 거기서부터 잇도록 하겠습니다. 거두절미하고 바로 시작하죠.
UpdateGameHUD() 는 Free for All 게임에서 점수가 가장 높은 플레이어의 기록을 HUD 에 업데이트합니다.
이 정보는 게임타입에 의존하기에 HUD 에 항상 표시되지는 않습니다.
자 여기서 진짜로 GFx 에만 관련된 코드는 417 번 줄,
가장 높은 점수를 기록한 플레이어의 이름을 표시하기 위해 적 이름 텍스트필드를 설정하는 곳입니다.
여기서 클래스의 가장 중요한 함수 TickHUD 가 등장하게 됩니다.
기억하시나 모르겠는데, TickHud 는 매 게임 프레임이 렌더링된 이후 UTGFxHudWrapper 에 의해 호출됩니다.
모든 HUD 엘리먼트 업데이트를 하는 것이 이 함수입니다. 로컬 변수를 엄청 많이 선언하는 것으로 시작합니다.
이 변수 대부분은 게임 데이터를 저장하는 데 사용되는데, 주로 탈것, 사용중인 무기, 플레이어 리플리케이션 등입니다.
또한 나중에 씬의 MovieClip 에 적용할 ASDisplayInfo 및 ASColorTransform 오브젝트도 설정합니다.
ASDisplayInfo 는 HUD 상에 그래픽 바를 스케일링하는 데 사용됩니다. 위의 Init 함수에서 사용된 것처럼요.
ASColorTransform 는 GFxObject 의 ASColorTransform 데이터 구조를 사용하여 다양한 HUD 엘리먼트의 색을 변경하는 데 사용될 것입니다.
게임에 대한 UTGameReplicationInfo 로의 참조와 로컬 플레이어에 대한 UTPlayerReplicationInfo 로의 참조를 캐시하여 시작합니다.
이 값이 가용상태이면, _root.teamStats.roundTime 에다 HUD에 표시되는 게임 시간을 설정하는 데,
그 시간은 게임에 시간 제한이 있는가에 따라 남은 시간 또는 경과 시간이 됩니다.
여기서 UpdateGameHud() 도 호출합니다.
다음으로 플레이어가 발로 서 있는지, 탈것에 타고 있는지, 무기에 타고 있는지를 결정합니다.
그 정보는 UTP 및 UTV 에 저장합니다.
주의할 점은 플레이어가 발로 서있지도 않고 어떤 것에 타고 있지도 않은 경우,
ClearStats 를 실행하여 모든 데이터를 "뉴 게임" 상태로 리셋하고, return 문으로 tick hud 함수를 빠져나갑니다.
482 번 줄에서, 현재 줌 레벨을 전달하여 미니맵을 업데이트합니다.
시간 관계상, 플레이어 통계 UI 업데이트 중 두 가지, vehicle 과 health 만 다뤄 보겠습니다.
일단 vehicle 은, 플레이어의 이동 상태(foot 또는 vehicle)가 지난 업데이트 이후 바뀌었는지 검사해 봅니다.
탈것에 대한 PlayerStat 프레임이 별도로 있기에,
처음 변경이 생겼을 때 gotoAndPlay() 를 사용하여 (서 있는) 2 프레임과 (탈것에 있는) 3 프레임 사이를 전환합니다.
이렇게 하는 이유는 실제로 변경이 있을 때에만 다양한 UI 엘리먼트를 업데이트하고 싶기 때문입니다.
마지막으로 (있다면) 지난 탈것을 현재 탈것으로 설정합니다. 그리고 다른 통계를 초기화된 값으로 설정합니다.
다음 블록은 UTP.Health 의 현재 체력과 지난 번 알려진 플레이어 체력을 비교하여 플레이어의 체력이 변경되었는지 검사해 봅니다.
변화가 있다면 먼저 UTP.Health 에 저장된 값을 전달하여 SetText 를 사용, 헬쓰 텍스트 필드를 업데이트합니다.
그리고서 약간의 기본적인 계산으로 헬쓰 바에 올바른 xscale 값을 정합니다.
이제 DI 의 x 스케일 값이 100% 이상이라면, 최대 크기로 설정해 줍니다.
그 후 원하는 색 변경을 약간의 계산에 따라 결정합니다.
Cxform 데이터 구조의 R G B 값에다 Multiply 와 Add 를 섞어서 말입니다.
Cxform 을 사용하여 바의 색을 SetColorTransform 으로 설정할 수 있습니다.
그리고 DI 를 사용하여, 바의 X 스케일을 SetDisplayInfo 로 설정할 수도 있습니다.
마지막으로, 지난 체력이 현재 플레이어 체력으로 설정됩니다.
자 다음 함수로 넘어가 봅시다. 실은 DisplayHit 는 생략하도록 하겠습니다.
예전 비디오를 되짚어 보자면,
DisplayHit 는 플레이어가 맞았을 때 HUD 에 피격 방향 표지 무비 클립을 표시하는 데 사용됩니다.
방향은 벡터로, 피해량과 피해 유형은 파라미터로 받습니다.
이 함수 대부분에 대해서는 깊게 들어가지 않겠습니다만,
본질적으로 플레이어가 어떻게 맞았는지를 결정하는 데는 엄청난 계산이 요구됩니다.
마지막 줄에, 그 정보를 취하고서 사용하여,
GotoAndPlay 사용시 표시할 무비 클립을 HitLocMC 배열에 저장된 8 무비 클립 중 하나로 정합니다.
그리고서 무비 클립에 가서 "on" 키프레임을 재생하라 하는 것입니다.
Flash 로 들어가서 스테이지 상의 dirHit 무비 클립으로 파고들어가 봅니다.
안의 레이어는 8 개로, 각 방향마다 하나씩입니다.
아무거나 더블클릭해서 시간선을 입력시켜 보면, "on" 이란 라벨의 키프레임이 있는 것을 볼 수 있습니다.
다음의 새 함수는 꽤나 말 그대로인데, 이미 언급한 절차를 그대로 따릅니다.
그래서 이것들은 건너뛰도록 하고요.
마지막 함수가 남았습니다. AddDeathMessage.
위의 AddMessage 와 마찬가지로, UTGFxHudWrapper 의 LocalizedMessage 에서 호출됩니다.
파라미터를 셋 받습니다. 킬 하는 플레이어,
킬 당한 플레이어, 플레이어를 킬한 피해 유형 입니다.
우선, 킬러의 이름을 구한 다음 string msg 를 그 이름으로 설정합니다.
그런 다음 파라미터로 받은 피해 유형을 유발한 무기 인덱스 번호를 구합니다.
그리고서 인덱스 값을 사용하여 무기 아이콘이나 해골 아이콘을 소스 이미지로 지정하여 html 이미지 태그를 생성합니다.
그리고서 death message 에 그 태그를 덧붙입니다.
udk_hud 플래시 파일의 라이브러리 파일을 들여다 보면,
로그 애셋 폴더와 웨폰 애셋 폴더에서 이 아이콘을 찾아볼 수 있습니다.
다음, 죽은 플레이어의 이름을 구하고 death message 에다 덧붙입니다.
마지막으로 함수가 하는 일은, msg 또는 message 에 저장된 전체 html 텍스트 문자열을 AddMessage 함수로 전송하는 것입니다.
그리고 AddMessage 는 HUD 메시지 로그 상에 새 death message 를 표시합니다.
그리고 default properties 로 이어집니다. default properties 역시 말 그대로입니다.
여기서 가장 중요한 줄은 클래스에게 MovieInfo 와 사용할 SWF 파일을 알리는 것입니다.
이 경우 UDKHud 패키지에 있는 udk_hud SWF 파일을 사용하려 합니다.
자 다 됐습니다! 정말 고생들 많았습니다.
누구 눈알 빠지거나 하지는 않으셨나 모르겠네요.
한 번에 소화시키기 힘든 내용인 건 알지만, HUD 에 대한 큰 그림을 그리는 데 도움이 되길 바랍니다.
다음 번에는 미니맵을 다룰 테니, 기대해 주시고요.
그때까지 언제나, 여러분의 등대, 스케일폼의 매튜 도일이었습니다.
한글 자막: 홍성진@에픽 게임스 코리아 관련 문의: sungjin.hong@epicgameskorea.com