0 支持
(200 ポイント)

現在、MUNを使って二人でできるシューティングゲームを作っているのですが、プレイヤーを同期させるところでつまづいています。

実行はできるのですが、一人称視点のカメラが動きません。

マウスを動かすとそれに同期してカメラもオブジェクトも動く仕様にしたのですが、カメラが固定され、球を打つオブジェクトだけ同期して動いている状態になっています。

また、その動きがもう片方プレイヤー画面に反映されていません。

何か解決策があったら教えていただけると幸いです。

一人称視点の実装の参考にしたサイトはこちらです。

https://xr-hub.com/archives/7782

回答 1

0 支持
(3.8k ポイント)
編集

Unityのシーン上ではカメラを1つしか設定できないため、「Player」が複数存在するマルチゲームの場合、Playerの子オブジェクトである「FPSCamera」もシーン内に複数存在することになるため、正常な動作は期待できないと思います。

よって、以下のようなコードを記述して、「Player」オブジェクトにドラッグ&ドロップしてみてください。(なお、「Player」オブジェクトにMonobitViewが追加されている場合の事例で示すため、そうでない場合には追加でコメントをお願いします)

class CameraManager : MonobitEngine.MonoBehaviour {
    public void OnMonobitInstantiate(MonobitEngine.MonobitMessageInfo info)
    {
        // プレハブ生成されたときに、自分自身のオブジェクトでない場合、
        // 子オブジェクトのCameraを無効にする
        if( !info.monobitView.isMine ) {
            gameObject.GetComponentInChildlen<Camera>().enabled = false;
        }
}

(200 ポイント)
回答ありがとうございます。
「Player」オブジェクトにMonobitViewが追加されていたので上記のプログラムを追加したところ、
コンパイルエラーがでてしまいました。
エラーが出たのは go.GetComponentInChildren<Camera>().enabled= false;
の部分でした。
何か足りないのでしょうか?よろしくお願いします。
(3.8k ポイント)
申し訳ありません。記述の誤りがあったので修正しました。再度上記(gameObject.GetComponentInChildlen~)でお試しください。
(200 ポイント)
ありがとうございます。
おかげさまでカメラも同期させて動かすことができました。
しかし、プレイヤーの位置の同期ができず、動きがもう片方の画面に反映されません。
何か解決策はありますでしょうか?
よろしくお願いします。
(3.8k ポイント)
プレイヤーの位置を同期させるには幾つかの課題をクリアする必要があります。以下の点を1つずつ確認してみてください。

1. Player に、MonobitTransformView コンポーネントが含まれている必要があります。

http://bit.ly/2QZbeoZ などを参考に、MonobitView と同じ階層(Playerオブジェクト)に、MonobitTransformView が追加されていることを確認してください。

同時に、http://bit.ly/2FwAy06 などを参考に、MonobitView の Observed Component List に MonobitTransformView が追加されていることを確認してください。

2. 位置操作のためのスクリプトはすべて親オブジェクトに含まれている必要があります。

https://xr-hub.com/archives/7782 のリンク先にある CameraController.cs を FPSCamera にドラッグ&ドロップするのではなく、ルートオブジェクトの「Player」に追加してください。(FPSCameraに追加された CameraController コンポーネントは remove してください。)

3. Player について、プレハブデータ(.prefab)に置き換える必要があります。

http://bit.ly/2FE223X などを参考に、Resources ディレクトリを作成し、そこに prefab データが含まれていることを確認してください。

4. Player オブジェクトを動的に生成する必要があります。

ルーム入室後、オブジェクトの動的生成処理である MonobitEngine.MonobitNetwork.Instantiate() メソッド( http://bit.ly/2T5Soz7 )を、シーン内で動作するスクリプト内に記述し組み込んでください。この時に指定された座標・角度がそのままクライアント間で一致する座標になるはずです。
(200 ポイント)
お返事ありがとうございます。
1つ目と3つ目は問題ありませんでした。
2つ目を確認しているところで、CameraController.csを「Player]に追加したのですが、そうするとCameraController.csをFPSCameraに入れている時とは違う動作をしてしまいます。
これはCameraController.csを書き換えるしかないのでしょうか?
よろしくお願いします。
(3.8k ポイント)
そうですね。1つ加え忘れました。
2.を実行したうえで、Player と FPSCamera にある Transform コンポーネントの各数値を交換してください。
...