備忘録のような

趣味グラマによる個人的な見解、備忘

UE4 スターターらいパック リッスンサーバーでのオンラインマルチ対応 更新11/17

サードパーソンサンプルの4.17で作成されたスターターパック的なのです

ゲームでよく使うようなシステムテンプレを随時更新していきます。
連続でこんなながったるい記事をかけられる秘訣は、
この前ごちうさ映画で一発でシャロちゃんが当たったからです!!
f:id:rai06:20171117020441j:plain


……
………

~~~~~~~~~~~~~~~~~~~~~~~

注意 分かりやすくはしていますが、変数の作り方などが理解できている
初心者だけど基本が分かった人向けです。

回復ダメージゲームオーバー処理付きHPゲージ?HPバー?

ヒットポイントの実装の例
f:id:rai06:20171114182040p:plain
UMGフォルダを作成して、ウィジェットブループリントを
右クリで作成します。(例ではHealthBar)
次に作成したUMGを開きProgressBarを検索し、配置します。
そしてPersent値のバインディングを作成します。
f:id:rai06:20171114182405p:plain
次に、Float型の変数を作成、コンパイルをしてHP最大値となる1.0を値に埋め込みます。

  1. インスタンス編集可
  2. スポーン時に公開

にチェックを入れて、Get で Return Valueに繋げます
f:id:rai06:20171114182658p:plain
次にレベルブループリントなどから、BPを開き
f:id:rai06:20171114183032p:plain
変数を作成していきます。

  1. 作成したUMG名の変数型を選択します ( castobj
  2. 次、現在のHPを入れる変数で Float型で作成します ( Health

あとは、画像通り配置すれば完成です。
f:id:rai06:20171114183632p:plain
f:id:rai06:20171114183644p:plain
お疲れ様です。足りてない処理は、回復していくと最大値を超えて増えてしまうところで
回復処理に最大値以上の場合、最大値に置き換えるなどにして実装すると綺麗かと思います

~~ 11/17 ~~

回復処理の微修正というか追加
f:id:rai06:20171116183037p:plain
MaxHealthという変数をFloat型で作成して、コンパイルをし、値を1.0にする。
あとは、画像通り
f:id:rai06:20171116183022p:plain
あと一応
f:id:rai06:20171116183041p:plain
で最大値をいじるとき簡単に変数二つの値を変えるだけでできるようになります

(BeginPlay で変数の値を ゲットMaxHealth → セットHealth で値を読み込ませるとMaxだけで可能になるというのを
実装忘れしたなと思う僕であった)

メインメニューの実装

わりかし重要なメニューを実装していきます。
f:id:rai06:20171116185408p:plain
UMGフォルダ内にMainMenuフォルダを作成します。
次に、MainGameMenuというウィジェット(ユーザーインターフェイスウィジェットプリントのこと)を作成

f:id:rai06:20171116185423p:plain
次に先ほど作ったMainGameMenuを開き、Vertical Box を配置して、
Vertical Box のアンカーを中心にあるものを選択します。

f:id:rai06:20171116185437p:plain
次にスロットパラメーターの値で、
位置 X | -250 ( サイズXの半分の値)
位置 Y | 0 (アンカーで設定してる為)
サイズX | 500(見た目)
サイズY | 380 (見た目)
にします。

f:id:rai06:20171116190207p:plain
次に、Uniで出てくるUniform Grid PanelをVertical Box内に設置して
Sizeを自動からフィルにします。

(画像を置きまくると表示スピード低下でSEOなんちゃらしちゃうんである程度テキストのみ)
f:id:rai06:20171116190716p:plain
次、Uni にButton を三ついれてアライメントを両方伸ばします、そして、
ButtonのRowを上から0、1、2と設定します

次、各ボタンにTextを設置して、上から
シングルプレイ
オンラインプレイ
ゲームを終了する
としました。

次、シングルプレイのイベント、OnClickedを作成してください
Clickedイベントに OpenLevelを作り繋ぎ LevelNameをThirdPersonExampleMap(サードパーソンのデフォ名)にして完了。
次、ゲームを終了するのワンクリイベを作成してください
イベントに、QuitGameを作成し繋ぎ、一旦メインメニューが完成です。(オンラインはちょい長いので次項目)
f:id:rai06:20171116192119p:plain
ですが、肝心の表示処理忘れてるので作っていきます。

メイン画面に戻り、ファイル→新規レベル→空のレベルを作成
レベルBP(ブループリント→レベルブループリントのこと)を開いてください。
イベントTickは今回いらないので無駄処理のTickを削除して、
BeginPlayにいつもの、CreateWidget(ウィジェットを作成)→受け箱の変数→Add to Viewportを作成
CreateWidgetのClassには、先ほど作ったMainGameMenuを選択でok

表示はできましたが、マウスを表示する処理を忘れていました(←天然美少女と思い込んでいる陰)

……
Get PlayerControllerを作り、Valueからのみ出てくる Set Show Mouse Cursorを作り繋ぎ、カーソル変数にチェックを入れます

Add to Viewport→チェックを入れたSet Show Mouse Cursor→Set Input Mode UI Onry を作り繋げて、 Targetを 先ほどの Get Player Controllerに繋げて
コンパイルで完了
f:id:rai06:20171116194402p:plain

と、いきたいとこですがUI Onlyにしてしまっているので、修正とこのメインメニューをゲーム開始時最初に読み込むようにしていきます。
メイン画面に戻り、現在のレベルを保存をクリックして、保先を、UMG→MainMenuにしてMemuMapとして保存します。
次、ThirdPersonBP→Mapsにある、ThirdPersonExampleMapをダブルクリックして読み込みます。
レベルBPを開き、以下の画像のように Game Onlyにします。
f:id:rai06:20171116194835p:plain

この項目最後!
メイン画面の上にある設定→プロジェクト設定… を開きます(レベルBPの隣のやつ)
プロジェクト欄のマップ&モードを開き、DefaultMaps欄の両方にMenuMapを選択して終わりです!

オンライン化

このパックでここが知りたい人が多いのではないのか的な勝手な妄想をしつつ(自分がそうだった)
やっていきます
作っていく上で、今回AdvancedSessionsというプラグインを使用していくので、
プラグインの導入からやっていきます。
Advanced Sessions Plugin - Unreal Engine Forums
ここから4.17のプラグインをリンクの一覧にあるGoogleDriveから右上のダウンロードボタンを押してダウンロードします。
解凍して、中に二つファイルがあるかと思いますがAdvancedSessionsの方がプラグインです。(もう一つの方は使ったことないけど名前から察するにサンプルなので見ておくといいかもデスね)
次、プロジェクトフォルダにPluginsフォルダを作成して、Advancedsessionsをドラッグ&ドロップします。(分からなければ前回の記事を参考に)
プロジェクトを開いていていたら、一度閉じ再度起動します。
導入は終わりで、
次に メイン画面から設定→Pluginsを開き 
Online Subsystemにチェックを入れて有効化してプロジェクトを閉じます。
次に、プロジェクトフォルダにあるConfig→DefaultEngine.iniを開き
最下部に、以下の内容を追加して保存してください

[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

もう一度プロジェクトを開き、準備は完了です。

開き終わったら、MainGameMenuのオンラインプレイボタンのOnClickedイベを作ります。
次にカスタムイベントを二つ作り名前を
CreateServer
JoinServer

とします。
そして、Integer型の変数を作り名前を、CurrentIndexとします。
f:id:rai06:20171117011259p:plain
次に、カスタムイベントの中身を作っていきます(ちょっと長いので画像で)

  • CreateServer

f:id:rai06:20171117011458p:plain

  • JoinServer

f:id:rai06:20171117011538p:plain
f:id:rai06:20171117011543p:plain

最後に、先ほど作ったクリックイベントとJoinServerを繋ぎ
完成です!
f:id:rai06:20171117011723p:plain

仕様は、オンラインプレイをクリックで、空いてあるサーバーがなければ作ってそこへ参加、
サーバーがあり空いていれば参加 を自動で分けます。


構造、仕組みは画像内のコメントを参考に、
一応流れは、クリックイベントでJoinが呼び出され、
Find Session Advancedでサーバーを探し、ForEachLoopで一つ一つ参加できるか
総当たり(イメージ悪いけど)して、入れなければ次、最後までなければサーバーを作る。
最初から無ければ検索後、同じくサーバーを作る処理を行う。


AdvancedSessions使うほどだったのか怪しいが
一先ず完成
11/17現在は以上お疲れ様でした!
ライセンスは、AdvancedSessionsが大丈夫であれば
ゲーム配布としてなら大丈夫ですが、ブループリントの共有などの場合、このブログURLを張っていただくと嬉しいです。


~~~~~~~~~~~~~~~~~~~~~~~

プロジェクトのダウンロードをしたい方は、下のURLからお願いします。(プラグインは抜いてあるので各自導入お願いします。)
11/17更新版
http://bit.ly/2z6Lv7Z

パスワードはサイトとZIPどちらも、
Ue4RaiPack
です。


時々更新していきます。
分からないところや、希望があればコメントまたは、TwitterのDMやリプなどで分かる限りの返事します。
twitter.com