UE4の勉強記録

UE4の勉強の記録です。個人用です。

第9章3節 ゲーム画面のサイズに基づいたUI用のスケーリングの作成

<前文>

f:id:kazuhironagai77:20180617162610p:plain

で勉強しています。今回は、「9章3節 ゲーム画面のサイズに基づいたUI用のスケーリングの作成」を勉強します。

<本文>

<目的>

前回作成したレシピのHUDは大変小さかったです。今回は、HUDのサイズをコントロールする方法を学びます。レシピの題は、Creating screen size-aware scaling for UIなので、直訳すると、「UIのためのスクリーンのサイズを気にしたスケーリングの作成」となります。この場合のスクリーンとはゲーム画面の事です。またスケーリングとはサイズの拡大縮小を行う事です。何のサイズでしょうか?もちろんUIのサイズです。よってレシピの題を意訳すると「ゲーム画面のサイズに基づいたUI用のスケーリングの作成」となります。

<方法>

Step.0

新しいプロジェクトを作成します。プロジェクト名は、Chapter9_part3_0611としました。

Step.1

f:id:kazuhironagai77:20180617162748p:plain

前回と同じように、クラスウィザードで作成していきます。

f:id:kazuhironagai77:20180617162814p:plain

教科書では指定していませんが、Privateを選択しました。

f:id:kazuhironagai77:20180617162844p:plain

以下にScalingUIPlayerControllerのヘッダーファイルを示します。

f:id:kazuhironagai77:20180617162909p:plain

Step.2

f:id:kazuhironagai77:20180617162939p:plain

f:id:kazuhironagai77:20180617162953p:plain

加えました。

f:id:kazuhironagai77:20180617163019p:plain

Step.3

f:id:kazuhironagai77:20180617163049p:plain

f:id:kazuhironagai77:20180617163102p:plain

加えました。

f:id:kazuhironagai77:20180617163127p:plain

前回のレシピと全く同じコードですね。

ヘッダーも全く同じものを加えました。

f:id:kazuhironagai77:20180617163149p:plain

SlateモジュールとSlateCoreモジュールを使用するために、Build.csのコードの一部をアンコメントしました。

f:id:kazuhironagai77:20180617163213p:plain

念のために、ビルドしてみました。

f:id:kazuhironagai77:20180617163244p:plain

普通にビルドしました。

Step.4

f:id:kazuhironagai77:20180617163312p:plain

f:id:kazuhironagai77:20180617163333p:plain

まず、クラスウィザードからゲームモードを選びます。

f:id:kazuhironagai77:20180617163405p:plain

名前をScalingUIGameModeに変更します。前回のレシピではprivateにしても何も問題はなかったのですが、クラスの宣言部がPackePublish社が提供しているサンプルコードと微妙に違っていました。ので今回はpublicにしてみます。ひょっとしたらこれで、クラスの宣言部がPackePublish社が提供しているサンプルコードと同じになるかもしれません。

f:id:kazuhironagai77:20180617163430p:plain

プロジェクト名が違うために、PackePublish社が提供しているサンプルコードとは完全には同じになりませんでしたが、クラス プロジェクト名 クラス名:public 親クラス と形式は同じになりました。

ただし、ソースファイルがエラーを吐いているので、以下に示すように直しました。

f:id:kazuhironagai77:20180617163456p:plain

次にデファルトコンストラクターを作成します。サンプルコードにはAScalingUIGameMode();となっているので、そちらを採用しました。と言うか、AScalingUIGameMode()が正しいはずです。

f:id:kazuhironagai77:20180617163530p:plain

Step.5

f:id:kazuhironagai77:20180617163642p:plain

f:id:kazuhironagai77:20180617163654p:plain

サンプルコードを参考にして以下の様にコードを追加しました。

f:id:kazuhironagai77:20180617163722p:plain

試しにビルトすると

f:id:kazuhironagai77:20180617163751p:plain

成功しました。

Step.6

f:id:kazuhironagai77:20180617163824p:plain

試しに、エディターを開きgame modeにScalingUIGameModeを指定してからplayを実行してみると、

f:id:kazuhironagai77:20180617163852p:plain

<結果>

Step.7

f:id:kazuhironagai77:20180617163925p:plain

Step.8

<エディター内から行う方法>

f:id:kazuhironagai77:20180617163956p:plain

開きました。

Step.9

f:id:kazuhironagai77:20180617164925p:plain

User Interfaceセクションを開きました。

f:id:kazuhironagai77:20180617164954p:plain

Step.10

f:id:kazuhironagai77:20180617165026p:plain

しました。

Step.11

f:id:kazuhironagai77:20180617165056p:plain

しましたが変化が分かりませんでした。のでアウトプット値を10にしてみました。

f:id:kazuhironagai77:20180617165129p:plain

ボタンが大きくなりました。

Step.12

<コンフィグメソッド>

f:id:kazuhironagai77:20180617165158p:plain

見つけました。

f:id:kazuhironagai77:20180617165220p:plain

Configを開きます。

f:id:kazuhironagai77:20180617165247p:plain

Step.13

f:id:kazuhironagai77:20180617165317p:plain

Notepad++で開きました。

f:id:kazuhironagai77:20180617165345p:plain

Step.14

f:id:kazuhironagai77:20180617165503p:plain

f:id:kazuhironagai77:20180617165516p:plain

見つけました。

f:id:kazuhironagai77:20180617165541p:plain

Step.15

f:id:kazuhironagai77:20180617165614p:plain

f:id:kazuhironagai77:20180617165627p:plain

見つけました。

Step.16

f:id:kazuhironagai77:20180617165658p:plain

しました。

f:id:kazuhironagai77:20180617165723p:plain

エディターを開いて、プレイしてみるとボタンが小さく大きさが変化しているのか分かりません。Value を10に変化してみました。

f:id:kazuhironagai77:20180617200403p:plain

大きさが変化しているのが確認出来ました。

Step.17

f:id:kazuhironagai77:20180617200441p:plain

しました。

Step.18

f:id:kazuhironagai77:20180617200512p:plain

はい。

Step.19

f:id:kazuhironagai77:20180617200557p:plain

はい。

Step.20

f:id:kazuhironagai77:20180617200635p:plain

しました。

Step.21

f:id:kazuhironagai77:20180617200836p:plain

しました。

Step.22

f:id:kazuhironagai77:20180617200709p:plain

r.setreswidthxheightのコマンドがありませんでした。

f:id:kazuhironagai77:20180617200912p:plain

r.setResコマンドを使用してウィンドウのサイズを変更する事は出来ました。この場合、r.setRes 1920x1080のように使うそうです。r.setRes 1280 × 720で試してみます。

f:id:kazuhironagai77:20180617200938p:plain

表示されているサイズと変わりませんでした。640×480fも試してみます。

f:id:kazuhironagai77:20180617201011p:plain

変わらないですね。100x100でやってみました。

f:id:kazuhironagai77:20180617201037p:plain

やっと変わりました。今気が付いたのですが、r.setreswidthxheightのコマンドはr.setRes width x height の事だったんですね。

これだけでは、解像度によってUIのスケールが変化したかどうか分かりません。解像度1280 × 720のスケールを10に設定してUIの変化を見てみます。

f:id:kazuhironagai77:20180617201113p:plain

以下に示すようにボタンが非常に大きく表示されています。

f:id:kazuhironagai77:20180617201142p:plain

r.setRes 1920x1080を使用します。

f:id:kazuhironagai77:20180617201223p:plain

今度は、ゲーム画面が大きくなり、更にボタンのサイズが小さくなりました。

コマンドr.setResを使用してもUIのサイズの変化を観察する事は不可能ではないですが、ゲーム画面のサイズをマウスでコントロールした方が、UIの大きさの変化の確認は優しかったです。

<考察>

今回も、How it works…を読んでいきましょう。

f:id:kazuhironagai77:20180617201254p:plain

はい、その通りです。今回は、AScalingUIGameModeクラスのデファルトのコンストラクターの実装部内に以下に示したコードを追加する事で、どのPlayerControllerを我々が使用したいかを指定しました。

f:id:kazuhironagai77:20180617201320p:plain

f:id:kazuhironagai77:20180617201333p:plain

以下の事が2.では述べられています。

(a) カスタム化したPlayerControllerクラスとGamoeModeクラスの両方を作成します。
(b) UIを描くために、PlayerCotrollerクラスのBeginPlay関数内にslateを使用してコードを書きます。

前回のレシピでUIをスクリーンに表示した方法と全く同じやり方です。以下にBeginPlay関数内のコードを示します。前回と全く同じコードです。

f:id:kazuhironagai77:20180617201427p:plain

f:id:kazuhironagai77:20180617201438p:plain

はい。3.と4.の解説は同時に考察します。

f:id:kazuhironagai77:20180617201506p:plain

私は、最初、勘違いをしていて、今回のレシピを作成した後、このレシピのテストしている最中に気が付いたのですが、今回のレシピはボタンがゲームをプレイしている時、大変小さく表示されるので、ボタンのサイズを指定してボタンを大きくする方法を習うのではなく、ゲームスクリーン全体に対してボタンの大きさが自動的に決まっているのですが、ゲームスクリーンが小さい場合ボタン上の字が読めないため、ゲームスクリーンに対してボタンの大きさの小さくなる比率をゲームスクリーンが小さい場合は、小さくする事でした。

f:id:kazuhironagai77:20180617201532p:plain

Step.9のグラフが非常に分かりやすく説明しています。ゲームプレイ中の画面が小さい場合と大きい場合のボタンの大きさをここでリニア的に決定していたのです。3.も4.もこれについての解説をしています。

f:id:kazuhironagai77:20180617201605p:plain

Hard Coded の意味を私は知らなかったのですが、

Hard-Coded: fix (data or parameters) in a program in such a way that they cannot be altered without modifying the program.

と説明されていました。訳はそのままにしておきました。

ここからは、コンフィグファイルについての解説のようです。コンフィグファイル内にある.ini ファイルたちについてあまり知識のない私には、結構重要な解説になるかもしれません。気を引き締めて読んでいきます。

f:id:kazuhironagai77:20180617201703p:plain

.iniファイルは一般的に、https://www.weblio.jp/content/.iniによると

f:id:kazuhironagai77:20180617201730p:plain

とあります。初期設定用のファイルである。テキスト形式で書かれているため、書き換えが出来る。とあります。UE4の場合は、ゲームの初期設定を指定するファイルのようです。

f:id:kazuhironagai77:20180617201801p:plain

f:id:kazuhironagai77:20180617201818p:plain

以下に実際のコンフィグファイルを示します。

f:id:kazuhironagai77:20180617201841p:plain

Key=Valueの形で指定されています。

f:id:kazuhironagai77:20180617201909p:plain

以下にUserInterfaceSettingsクラスのUIScaleCurveプロパティのDefaultEngine.iniの初期設定値を示します。

f:id:kazuhironagai77:20180617201939p:plain

f:id:kazuhironagai77:20180617201956p:plain

Serializeの意味が良く分からないので、調べて見たのですが、今回は、

f:id:kazuhironagai77:20180617202020p:plain

の1. の意味のようです。

f:id:kazuhironagai77:20180617202050p:plain

はい。

f:id:kazuhironagai77:20180617202115p:plain

はい。値を変えるだけでなく、新しいキーポイントも追加できるとあります。試してみましょう。

f:id:kazuhironagai77:20180617202141p:plain

(Time=600.000000,Value=0.690000)を追加してみました。

以下に示すように、見事に追加されていました。

f:id:kazuhironagai77:20180617202211p:plain

でもこれってProject Settingからも出来るのではないのでしょか?

f:id:kazuhironagai77:20180617202239p:plain

グラフ内をダブルクリックしたら新しいキーポイントが追加出来ました。

f:id:kazuhironagai77:20180617202315p:plain

UserInterfaceSettingsクラスのUIScaleCurveプロパティのDefaultEngine.iniの初期設定値も変更されました。

f:id:kazuhironagai77:20180617202337p:plain

大変面白いです。そして何より、UserInterfaceSettingsクラスのUIScaleCurveプロパティのDefaultEngine.iniの意味が分かりました。が、実用性はどうでしょうか?素直にProject Settingから設定した方が楽だし正確に出来そうな気がします。

f:id:kazuhironagai77:20180617202400p:plain

以下の事が12.では述べられています。

(a) Project Settingのダイアログは デザイナーが直観的な方法でカーブを編集する事が出来るフロントエンドです。
(b) テキストとして保存されたデータを持つ事で、プログラマーがこのゲームを再コンパイルしないでもUIScaleのようなプロパティを調節できるビルトツールを潜在的に開発出来るようになりました。

(b)については、現状では全く分かりません。モジュールでも制作する時に必要になるのでしょうか?

f:id:kazuhironagai77:20180617202459p:plain

これはもう自明の事ですね。以下に実際のコードを示します。

f:id:kazuhironagai77:20180617202521p:plain

f:id:kazuhironagai77:20180617202532p:plain

こっちも既に自明ですね。Valueを10に設定した実験ををStep.16で行いました。その結果を下にもう一度示しておきます。

f:id:kazuhironagai77:20180617202608p:plain

f:id:kazuhironagai77:20180617202720p:plain

これは。step.16 で行った最初の実験です。結果はstep.16で述べた通りです。

<まとめ>

今回は、ゲーム画面のサイズに基づいたUI用のスケーリングの調節に方法について勉強しました。しかし、その中で、コンフィグファイルのデータの調節方法を学んだ事がもっと重要でした。コンフィグファイル内には3つの.iniファイル、DefaultEditor.ini, DefaultEngine.ini, そしてDefaultGame.iniがあり今回は、DefaultEngine.iniファイル内から、UserInterfaceSettingsクラスのUIScaleCurveプロパティの値を調節する事でUI用のスケーリングの調節を行いました。

<おまけ>

今回は、3つの知らなかった事を知りました。特に、UE4C++の勉強とは関係ないですが、ここにメモっときます。

  1. Hard-Coding
  2. .iniファイルの意味
  3. Serializing

Hard-Coding はプログラミングの方法の一つで、コード内で使用する定数などがプログラムの変更なしには変更出来ないようにする事だそうです。.iniファイルは、一般的には、そのアプリのための初期条件のデータを保存しています。Serialingは、あるスレッドがそのデータを使用している間は、他のスレッドがそのデータにアクセス出来ないようにブロックする事を指す言葉だそうです。Serializingなんて単語は見た事ないと今まで思っていたのですが、電磁気学のクラスで散々習った直列と並列のSerialとParallelのSerialの動詞でした。直列と並列から推測するとプログラミングにおけるSerializingの定義が、あるスレッドがそのデータを使用している間は、他のスレッドがそのデータにアクセス出来ないようにブロックする事を指す言葉になるのも納得です。