お世話になっております。
マルチプレイにて、リモートキャラクターにカメラを切り替える処理を作成しております。
(いわゆるFPSであるキルカメラのようなものです)
カメラを切り替えた先のリモートキャラクターのローカルキャラクターにてカメラを回転などさせた動作が、
リモート側のカメラに反映されていない現象を調査しております。
カメラ操作はローカルの操作キャラクターのAPawn::AddControllerPitchInputやAPawn::AddControllerYawInputを使用して制御しております。
こちらの値を同期するなどして、カメラ操作を同期する方法はありますでしょうか?
ご回答をよろしくお願いいたします。
お世話になっております。
KillCamのようなシンプルなカメラの同期であれば、サーバー側で APlayerController::SetViewTargetWithBlend
を実行することで実現できるかと思います(カメラを移行するPlayerの操作も制限する場合は、更にUnPossessを実行してください)。もし実現したい内容と違っていたり同期できない場合はお知らせください。
よろしくお願いします。
素早いご返答ありがとうございます。
とても助かります。
試してみたところ、ご提示いただいたようにサーバーにて他人のプレイヤーに対してAPlayerControler::SetViewTarget関数(補間が必要ないのでこちらを使いました)ところ、クライアント、サーバーともにカメラ操作が同期できていることを確認しました。
ただ、もう一つやりたいことがありまして、
このカメラを自分と他人で切り替えができるようにしたいのですが、
自分に対して同様の対応を行った場合には正しくカメラが設定されませんでした。
各クライアント側にてSetViewTargetを自分のもともとの操作Pawnに対して行うことで正常にはなるのですが、一度でもその操作をしてしまうと、逆に今回お聞きしました一部操作ができない状態になってしまうようです。
切り替えを行う場合どういう手順で行うのが正しいでしょうか。
ひきつづき、ご返答をよろしくお願いいたします。
ご返答ありがとうございます。
調査したところ、こちらの処理にてViewRotationの取得処理に問題があり正常に同期できていなかったようでした。
こちらの処理に不手際があり申し訳ありませんでした。
ViewRotationの処理の修正と、ご提示いただいたサーバーにて対象を切り替える処理を行ったところ、想定の挙動ができるようになりました。
ご対応ありがとうございました。
ご確認ありがとうございます。
各クライアント側にてSetViewTargetを自分のもともとの操作Pawnに対して行うことで正常にはなるのですが、一度でもその操作をしてしまうと、逆に今回お聞きしました一部操作ができない状態になってしまうようです。
APlayerController::SetViewTargetに渡しているNewViewTarget(AActor)がNullになっているといったことはないでしょうか。ここで渡された AActor::FindCameraComponentWhenViewTarget
にチェックが入っていれば、そのActorが所有するCameraComponentに切り替わって操作を元に戻すこともできるかと思います。
カメラ操作はローカルの操作キャラクターのAPawn::AddControllerPitchInputやAPawn::AddControllerYawInputを使用して制御しております。
このことからThirdPersonTemplateのキャラクターと基本操作は同等のものを利用なされるとおもっております。以下の例は簡単なものですが、サーバー側でカメラを切り替えることができていることを確認した際の例です。クライアント側で切替操作を行った時にサーバーに通知して、サーバーでSetViewTargetを実行することで、同様のことが実現できるのでは思います。