作った目的は2つ
・マルチプレイについての学習
・サードパーソン以外のゲーム作成
Blueprint
GameMode
初めにログインしたプレイヤーに1のタグを持ったPawnを所有させる。次にログインしたプレイヤーに2のタグを持ったPawnを所有させる。
キャラクターを向かい合わせに配置した。パネルに向けて見下ろすように配置している。その際、Rotation(Pitch)を変化させている。PlayerStartで開始場所を決めるとき、PlayerStartのRotationを変更させてもYaw以外は適用されなかったので、PlayerStartではなくPawnを配置した。
タグはViewport上に配置したPawnのDetailsパネル上で設定できる。
GameState
変数だけ作成。ServerとClientで値が共通だから便利。
PlayerState
いまいち使いどころが分からず。今回一か所だけ使用。
サーバーで実行(RunOnServer)したときの分岐。
PlayerController
カーソルを表示
Left MouseをPressした際、Pressした時間が0.3秒以下ならば処理を実行。
カーソルの下にあるアクターが特定のBPI(Blueprint Interface)を実装していたら、そのアクターにControllerが所有しているPawnの情報をおくる。
マルチプレイにおけるEnable InputやDisable Inputのノードの使い方が良く分からない。Disable InputではServer、Clientともに操作ができなくなり、Enable InputではServerだけ操作できるようになった。原因分からず。今回はGameStateでBooleanを作って、それでInputの制御をした。
その他のアクター
BP_CameraChar
カメラだけ持ったPawn。
今回ほとんどの処理をここに記述。
RunOnServerがBP_Cubeでは実行できなかったので。
BP_Cube
白いパネル。このパネルをクリックしたPawnに対して、このパネルの情報を送る。
このパネルにはCubeIndexと名付けた変数を与えている。
パネルごとにインスタンス上で0~8の異なった値を与えていて、その組み合わせで勝敗の判定をしている。
マルチプレイ
マルチプレイにする
単純にマルチプレイにするには以下の2つをするだけ。
・Number of Playersを2以上にする。
・Net ModeをPlay As Listen Serverにする。
言葉の分類
他でどのように定義されているか知らないが、ここでは以下のように意味とする。
分けて考えないと混乱する。
プレイヤー
Server、Client1、Client2など。Number of Playersの数だけあるもの。
キャラクター
Pawnの一種。プレイヤーが操作できるActor。
重要なアクター
UEではマルチプレイの役に立つアクターがいくつか用意されている。そのアクターについてまとめる。現時点の理解やメモを書いているので、間違えていることはたくさんあるはず。注意。
Game Mode
サーバーでのみ生成される。クライアントでは生成されない。
On Post Loginのノードを使える。このノードではログインしたプレイヤーのPlayer Controllerの情報を取得できる。
Game State
サーバーでもクライアントでも生成される。
たぶん、サーバーでもクライアントでも同じもの。
各プレイヤーで同じ値の変数が使える。
その名の通り、ゲームの状態を記録する役に立つと思われる。
Player State
プレイヤーごとに生成される。
たぶんプレイヤーごとに異なる情報を入れておくところ。
サーバーから実行することで、プレイヤーごとの情報を操作できるのだと思う。
クライアント側で、そのクライアントの情報を取得しようとしたが上手く行かなった。やり方が悪かったのか仕様なのかは分からない。
サーバーでの使用方法と、クライアントでの使用方法が違うのかも。サーバーで入力した情報をクライアントで引き出そうとしたが、それが上手く行かなった。
GameStateは、全プレイヤーの全アクターで共通の変数をつかえるが、PlayerStateは、そのプレイヤーの全アクターに対して共通の変数を使えるのかも。(未検証)
Player Controller
プレイヤーをコントロールするもの。
プレイヤーごとに生成される。
Pawn
コントローラーで動かされるやつ。
下の記事が分かりやすく参考になった。
Replicateについて
サーバーの情報をクライアントに伝える設定だと理解。
BlueprintのClass Defaultsと、カスタムイベント、変数においてReplicateの設定をした。
Class Defaults
そのActorのReplicateの設定をできる。
ThirdPersonCharacterにおいてDefaultでClassDefaultのReplicate MovementがOnになっている。これによって、キャラクターが動くと、その情報が別のプレイヤーに伝えられる。
OFFにすると、キャラクター動いても、その情報は別のプレイヤーに伝わらない。
ReprecatesのみのONだと、Spawn、Destroy情報を複製して他のプレイヤーに伝える。
カスタムイベント
クライアントで実行しても、情報は他のプレイヤーに伝わらない。クライアントでの操作をサーバーに伝えるためなどに、カスタムイベントのReprecate設定をする。
Reprecatesの部分を、Run On Serverにすることで、クライアントでカスタムイベントを実行したとき、サーバーで実行されることになる。
サーバーで実行されれば、Reprecateされているものは他のプレイヤーに伝えられる。
Actor(BP_Cube)のカスタムイベントは、Run On Serverができなかった。
Pawn(BP_CameraChar)のカスタムイベントは、RunOnServerで実行できた。クライアントの操作を他のプレイヤーに伝えることができた。
変数
Reprecatedにすることで変更時に他のプレイヤーに伝えることができる。
Server Only
右上のマークは、多分サーバーで実行のマーク。(Server Only)
変数の数
基本的に、各アクターがプレイヤー(Server,Client1,Client2,…)の分だけ変数を持つ。GameModeなどは別。
変数の数も増えるので、変更を加えるときには、何がどのように変わっているのかの把握が大事だと思う。
ブーリアンのReprecated。
プレイヤー数を3にしたら3つずつになった。キャラクターで呼び出した処理なので、キャラクターの数(Pawnの数)だけ処理が呼び出される。
全てのプレイヤー(Server,Client1,Client2,….)の全てのアクターに対して同じ変更を加えたいのならGameStateを使うと良さそう。全てのプレイヤーで共通の変数が使えて、全てのプレイヤーから呼び出すことも出来る。はず。
プレイヤーコントローラーに書いた処理。
プレイヤーコントローラーはクライアントでは自分のものしか作られないのでひとつだけ。
疑問・課題
UIの操作
マルチプレイにおけるUIの操作。いろいろ試してみたけど上手くいっていない。
複数のUIが表示されてしまい、Set TextでTextを変えたり、RemoveFromParentで特定のウィジェットだけ消したりできなかった。
今回はUIに変更を加えるたびに、一度全てのUIをRemoveAllWidgetで消して、必要なUIを表示しなおした。
同一プレイヤーにおいて、複数のアクターがCreateWidgetしてしまっているのだと思うが、処理の分離が上手くできなかった。
タイトルからの遷移
タイトル画面なしにつくって、後でタイトルを追加しようと思っていた。想定より難しそうだったので、今回は作成せず。
Materialの変更
マテリアルを変更をReplicateする方法が分からない。
初めは〇と✗のアクターをSpawnさせるのではなく、パネルの色を変更させるだけにしようとしていたが方法が分からずやめた。
色違いのパネルをSpawnしなおすのは、負けた気がするので嫌。
その他・参考
クライアントのポーン変更
Serverの操作で変更
Severでキーを押すことで、クライアントの所有するPawnを変更。
GetPlayerControllerのノードは、Serverからでないと他のプレイヤーのControllerをとってこれない。Client側ではPlayer Index0しか登録されておらず、Player Index1で情報をとってこようとするとエラーになる。
Clientの操作で変更
たぶんクライアントのキー操作ではPawnの変更はできない。
Pawnの操作
Pawnを操作するには、Pawnをコリジョンに入れないとダメだった。Default Scene Rootだけだと動かせなかった。
Level Blueprint
UE5になってから、どこでLevel Blueprint開くか迷うようになったけど、ここ。
BlueprintのアイコンをクリックしてOpen Level Blueprintを選択。
参考
Twitterしてます
ブログの更新をお知らせ
コメント