2017-01-25 11 views
0

私は現在、私の最初のマルチプレイヤーゲームを統一して構築しています。Unityのネットワークプレーヤーの方向性

私の現在のプレイヤーがコントロールクラスはこれです:

using UnityEngine; 
using System.Collections; 

public class playerControls : MonoBehaviour { 

    #region 

    //Vars 
    //Movements Vars 
    public float runSpeed; 
    Rigidbody mybody; 
    Animator myAnimator; 
    bool playerDirectionE; 

    #endregion 

    // Use this for initialization 
    void Start() { 
     mybody = GetComponent<Rigidbody>(); 
     myAnimator = GetComponent<Animator>(); 
     playerDirectionE = true; 
     mybody.transform.eulerAngles = new Vector3(0, 90, 0); 


    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void FixedUpdate() 
    { 
     float move = Input.GetAxis("Horizontal"); 
     myAnimator.SetFloat("speed", Mathf.Abs(move)); //To intiate the charecter transition(move) 

     mybody.velocity = new Vector3(move * runSpeed, mybody.velocity.y, 0); //move charecter along the x axis, and keep y on gravity, not touching the z axis 

     if(move>0 && !playerDirectionE) 
     { 
      Flip(); 
     } 
     else if(move<0 && playerDirectionE) 
     { 
      Flip(); 
     } 
    } 

    void Flip() 
    { 
     playerDirectionE = !playerDirectionE; 
     Vector3 theScale = transform.localScale; 
     theScale.z *= -1; 
     transform.localScale = theScale; 
    } 
} 

私は、ネットワークを介してコマンドを送信するために、次のクライアント情報を使用しています:

using UnityEngine; 
using System.Collections; 
using UnityEngine.Networking; 
using System.Collections.Generic; 

public class PlayerSyncRotation : NetworkBehaviour { 

    [SyncVar(hook ="OnPlayerRotSynced")] 
    private float syncPlayerRotation; 

    [SerializeField] 
    private Transform playerTransform; 
    private float lerpRate = 15; 

    private float lastPlayerRot; 
    private float threshold = 1; 

    private List<float> syncPlayerRotList = new List<float>(); 
    private float closeEneough = 0.3f; 
    [SerializeField] 
    private bool userHistoricalInterpolation; 

    [Client] 
    void OnPlayerRotSynced(float latestPlayerRotation) 
    { 
     syncPlayerRotation = latestPlayerRotation; 
     syncPlayerRotList.Add(syncPlayerRotation); 
    } 

    [Command] 
    void CmdProvideRotationsToServer(float playerRot) 
    { 
     syncPlayerRotation = playerRot; 
    } 

    [Client] 
    void transmitRotations() 
    { 
     if (isLocalPlayer) 
     { 
      if(CheckIfBeyondThreshold(playerTransform.localScale.z, lastPlayerRot)){ 
       lastPlayerRot = playerTransform.localScale.z; 
       CmdProvideRotationsToServer(lastPlayerRot); 

      } 
     } 
    } 

    bool CheckIfBeyondThreshold(float rot1, float rot2) 
    { 
     if (Mathf.Abs(rot1 - rot2) > threshold) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 
     lerpRotation(); 
    } 

    void FixedUpdate() 
    { 
     transmitRotations(); 
    } 

    void lerpRotation() 
    { 
     if (!isLocalPlayer) 
     { 
       HistoricalInterpolation(); 
     } 
    } 

    void HistoricalInterpolation(){ 
     if (syncPlayerRotList.Count > 0) 
     { 
      LerpPlayerRotation(syncPlayerRotList[0]); 

      if(Mathf.Abs(playerTransform.localEulerAngles.z - syncPlayerRotList[0]) < closeEneough) 
      { 
       syncPlayerRotList.RemoveAt(0); 
      } 
      Debug.Log(syncPlayerRotList.Count.ToString() + "syncPlayerRotList Count"); 
     } 
    } 

    void LerpPlayerRotation(float rotAngle) 
    { 
     Vector3 playerNewRot = new Vector3(0, 0, rotAngle); 
     playerTransform.rotation = Quaternion.Lerp(playerTransform.rotation, Quaternion.Euler(playerNewRot),lerpRate*Time.deltaTime); 
    } 
} 

私の回転は、クライアント上で正常に見えるが、オーバー2番目のクライアント上のネットワークは、回転が壊れており、非常に間違って見えます。

私の問題HEREの短いビデオスニペットを見ることができるWebmへのリンクを添付しました。

私が間違っていることが何であるか、この問題をどのように修正できるかに関する入力は誰にもありますか?任意の提案をいただければ幸いです。

答えて

0

代わりにカスタムコードを使用して、私はUnet NetworkTransformを使用すると言っています。カスタマイズのオプションが異なるUnet上位APIです。

ネットワーク化された オブジェクト(more)の位置と回転を同期するコンポーネント。

Unet HLAPIはオープンソースなので、networkTransformのコーディングもbitbucketで取得できます。

関連する問題