UnrealEngine奮闘記

アンリアルエンジンでの開発やTIPSをまとめたblogです

インベーダーゲームを作る その8HUDの表示とBlueprint Interfaces

今回はスコアとHPバーを作成します。
また、Blueprint Interfacesという他のBlueprintを参照する方法も紹介します

  • HUDクラスの作成
  • テキストの描画
  • Blueprint Interfacesを使用したBlueprint間でのやりとり
  • HUDクラスでのHPバーの描画

HUDクラスの作成

まずHUDクラスを継承してMyHUDクラスを作成します。
作成したMyHUDクラスをMyGameModeに設定します。
この部分は前回MyGameStateを作った流れと、ほぼ同じです。

f:id:swiftnest:20140508233240j:plain:w320

テキストの描画

次はテキストを画面に表示してみます。

MyHUDのBlueprintを開きます。
HUDクラスはActorとは違い、EventReceiveDrawHUDを起点として作成していきます。

まずテキストを表示してみます。
これは非常に簡単で、DrawText関数を呼び、Textに表示するテキストを、ScreenX,Yに表示座標を入れるだけです。

ただし、これだと画面解像度が変わっても文字の位置やサイズが固定となってしまいます。
そこで、解像度を考慮するようにします。

まず解像度の基本を決めます。今回は640 x 480をベースとします。
次にEventReceiveDrawHUDの引数であるSizeXを640で割り拡大率を出します。

後はこの拡大率をDrawText関数のScaleにセットすれば文字のサイズが変わります。
その際に「ScalePosition」にチェックを入れると、ScreenXYにScaleを自動で掛けてくれるので、とても便利です。

f:id:swiftnest:20140508231904j:plain:w460

Blueprint Interfacesを使用したBlueprint間でのやりとり

次に得点を表示したいと思います。
得点はMyGameStateに変数を用意します。

GameStateに用意した変数を他のBlueprintが参照するやり方はいくつかあります。
前回ではキャストを使用したので、今回はUE4が推奨している「Blueprint Interfaces」を使用したいと思います。

InterfaceClassの概念は説明すると長くなるので、ここでは省きますが
Blueprintで使用する際は、各変数の使用箇所を特定できたり、実装と設計を分けられたりするので非常に便利です。

Javaなどでは言語でサポートしているので、詳細はそちらを確認して下さい。

ではまず、Blueprint Interfacesを作成します。
コンテントブラウザ上で右クリックし、New Asset->Miscellaneous->Blueprint Interfaceにありますので、名前はMyInterfaceとします。

f:id:swiftnest:20140508232305j:plain:w460

MyGameStateのBlueprintを開き、画面上のアイコンから「BlueprintProps」を選びます。
左下Detailsの下の方にInterfacesの欄がありますので、そこで「MyInterface_C」を選びます。

同じくMyHUDにもMyInterface_Cを設定します。

f:id:swiftnest:20140508232547j:plain:w460

MyInterfaceを開き、左側にある「+Function」を押してGetScore関数を作成します。
Details欄のOutputsにint Scoreを追加します。

f:id:swiftnest:20140508232944j:plain:w460

Blueprint Interfacesには宣言しか書けませんので実装はMyGameStateに記載します。

MyGameStateに戻り、左側にある「+Variable」を押してint Score変数を作成します。
次に右クリックのサーチからGetScoreを検索します。
ここで2つ検索に引っかかると思います。
一つは先程作成たScore変数を取得するための関数。
もう一つは先程MyInterface定義した関数です。

f:id:swiftnest:20140508232911j:plain:w460

今回はMyInterfaceで定義したGetScore関数を選びます。
すると、ある程度実装されたBlueprintに移動しますので、そこにMyGameStateのGetScore関数を接続します。

f:id:swiftnest:20140508233041j:plain:w460

これで、MyHUDからもGetScore関数を見ることが出来ます。
他のクラスから使用する際はGetScoreが何処に実装されているか識別するため
Target引数に実装されているクラスの基底クラスを指定します。
今回の場合だとGetGameStateとなります。

f:id:swiftnest:20140509003635j:plain:w460

※注意:Blueprint Interfacesで定義した関数は、一旦コンパイルをしないと他のBlueprintから見えない様です。

同じようにAddScore関数をMyInterfaceに作成します。
Detail欄のInputsにはint Scoreを追加します。

MyGameStateを開き、右クリックからAdd Scoreで検索すると「Event Add Score」が見つかります。
引数のScoreをMyGameStateのScore変数に足し込みます。

f:id:swiftnest:20140508233724j:plain:w460

EnemyBlueprintにもInterfaceを設定し、敵が死んだらAddScoreを呼ぶようにします。

f:id:swiftnest:20140508233747j:plain:w460

これで準備が整いました。

後はMyHUDのDrawTextのTextにScoreを設定するだけです。
数値をテキストに変換する場合、C言語などではsprintfなどを使用しますが
Blueprintにも似たような「BuildString」という関数があるので、そちらを利用します。

これでスコアが表示されるようになりました。

f:id:swiftnest:20140508233949j:plain:w460

HUDクラスでHPバーの描画

最後にHPバーを表示してみます。

Actorクラスには標準でDamage関連の仕組みがあるので、今回はこちらを利用します。

まずBulletBlueprintを開き、Actorに当たった際に、「ApplyDamage」を呼ぶようにします。
DamagedActorにはApplyDamageの引数を指定し、BaseDamageにはダメージ量を指定します。

f:id:swiftnest:20140508235903j:plain:w460

MyPlayerBlueprintを開き、変数Healthを作成し、初期値は100とします。
EventAnyDamageイベントを作成します。引数としてダメージ量があるので、それをHealthから引きます。

f:id:swiftnest:20140509004228j:plain:w460

後はBlueprint InterfacesにHealthを取得するGetHealth関数を用意ます。
これで準備は完了です。

HPバー画像はこちらを用意しました。
Health.png

この画像を前回と同じくImportでTextureに変換します。

MyHUDのBlueprintを開きます。
画像の表示はDrawTexture関数で行えます。

Textureには先程Texture変換したHPバー画像を指定します。
「ScreenXY」には表示先座標を指定し、「TextureU,V,Width,Height」にはテクスチャ画像のUV座標(0~1)を指定します。
また、例によってScaleに拡大率を指定し、ScalePositionにチェックを入れます。

画像の表示はこれだけですので、後はHealthの値に応じて伸び縮みさせれば完成です。
出来たBlueprintはこんな感じです。
(これでも見やすくなるように工夫してみたのですが…)
また、今回はDrawHealthBarという関数を作成し、そこにまとめてみました。
引数はInPosition(Vector2D)とInScale(Float)です。

f:id:swiftnest:20140509004740j:plain:w460
f:id:swiftnest:20140509002051j:plain:w460

次回はちょっと毛色を変えて、Blenderを使ってモデルをインポートしてみたいと思います。