alexsosnovskiy

Unity 5 UNET Sync Transform script

Jul 8th, 2015
611
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.14 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3.  
  4. public class NetworkSyncTransform : NetworkBehaviour
  5. {
  6.     [SerializeField]
  7.     private float _posLerpRate = 15;
  8.     [SerializeField]
  9.     private float _rotLerpRate = 15;
  10.  
  11.     [SerializeField]
  12.     private float _posThreshold = 0.1f;
  13.     [SerializeField]
  14.     private float _rotThreshold = 1f;
  15.  
  16.     [SyncVar]
  17.     private Vector3 _lastPosition;
  18.     [SyncVar]
  19.     private Vector3 _lastRotation;
  20.  
  21.     [ClientCallback]
  22.     void Update()
  23.     {
  24.         if (isLocalPlayer)
  25.             return;
  26.  
  27.         InterpolatePosition();
  28.         InterpolateRotation();
  29.     }
  30.  
  31.     [ClientCallback]
  32.     void FixedUpdate()
  33.     {
  34.         if (!isLocalPlayer)
  35.             return;
  36.  
  37.         var posChanged = IsPositionChanged();
  38.  
  39.         if (posChanged)
  40.         {
  41.             CmdSendPosition(transform.position);
  42.             _lastPosition = transform.position;
  43.         }
  44.  
  45.         var rotChanged = IsRotationChanged();
  46.  
  47.         if (rotChanged)
  48.         {
  49.             CmdSendRotation(transform.localEulerAngles);
  50.             _lastRotation = transform.localEulerAngles;
  51.         }
  52.     }
  53.  
  54.     [Command(channel = Channels.DefaultUnreliable)]
  55.     private void CmdSendPosition(Vector3 pos)
  56.     {
  57.         _lastPosition = pos;
  58.     }
  59.  
  60.     [Command(channel = Channels.DefaultUnreliable)]
  61.     private void CmdSendRotation(Vector3 rot)
  62.     {
  63.         _lastRotation = rot;
  64.     }
  65.  
  66.     private void InterpolatePosition()
  67.     {
  68.         transform.position = Vector3.Lerp(transform.position, _lastPosition, Time.deltaTime * _posLerpRate);
  69.     }
  70.  
  71.     private void InterpolateRotation()
  72.     {
  73.         transform.localEulerAngles = Vector3.Lerp(transform.localEulerAngles, _lastRotation, Time.deltaTime * _rotLerpRate);
  74.     }
  75.  
  76.     private bool IsPositionChanged()
  77.     {
  78.         return Vector3.Distance(transform.position, _lastPosition) > _posThreshold;
  79.     }
  80.  
  81.     private bool IsRotationChanged()
  82.     {
  83.         return Vector3.Distance(transform.localEulerAngles, _lastRotation) > _rotThreshold;
  84.     }
  85.  
  86.     public override int GetNetworkChannel()
  87.     {
  88.         return Channels.DefaultUnreliable;
  89.     }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment