Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using UnityEngine.Networking;
- public class PlayerSyncPos : NetworkBehaviour
- {
- [SyncVar]
- private Vector3 syncPosition; //Переменная отвечающая за позицию игрока на сервере
- public float lerpSpeed = 20; //Переменная отвечающая скорость сглаживания позиции и вращения
- [SyncVar]
- private Quaternion syncRotation; //Переменная отвечающая за кватернион вращения игрока на сервере
- [SyncVar] float SyncAnimX; //Переменная отвечающая за параметр анимации на сервере
- [SyncVar] float SyncAnimY; //Переменная отвечающая за параметр анимации на сервере
- private Animator anim; //Переменная для быстрого доступа к аниматору
- void Start()
- {
- anim = GetComponent<Animator> (); //Указываем в переменную компонент animator установленный на игроке
- }
- void FixedUpdate () //Функция вызывается автоматически каждые 0.02
- {
- LerpPosition (); //Вызываем функцию сглаживание позиции и вращщения для всех клиентов относительно нашего игрока
- TransmitPosition (); //Отправляем данные игрока с помощью функции, что бы проходить проверку, не является ли данный игрок сервером.
- }
- void LerpPosition() //Описываем функцию сглаживания позиции которая вызывается в FixedUpdate
- {
- if (!isLocalPlayer) //Сглаживаем позицию для всех остальных клиентов, но не для себя с помощью этой проверки
- {
- transform.position = Vector3.Lerp(transform.position, syncPosition, Time.deltaTime*lerpSpeed); //Сглаживание позиции от текущего положения клиента, до позиции на сервере
- transform.rotation = Quaternion.Lerp(transform.rotation,syncRotation,Time.deltaTime*lerpSpeed); //То же самое с углом вращения
- //Сглаживание анимациий
- float LerpAnimX = Mathf.Lerp(anim.GetFloat("HeadX"),SyncAnimX, Time.deltaTime*lerpSpeed);
- anim.SetFloat("HeadX", LerpAnimX);
- float LerpAnimY = Mathf.Lerp(anim.GetFloat("HeadY"),SyncAnimY, Time.deltaTime*lerpSpeed);
- anim.SetFloat("HeadY", LerpAnimY);
- }
- }
- [Client] //Аттрибут делающий функцию выполняемой только у клиентов
- void TransmitPosition()
- {
- if (isLocalPlayer) //Провекрка гласящая о том что мы отправляем данные о своей позиции только если сами являемся игроком
- {
- CmdSendPlayerData(transform.position,transform.rotation,anim.GetFloat("HeadX"),anim.GetFloat("HeadY")); //Отправка на сервер данных игрока
- }
- }
- [Command] //Отправляет команду от клиента серверу
- void CmdSendPlayerData(Vector3 pos, Quaternion rot, float AnimX, float AnimY) //Функция принимает данные
- {
- syncPosition = pos; //Записывает позицию на стороне сервера
- syncRotation = rot; //Записывает вращение
- SyncAnimX = AnimX; //Записывает параметр анимации x
- SyncAnimY = AnimY; //Записывает параметр анимации y
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement