こんにちは
今FPSゲームを作っているのですがマルチプレイ対応にしたくて
いろいろ試しているのですが調べていてもFPSゲームのマルチが見当たらなくて
自力でやってもできないので質問させていただきました
できない点としては
球の同期がとれていない(サーバー側からの発射は同期がとれているみたいですがクライアント側から撃っても
サーバー側では同期がとれていないです)
しゃがみアクションの同期がとれていない(こちらもサーバー側ではクライアントへの同期は取れているみた
いなのですがクライアント側がしゃがんでもサーバー側では動きません)
視界を下に向けると銃が下に傾くのですが傾かない(これは逆にクライアント側からやるとサーバー側と同期はと
れているのですがサーバ側からやるとクライアント側では反映されていない)
関連性のありそうな写真を乗せさせていただきます
それとプロジェクトのほうも勝手ながら乗せさせていただきます
申し訳ないです
原因の写真を解決したら必ず載せます
ほかにほしい写真がありましたら何なりとお申し付けください
まずはMultiplayerShootoutの中身を理解するところから始めましょう
MultiplayerShootoutのサンプルには移動以外のほぼすべての必要な要素が含まれています
移動に関しては、CharacterMovementがよしなにReplicationを行ってくれます
現状でも移動に関してはキチンと動いていますよね?
いろいろ指摘はありますが、必要な部分のみコードレビューを返します
球の同期がとれていない について
まず、「サーバで起こすべき事象」と「クライアントで起こすべき事象」を切り分けてください
サーバで起こすべき事象は、
- プレイヤーが何らかのアクションを起こしたとき(銃を撃つ、など)
クライアントで起こすべき事象は、
- エフェクト(SE、パーティクル)の再生
- 逐次同期が必要ないActorの生成(この場合は銃弾)
となります
今回銃を撃つ動作をMulticastしていますが、これはRun on Serverとしてください
そしてWeaponBase->Fireで銃弾の生成をしていますが、こちらはMulticastが必要となります
なお、Client側からMulticastを実行してもうまくいきません
これは基本的にServerからClientへの命令であると考えてください
なので、Client側からアクションを起こした場合は、Run on Server → Multicastの流れでイベントが実行されるようにすると良いでしょう
なお、Multiplayerでは特に理由がない限り、ID指定でPlayerControllerを取りに行くのはやめたほうが良いでしょう
不具合のもとです
これのせいで、他のPlayerが銃を撃ったときに、自分のPlayerの銃からもエフェクトが出ています
(Weapon_Base内でSpawnEmitterを実行している部分)
しゃがみに関しては銃の発射と同様なので割愛します
視界を下に向けると銃が下に傾くのですが傾かない
これについてはそもそものAnimBPの作り方からして問題があります
加えてMultiplayer特有の問題も絡んでいます
まず、原則としてClientからServerの持ち物への参照はできません
この場合はPlayerControllerについての話になります
AnimBPでPlayerControllerのRotationを取得し、ボーンのTransformに反映していますが、クライアント側ではサーバのPlayerControllerにアクセスできないのでRotationが取得できず、仰角が取れない状態になっています
Client->Serverの同期が成立しているのは、ClientのPlayerControllerの本体をServerが所有しているため、Server側からは自由にアクセスできるためです
この場合の仰角はPropertyReplicate等を使うべきかと思います
(この部分に関しては実際に試しているわけではないので、他に良いやり方があるかもしれません)
蛇足ですが、Transformでボーンを無理やり動かすのではなく、Blendspaceを使うべきでしょう。
他にも気になるところはありますが、質問内容から外れますので割愛します
Multiplayer Shootout
なるほど
了解です
ブレンドスペースに切り替えてみます
お忙しいところ失礼します
「ID指定でPlayerControllerを取りに行くのはやめたほうが良い」
とおしゃっていますが、こちらはほかにどういった方法でやればいいのでしょうか
初歩的な質問ですがどうぞよろしくお願いいたします。)汗
T_Sumisaki
(T_Sumisaki)
6
それは「弾を発射した銃」ではないのですか?
マズルフラッシュはPlayerの手から出るのでしょうか?
単純にその銃のインスタンスの「銃口」から火花が出さえすればOKなはずです。
指摘した流れで行けばこの発射イベントはMulticastでそれぞれのクライアントで実行されるはずですね?
回答ありがとうございます
「それは「弾を発射した銃」ではないのですか?」
ーーいえこちらはマズルフラッシュをスポーンさせていますgetsockedLocationで写真
にあるAKの子につけたソケットから出しています
「マズルフラッシュはPlayerの手から出るのでしょうか?」
ーーいえ銃の先のソケットから出ます
イベントのほうもマルチキャストしたのですができないです
情報不足でしたね)汗
大変失礼しました
教えていただいたMultiplayerShootoutのほうも拝見させていただいたのですが作り方が違うせいか
やはりうまくいきません、しゃがみや銃弾などはできたのですが、、、
あとはリロードとマズルフラシュそれと左下のammoの数がうまくできません
更新したプロジェクトです
こちらの勝手な頼みなのですが
そちらでなおしていただいて写真かファイル転送でいただけないでしょうか
いくらいろんなことを試してもできないので、、、、、
見たほうが早いかと
ほんとに自分勝手な要求ですいません
ダメでしたら全然かまいません
よろしくお願いいたします。m(^^)m
銃の傾きはブレンドスペースを使えばできると思うのですが今はアニメーション
がないためとりあえず大丈夫です
以前も注意したかと思いますが、ここはコードレビューの場ではありません。
そういった依頼事はここではなく別の場所で行ってください。
今回のみ、最低限の内容で対応しますが、問題点が判明したらその内容をきちんと整理した上でこの場に記述していただけることを期待します。
ファイルありがとうございます
すごく助かりました、ほんとにありがとうございます
解決した点を順にお伝えしていきますね
「リロード処理について」
ーまずリロードアニメーションであるPlay Anim Montageに
マルチキャストのカスタムイベント(PlayReloadAnim)を作成します
余談になりますがPlay Anim Montageを再生するには別でアニメーションBPにmontageのslotを
入れる必要があります
次にもう一つカスタムイベントを作成します名前をreloadingとしてサーバーで実行にします
これを先ほど作ったカスタムイベントであるPlayReloadAnim関数に接続します(写真1参考)
次にリロードボタンを押した際の処理になります(写真2参考)Reload(リロードした際の球数の処理)関数は
マルチから離れてしまうためここでは割愛しますあとは自分の好きな時に先ほど作ったReloading関数
を呼びます
「銃のFire処理について」
まずFireOnClientというマルチキャストのカスタムイベントを作成しますそこに自分で作った
Fire関数に
接続します僕の場合Fire関数はspawn actor to class(クラスからアクタをスポーンします)ノードを使って
球を飛ばす処理が入ってます
次にサーバーで実行するFireOnServerというカスタムイベントを作成します
そこに先ほど作ったFireOnnClientを接続します(写真3参考)
あとは自分が呼びたいところにFireOnServerカスタムイベントを呼ぶだけですね
「Crouching(しゃがみの処理)」
こちらは写真をアップロードできないため文章でのお伝えになります
まずカスタムイベントを二つ作ります
一つはCrouching,もう一つはUnCrouchingどちらもサーバーで実行になります
あとはインプットボタンを作り押した際はCrouchingカスタムイベントの関数を呼び出し、
離した際はUnCrouchingカスタムイベント関数を呼び出します
しゃがみアクションはいろんな方法がありますが
僕の場合は変数(ブーリアン型)のIsCrouchingという名前の変数を作り
変数をCrouchingとUnCrouchingカスタムにそれぞれセットしてCrouchingに所だけIsAimingにチェックを入れます
あとはアニメーションBPのステートマシンで変数を使用します
こんな感じで僕の場合はマルチ化に対応できマスタ
ありがとうございますm(^^)m
ファイルありがとうございました
返信から内容を記入しようとしたのですが
できなかったので別で書かせていただきました
ありがとうございました、ほんとに助かりましたm(^^)m