Направление сетевого игрока в 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);
    }
}

Мое вращение выглядит нормально на клиенте, но по сети на втором клиенте вращение прерывается и выглядит очень неправильно.

Я прикрепил ссылку на Webm, где вы можете увидеть короткий отрывок видео с моей проблемой ЗДЕСЬ .

Будет ли кто-нибудь здесь иметь какое-либо мнение относительно того, что я делаю неправильно или как я могу исправить эту проблему? Мы ценим любые предложения.


person arjwolf    schedule 25.01.2017    source источник


Ответы (1)


Вместо того, чтобы использовать ваш собственный код, я хотел бы сказать, что вы используете Unet NetworkTransform < / strong>. Это высокоуровневый API Unet с различными вариантами настройки.

Компонент для синхронизации положения и поворота сетевых объектов (подробнее).

Unet HLAPI - это открытый исходный код, поэтому вы также можете получить код networkTransform по адресу bitbucket.

person Muhammad Faizan Khan    schedule 08.02.2017