LoginSignup
1
0

More than 3 years have passed since last update.

【UE4】キャラクターセレクト画面

Last updated at Posted at 2020-05-17

スタート時のキャラクターを選べるようにする

前回、メニューを出してキャラクターを変えられるようにしましたが、
ゲームスタート時にも使うキャラクターを選べる画面を作りました。
https://qiita.com/KLaboratory/items/af3c63d7db4a0ccaaff7

それに伴い、スタート画面用のレベルと、メニューのウィジェット
メインレベルを作りました。
また、グローバル変数を格納するゲームインスタンスを作りました。

ゲームインスタンス


2つの変数を作ります。最初はActorクラスの配列。
デフォルト値に使用するキャラクターを入れます。今回は3つ用意しました。
image.png
もう一つは、配列のインデックスを取得する整数。デフォルト値は0。
image.png
ゲームインスタンスはこれだけです。
これをプロジェクト設定のゲームインスタンスに設定します。
image.png

スタート画面(ウィジェットBP)

スタート画面用のウィジェットブループリントを新規で作ります。
start.png
何も選択せずにスタートボタンをクリックすると、DefaultPawnの
Erika.png
が選ばれます。イベントグラフは簡単です。ゲームインスタンスのインデックスをセットするだけ。
これでゲームスタート時に使うキャラクターが決まります。
image.png
スタートボタンをクリックしたときにメインレベルを開き、
Quitボタンをクリックするとゲームが終了します。
image.png

スタートレベル

スタートレベルを作ります。新規レベルでデフォルトを選んで作成したあと、すべてのActorを削除します。
なにもActorがないので、専用のゲームモードを作ります。
ブループリントには何も必要ありません。DefaultPawnClassをNoneにします。
image.png
スタートレベルのワールドセッティングをこのゲームモードにします。
image.png
※GameMode Overrideを「None」にしても今回は同じ挙動になります。
※ただ、他にもNoPawnのレベルを作るならばゲームモードを用意しておいたほうがいいと思います。
image.png
続いて、スタートレベルのブループリントですが、
ウィジェットを開いてカーソルを見えるようにするだけです。
image.png

メインレベル


ワールドセッティングは今までのゲームモードを設定します。
image.png
レベルブループリントは以下のとおりです。
image.png
前半部分、ゲームインスタンスに記録されたインデックスが0以外になっていると、
デフォルトキャラクター以外が選択されたことになります。それを取得します。
image.png
後半は、デフォルトキャラクターをDestroyして、選ばれたキャラクターをspawnします。
これは今までの応用です。アクターの配列からインデックスを指定することで、
Spawnするキャラクターが決まります。
ただ、今まではそのままPossessに接続できましたが、一旦キャラクターにキャストする必要があります。
image.png

ゲーム途中のキャラクターを変える

3つ以上のキャラクターから選ぶ

前回までは2つのキャラクタを交互に替えていただけですが、
3つ以上のキャラクターを選べるようにしました。

キャラクターチェンジ画面(ウィジェットBP)


キャラクタチェンジ用ウィジェットブループリントを新規で作ります。
スタート画面と同じ要領ですが、背景は透明にして、Start、Quitボタンはありません。
image.png
続いてブループリントです。
image.png
前半はスタートウィジェットと同じく、ゲームインスタンスのインデックスをセットします。問題は後半
image.png
RemoveFromParentで、画面を消します。続いてSetInputModeGameOnlyでインプットはゲームのみで有効にします。
マウスカーソルを非表示にして、最後にイベントディスパッチャーを発行します。
これがないとうまくいきませんでした。詳しくはPlayerControllerで説明します。

PlayerController


今までの変身に加えたのですが、相当長い処理になりました。
image.png
変身のコマンドが入力された瞬間、現在のキャラクターのインデックスを取得し、ローカル変数に格納します。
続いてウィジェットとマウスカーソルを表示させます。
image.png
SetInputModeUIOnlyはウィジェット画面だけインプットが有効になるための処理です。
なので、先程のウィジェット消去画面で、ゲームにインプットを戻す必要があるのです。
SetGamePausedでゲームを止めます。そうしないと、メニュー選択の間にもゲームが動いてしまいます。
つづいて、ウィジェットから発行されたイベントディスパッチャーをバインドします。
image.png
カスタムイベントでイベントディスパッチャーからのイベントを受けます。
SetGamePausedでゲームを止まっているゲームを再開します。
メニュー画面が出た瞬間と、消えた瞬間でゲームインスタンスのインデックスの数字が
替わっていたら、キャラクターが替わっているので先に進みます。
同じキャラクターを選んだ(替えるのをやめた)場合は何もしません。
image.png
アクターをDestroyして、新たにSpawnActorをします。今回はスタート時のキャラクターが
どれかわからないので、0(デフォルト)であるかどうかを判定する必要はありません。
image.png

イベントディスパッチャーを何故入れるか


実は私も理由がまだわからず教えて欲しいところでもあります。ただ、こうしないと、
画面が止まったまま、キャラクターだけが入れ替わる
ということになります。SetGamePausedは入力や画面は止まるけど、
内部の処理は止まらないのではないでしょうかね?それをイベントディスパッチャーでせき止める。
そんなイメージではないかと思っていますが、ご存じの方がいらっしゃったら教えて下さい。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0