3

Unity のバージョンは 5.2.3f1 です。子ゲーム オブジェクトの回転を同期しようとしています。ローカルでは問題なく動作しますが、他のクライアントには表示されません。私は見つけることができるすべてを試しましたが、何もしませんでした。

この理由は、FPS ボディを回転させるためです。そのため、Spine2 を回転させようとしています (カメラを回転させることは私の最善の解決策ではありません)。私は Mixamo キャラクターを使用してテストしています。最終的には、Mixamo の自動リグ キャラクターを使用するので、ここで作成したものはすべて互換性があります。

Network Transform Rigidbody 3D を使用しようとしましたが、Spine2 ではなくキャラクター自体のみが同期されました。Network Transform Child と公式のスケルトン同期を試しました。

スクリプトの部分で、私は多くのことを試しましたが、最も有望なものはこれでした:

 [SyncVar]
 private Quaternion syncPlayerRotation;
 [SerializeField]
 private Transform playerTransform;
 [SerializeField]
 private float lerpRate = 15f;
 // Use this for initialization
 void Start () {

 }

 // Update is called once per frame
 void LateUpdate () {
     TransmitRotations();
     LerpRotations();
 }
 void LerpRotations()
 {
     if (!isLocalPlayer)
     playerTransform.localRotation = Quaternion.Lerp(playerTransform.localRotation, syncPlayerRotation, Time.deltaTime * lerpRate);
 }
 [Command]
 void CmdProvideRotationsToServer(Quaternion playerRot)
 {
     syncPlayerRotation = playerRot;
 }

 [Client]
 void TransmitRotations()
 {
     if (isLocalPlayer)
     {
         CmdProvideRotationsToServer(playerTransform.localRotation);
     }
 }

YouTube の UNET チュートリアル シリーズ、Gamer To Game Developer ユーザーからのものです。

Spine2に付けても動かないのですが、主人公に付けたら動きました。

これも試しました:

 void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
 {
     Vector3 syncPosition = Vector3.zero;
     if (stream.isWriting)
     {
         syncPosition = Spine.GetComponent<Rigidbody>().position;
         stream.Serialize(ref syncPosition);
     }
     else
     {
         stream.Serialize(ref syncPosition);
         Spine.GetComponent<Rigidbody>().position = syncPosition;
     }
 }

しかし、それはUnityの古いバージョン用だったと思います。

回転させるには、A Free Simple Smooth Mouselookを使用しています

私はそれを編集しました、この行:

 if (Input.GetMouseButton(1))
         {
             var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.forward);
             transform.localRotation = xRotation;

         }
         else
         {
             var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right);
             transform.localRotation = xRotation;
         }

基本的に、Vector3.right を Vector3.forward に変更し、マウスの右ボタンが押されていない場合のみ Vector3.right を変換しました。スクリプトは Spine2 にアタッチされ、開始時にスクリプトによって if(isLocalPlayer) がアクティブ化されます。

現在の階層の写真があります:

画像

(一部のカメラはテスト専用です。メイン カメラは、標準アセットから抽出された FirstPersonCamera です)

Spine2 の回転をデバッグ ログに記録すると、0 から 1 までの値しか得られないことに気付きました。

4

0 に答える 0