Advertisement
AndrewRosyaev

PlayerSyncPos.cs 6

Dec 9th, 2015
891
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.82 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.Networking;
  4.  
  5. public class PlayerSyncPos : NetworkBehaviour
  6. {
  7.     [SyncVar]
  8.     private Vector3 syncPosition;           //Переменная отвечающая за позицию игрока на сервере
  9.     public float lerpSpeed = 20;            //Переменная отвечающая скорость сглаживания позиции и вращения
  10.  
  11.     [SyncVar]
  12.     private Quaternion syncRotation;        //Переменная отвечающая за кватернион вращения игрока на сервере
  13.     [SyncVar] float SyncAnimX;              //Переменная отвечающая за параметр анимации на сервере
  14.     [SyncVar] float SyncAnimY;              //Переменная отвечающая за параметр анимации на сервере
  15.     private Animator anim;                  //Переменная для быстрого доступа к аниматору
  16.  
  17.     void Start()
  18.     {
  19.         anim = GetComponent<Animator> ();   //Указываем в переменную компонент animator установленный на игроке
  20.     }
  21.  
  22.     void FixedUpdate ()                     //Функция вызывается автоматически каждые 0.02
  23.     {
  24.         LerpPosition ();                    //Вызываем функцию сглаживание позиции и вращщения для всех клиентов относительно нашего игрока
  25.         TransmitPosition ();                //Отправляем данные игрока с помощью функции, что бы проходить проверку, не является ли данный игрок сервером.
  26.     }
  27.  
  28.     void LerpPosition()                     //Описываем функцию сглаживания позиции которая вызывается в FixedUpdate
  29.     {
  30.         if (!isLocalPlayer)                 //Сглаживаем позицию для всех остальных клиентов, но не для себя с помощью этой проверки
  31.         {
  32.             transform.position = Vector3.Lerp(transform.position, syncPosition, Time.deltaTime*lerpSpeed);      //Сглаживание позиции от текущего положения клиента, до позиции на сервере
  33.             transform.rotation = Quaternion.Lerp(transform.rotation,syncRotation,Time.deltaTime*lerpSpeed);     //То же самое с углом вращения
  34.             //Сглаживание анимациий
  35.             float LerpAnimX = Mathf.Lerp(anim.GetFloat("HeadX"),SyncAnimX, Time.deltaTime*lerpSpeed);          
  36.             anim.SetFloat("HeadX", LerpAnimX);
  37.             float LerpAnimY = Mathf.Lerp(anim.GetFloat("HeadY"),SyncAnimY, Time.deltaTime*lerpSpeed);
  38.             anim.SetFloat("HeadY", LerpAnimY);
  39.         }
  40.     }
  41.    
  42.     [Client]                                //Аттрибут делающий функцию выполняемой только у клиентов
  43.     void TransmitPosition()                
  44.     {
  45.         if (isLocalPlayer)                  //Провекрка гласящая о том что мы отправляем данные о своей позиции только если сами являемся игроком
  46.         {
  47.             CmdSendPlayerData(transform.position,transform.rotation,anim.GetFloat("HeadX"),anim.GetFloat("HeadY"));     //Отправка на сервер данных игрока
  48.         }
  49.     }
  50.  
  51.     [Command]                               //Отправляет команду от клиента серверу
  52.     void CmdSendPlayerData(Vector3 pos, Quaternion rot, float AnimX, float AnimY)       //Функция принимает данные
  53.     {
  54.         syncPosition = pos;                 //Записывает позицию на стороне сервера
  55.         syncRotation = rot;                 //Записывает вращение
  56.         SyncAnimX = AnimX;                  //Записывает параметр анимации x
  57.         SyncAnimY = AnimY;                  //Записывает параметр анимации y
  58.     }  
  59.  
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement