いとりのあんりある日記

アンリアルエンジンで自分がつまづいたところとかをかきます。不定期更新。

UE4 ドラッグ&ドロップで変数を置き換える

知ってるとお得かもしれない、Tipsを紹介!

置き換える変数を選んで、置き換えたい変数へドラッグ&ドロップすると…

f:id:Fire_rain:20200101185230p:plain

ドラッグ&ドロップした変数に置き換えられます。めでたし。

f:id:Fire_rain:20200101185320p:plain

 

ドロップする場所を変数名の場所にすると、その変数をドロップした変数にセットもできます!

f:id:Fire_rain:20200101185530p:plain

 

【UE4 × Playfab】データの書き込み/読み取りを行う

どうも。就活がつらいです。

 

今回はMicroSoft Azureの機能のひとつである、Playfabの記事です。

UE4でのPlayfabの情報がぜんぜんなくて辛かったので、備忘録程度に記事にしていこうかと。

 

公式ドキュメントにプラグインのセットアップ&ログインの記事はあるので、そこは省いていきます。

Unreal MarketPlace Plugin Getting Started

https://api.playfab.com/docs/getting-started/unreal-mkpl-getting-started

 

Playfabにはいろんな機能がありますが、今回紹介するのはプレイヤーデータの書き込み/読み取りです。

ユーザーデータの管理やバックアップなど、結構基本的な機能だと思うので最初はここから実装してみよう!って人も多いんじゃないでしょうかね。僕もそうでした。

 

というわけで早速書いていきたいと思います。まずは「データの書き込み」から

データの書き込み

Playfabでは通信にJson形式を採用していて、書き込み/読み取りではJson形式でやり取りします。

データの書き込みを行うには、まずJsonファイルの作成を行います。

f:id:Fire_rain:20190713205649p:plain


書き込みたいデータ(この例ではInt型のプレイ時間)をString型に変換し、「Construct Json String Value」に繋ぎます。

その後、「As Object」でJsonファイルを作り、FieldNameを設定します。

f:id:Fire_rain:20190713210038p:plain

FieldNameがキー、Construct Json String Valueで設定した値がバリューに対応します。

これでJsonファイルが作成できたので、書き込みを行います。

f:id:Fire_rain:20190713210233p:plain

「Make Client UpdateUserDataRequest」でリクエストを作成します。

Data…書き込むデータ。As Objectで作成したデータを繋ぎます。

Keys To Remove…書き込む時に消したいデータがある場合に、そのデータのキーを入力しまうs。

Permission…データのPermissionのオプションです。Public/Privateを選択できます。

Authentication Context…詳しくは分かりませんが、Microsoftで使われているOpenIdなどの認証コンテキストクラスだと思います。Clientが認証に対して要求できる情報だった思いますが、分かったら詳しく書きます。(ここは弄らなくても書き込みは行えます)

 

以上を設定したら、リクエストデータを「Updete User Data」に接続します。

これで書き込みは終了です。OnSuccessとOnFailuerのデリゲートバインドがあるので、成功時のPrintStringなどを繋いでおくと分かりやすいと思います。

データの読み込み

次はデータの読み込み。先ほど書き込んだデータを読み取ってみたいと思います。

今回は読み取りなので、Jsonファイルの作成はなく、リクエストデータを作ってリクエストを送るだけです。

f:id:Fire_rain:20190713211954p:plain

「Make Client GetUserDataRequest」でリクエストデータを作成します。

if Changed from Data Version…呼び出し元のバージョンです。システムのバージョンがこれより大きければ、すべてのキーのデータが返ってきます。

Keys…読み込むデータのキーです。

Play fab Id…PlayfabのユーザーIDです。ログイン時に作成したIDを使いましょう。

Authentication Context…省略

 

以上を設定したら、リクエストデータを「Get User Data」に接続します。

これで読み取りは終了です。OnSuccessデリゲートにResultDataが返ってきます。

これがデータが入ったJsonファイルになるので、これを分解すればバリューが取れると思います。

分解に関しては、ブループリントではイマイチ効率のいい方法が見つからずかなり力技っぽくなってしまいました。

f:id:Fire_rain:20190713213510p:plain

C++だと

f:id:Fire_rain:20190713213925p:plain

こういう感じでキーとバリューを配列でゲットできるので楽なんですが…

もしこういう方法もあるぜ!!みたいなのがあればこっそり教えてください。

 

・おわり

これで書き込み、読み取りは終わりです。ちょっと長くなりましたが、処理自体はとても簡単にできます。Playfabは他にも機能がいっぱいありますし、しかも無料です。手を出してみたいな~と思っているひとや難しそう…と思ってる人も、みんな使ってみましょう!(ダイレクトマーケティング

 

追記:

GetUserDataやUpdateUserDataは非同期処理なので関数内では使えないよ。

シームレストラベルの使い方とか

ごんにぢわ。花粉で辛いです。

今回はオンラインゲームを作るならお世話になる(であろう)SeamlessTravelのお話です。

シームレストラベルって何

SeamlessTravelです。

f:id:Fire_rain:20190418165728p:plain

これです。

f:id:Fire_rain:20190418170114p:plain

こいつです。

詳しく言うとこれだけじゃないんですけど大体これです。

ブループリントに用意されているものではないので、

Execute Command Consoleノードに打ち込むか、CPPコードで実装してブループリントに公開するかしないとブループリント上では使えません。

 

SeamlessTravelはなにかというと、サーバーとクライアントが接続を保ったまま新たなワールド(レベル)に移動するというもので、サーバーからServerTravelを実行すると、サーバーが新規ワールド(レベル)に移動し、同じように接続中のクライアントもすべて移動します。

マルチプレイヤー・ゲームのワールド移動にうってつけというわけです。

 

どうやって使うの

ゲームモードからbUseSeamlessTravelをtrueにし、

f:id:Fire_rain:20190418172547p:plain

 

ExecuteCommandConsoleに ServerTravel (MapName)と打ち込むか、

CPPコードでUWorld::ServerTravelを実行すれば移動することができます。簡単!

 

 

ここで気を付けたいのが

・サーバー/クライアントが移動した後に走る処理は、OnPostLoginではなくOnSwapControllers

意外と注意が必要なところで、サーバーに接続した時に走るログイン処理はOnPostLoginですが、

f:id:Fire_rain:20190418173744p:plain

OnPostLoginくん

ServerTravelした後で呼ばれる処理はOnSwapPlayerControllerに変化しています。OnPostLoginは走りません。(多分!走ったらごめんね)

f:id:Fire_rain:20190418173925p:plain

OnSwapPlayerContorollersくん

また、OnPostLoginの時と同様に

処理が走った時に「PlayerCharacterやActorが生成されているかはわからない」ので注意しましょう。OnPostLoginやOnSwapPlayerControllerでPlayerCharacterやアクターに触るときはDelayをかけてあげたほうが無難です。

 

突然でてきたOnSwapPlayerControllerって何だよ

SeamlessTravelを実行時に一部アクターは引き継がれるんですが、実際には前ワールドのプレイヤーコントローラーから、移動先のプレイヤーコントローラーにスワップしています。

前のプレイヤーコントローラーから引き継いで使いたい時には、ここでそのデータを渡すことができます。

f:id:Fire_rain:20190418182029p:plain

こんなかんじで

 

SeamlessTravelはマルチプレイヤー・ゲームにおいて便利な機能ですし、公式も推奨している機能なので使いこなしていきましょう!

 

ブループリントのRPCイベントの使い分け備忘録

ネットワークゲーム作ってたので備忘録程度に。

カスタムイベントのRPCと、どんな感じで使うのとかです。

 

UE4ではカスタムイベントに三種類のRPC(リモートプロシージャコール、詳しいことはググってね)を設定でき、

・MultiCast

・Run On Server

・Run On Owning Clientのみっつがあります。

デフォルトは「NotReplicated(なにもしない)」になっているので、適宜設定しないといけません。

 

・MultiCast

ひとつめはマルチキャスト

f:id:Fire_rain:20190405140534p:plain

サーバーで呼び出しを行うと、サーバーとクライアントすべてで処理が実行。

多分一番よく使うであろうRPCイベント。

サーバー以外で呼び出してもそのクライアントでしか実行されない。

 

・RunOnServer

ふたつめはサーバーで実行。

f:id:Fire_rain:20190405141442p:plain

呼び出すと処理がサーバーで実行されます。呼び出したクライアントでは実行されません。

名前とは裏腹に、サーバーで呼び出しても、サーバーが所有するクライアントで処理が実行されます。

 

・RunOnOwningClient

最後は所有クライアントで実行。

f:id:Fire_rain:20190405141702p:plain

サーバーから呼び出した際、所有しているクライアントで処理が実行されます。

クライアントで呼び出しても、そのクライアントでしか実行されません。

使う機会は多くないんじゃないでしょうか。

 

・どんな感じで使うの

全員が見えていないといけない情報(キャラクターの色とか位置)の変更はマルチキャスト

サーバーが持っていればいい情報(残り時間とか)の変更はサーバーで実行、みたいな形で使い分けていけばいいと思います。

ただ、結構組み合わせて使わないといけない場面が多いです。

例えば自分のキャラクターの色(マテリアル)を変えたい場合、サーバー側からだとMultiCastのイベントひとつで済みますが、クライアント側からだとMultiCastしても自分にしか処理が走らないので、RunOnServerイベントからMultiCastイベントを呼ばないといけません。(僕がこの方法しか知らないだけで他の方法もあるかもしれません。)

f:id:Fire_rain:20190405143027p:plain

(こんな具合に)

 

 

ゲームモードはサーバー側にしか存在しないとか、ゲームインスタンスはそれぞれのクライアントにひとつずつあるとかも考えないといけないので慣れないとなかなか難しいところですが、逆に慣れてしまえば簡単にオンラインゲームを作れるようになれます。

 

ちょっとオンラインとか興味あるな~みたいな人はぜひ挑戦してみてはどうでしょうか。

UE4 PaperCharacterで影を有効にする

2.5Dのゲームを作ってて「あれ?PaperFlipbookComponentの影ってどうやって出すんだ?」って地味につまづいたので記事にします。

 

影はマテリアルのシェーディングモデルがUnlitだと描画されないようになっています。

PaperFlipbookComponentのデフォルトのマテリアルはUnlitなので影が描画されないわけです。

それでは影を描画できるようにしましょう。

手順-1

f:id:Fire_rain:20190202011657p:plain


PaperCharacterを開いたら、このマテリアルを開き、[一般]タブのParentマテリアルを開きます。

f:id:Fire_rain:20190202005604p:plain

[詳細]タブのMaterialから、ShadingModelを選び、UnlitからDefault Litに変更します。

手順-2

ShagingModelを変更したら適用し、PaperCharacterに戻ります。

f:id:Fire_rain:20190202012257p:plain

後は[Lighting]タブのCastShadowにチェックをいれてあげれば影が表示されるようになります。