Advertisement
alexsosnovskiy

PhotonCloud - Interpolation/Extrapolation script

Jun 8th, 2016
992
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.59 KB | None | 0 0
  1. //PhotonCloud - Copyright © 2016 Exit Games
  2. //File - PhotonTransformViewPositionControl.cs
  3.  
  4. using UnityEngine;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7.  
  8. public class PhotonTransformViewPositionControl
  9. {
  10.     PhotonTransformViewPositionModel m_Model;
  11.     float m_CurrentSpeed;
  12.     double m_LastSerializeTime;
  13.     Vector3 m_SynchronizedSpeed = Vector3.zero;
  14.     float m_SynchronizedTurnSpeed = 0;
  15.  
  16.     Vector3 m_NetworkPosition;
  17.     Queue<Vector3> m_OldNetworkPositions = new Queue<Vector3>();
  18.  
  19.     bool m_UpdatedPositionAfterOnSerialize = true;
  20.  
  21.     public PhotonTransformViewPositionControl( PhotonTransformViewPositionModel model )
  22.     {
  23.         m_Model = model;
  24.     }
  25.  
  26.     Vector3 GetOldestStoredNetworkPosition()
  27.     {
  28.         Vector3 oldPosition = m_NetworkPosition;
  29.  
  30.         if( m_OldNetworkPositions.Count > 0 )
  31.         {
  32.             oldPosition = m_OldNetworkPositions.Peek();
  33.         }
  34.  
  35.         return oldPosition;
  36.     }
  37.  
  38.     /// <summary>
  39.     /// These values are synchronized to the remote objects if the interpolation mode
  40.     /// or the extrapolation mode SynchronizeValues is used. Your movement script should pass on
  41.     /// the current speed (in units/second) and turning speed (in angles/second) so the remote
  42.     /// object can use them to predict the objects movement.
  43.     /// </summary>
  44.     /// <param name="speed">The current movement vector of the object in units/second.</param>
  45.     /// <param name="turnSpeed">The current turn speed of the object in angles/second.</param>
  46.     public void SetSynchronizedValues( Vector3 speed, float turnSpeed )
  47.     {
  48.         m_SynchronizedSpeed = speed;
  49.         m_SynchronizedTurnSpeed = turnSpeed;
  50.     }
  51.  
  52.     /// <summary>
  53.     /// Calculates the new position based on the values setup in the inspector
  54.     /// </summary>
  55.     /// <param name="currentPosition">The current position.</param>
  56.     /// <returns>The new position.</returns>
  57.     public Vector3 UpdatePosition( Vector3 currentPosition )
  58.     {
  59.         Vector3 targetPosition = GetNetworkPosition() + GetExtrapolatedPositionOffset();
  60.  
  61.         switch( m_Model.InterpolateOption )
  62.         {
  63.         case PhotonTransformViewPositionModel.InterpolateOptions.Disabled:
  64.             if( m_UpdatedPositionAfterOnSerialize == false )
  65.             {
  66.                 currentPosition = targetPosition;
  67.                 m_UpdatedPositionAfterOnSerialize = true;
  68.             }
  69.             break;
  70.         case PhotonTransformViewPositionModel.InterpolateOptions.FixedSpeed:
  71.             currentPosition = Vector3.MoveTowards( currentPosition, targetPosition, Time.deltaTime * m_Model.InterpolateMoveTowardsSpeed );
  72.             break;
  73.         case PhotonTransformViewPositionModel.InterpolateOptions.EstimatedSpeed:
  74.             int positionsCount = Mathf.Min( 1, m_OldNetworkPositions.Count );
  75.             float estimatedSpeed = Vector3.Distance( m_NetworkPosition, GetOldestStoredNetworkPosition() ) / positionsCount;
  76.             currentPosition = Vector3.MoveTowards( currentPosition, targetPosition, Time.deltaTime * estimatedSpeed );
  77.             break;
  78.         case PhotonTransformViewPositionModel.InterpolateOptions.SynchronizeValues:
  79.             if( m_SynchronizedSpeed.magnitude == 0 )
  80.             {
  81.                 currentPosition = targetPosition;
  82.             }
  83.             else
  84.             {
  85.                 currentPosition = Vector3.MoveTowards( currentPosition, targetPosition, Time.deltaTime * m_SynchronizedSpeed.magnitude );
  86.             }
  87.             break;
  88.         case PhotonTransformViewPositionModel.InterpolateOptions.Lerp:
  89.             currentPosition = Vector3.Lerp( currentPosition, targetPosition, Time.deltaTime * m_Model.InterpolateLerpSpeed );
  90.             break;
  91.         /*case PhotonTransformViewPositionModel.InterpolateOptions.MoveTowardsComplex:
  92.             float distanceToTarget = Vector3.Distance( currentPosition, targetPosition );
  93.             float targetSpeed = m_Model.InterpolateSpeedCurve.Evaluate( distanceToTarget ) * m_Model.InterpolateMoveTowardsSpeed;
  94.  
  95.             if( targetSpeed > m_CurrentSpeed )
  96.             {
  97.                 m_CurrentSpeed = Mathf.MoveTowards( m_CurrentSpeed, targetSpeed, Time.deltaTime * m_Model.InterpolateMoveTowardsAcceleration );
  98.             }
  99.             else
  100.             {
  101.                 m_CurrentSpeed = Mathf.MoveTowards( m_CurrentSpeed, targetSpeed, Time.deltaTime * m_Model.InterpolateMoveTowardsDeceleration );
  102.             }
  103.  
  104.             //Debug.Log( m_CurrentSpeed + " - " + targetSpeed + " - " + transform.localPosition + " - " + targetPosition );
  105.  
  106.             currentPosition = Vector3.MoveTowards( currentPosition, targetPosition, Time.deltaTime * m_CurrentSpeed );
  107.             break;*/
  108.         }
  109.  
  110.         if( m_Model.TeleportEnabled == true )
  111.         {
  112.             if( Vector3.Distance( currentPosition, GetNetworkPosition() ) > m_Model.TeleportIfDistanceGreaterThan )
  113.             {
  114.                 currentPosition = GetNetworkPosition();
  115.             }
  116.         }
  117.  
  118.         return currentPosition;
  119.     }
  120.  
  121.     /// <summary>
  122.     /// Gets the last position that was received through the network
  123.     /// </summary>
  124.     /// <returns></returns>
  125.     public Vector3 GetNetworkPosition()
  126.     {
  127.         return m_NetworkPosition;
  128.     }
  129.  
  130.     /// <summary>
  131.     /// Calculates an estimated position based on the last synchronized position,
  132.     /// the time when the last position was received and the movement speed of the object
  133.     /// </summary>
  134.     /// <returns>Estimated position of the remote object</returns>
  135.     public Vector3 GetExtrapolatedPositionOffset()
  136.     {
  137.         float timePassed = (float)( PhotonNetwork.time - m_LastSerializeTime );
  138.  
  139.         if( m_Model.ExtrapolateIncludingRoundTripTime == true )
  140.         {
  141.             timePassed += (float)PhotonNetwork.GetPing() / 1000f;
  142.         }
  143.  
  144.         Vector3 extrapolatePosition = Vector3.zero;
  145.  
  146.         switch( m_Model.ExtrapolateOption )
  147.         {
  148.         case PhotonTransformViewPositionModel.ExtrapolateOptions.SynchronizeValues:
  149.             Quaternion turnRotation = Quaternion.Euler( 0, m_SynchronizedTurnSpeed * timePassed, 0 );
  150.             extrapolatePosition = turnRotation * ( m_SynchronizedSpeed * timePassed );
  151.             break;
  152.         case PhotonTransformViewPositionModel.ExtrapolateOptions.FixedSpeed:
  153.             Vector3 moveDirection = ( m_NetworkPosition - GetOldestStoredNetworkPosition() ).normalized;
  154.  
  155.             extrapolatePosition = moveDirection * m_Model.ExtrapolateSpeed * timePassed;
  156.             break;
  157.         case PhotonTransformViewPositionModel.ExtrapolateOptions.EstimateSpeedAndTurn:
  158.             Vector3 moveDelta = ( m_NetworkPosition - GetOldestStoredNetworkPosition() ) * PhotonNetwork.sendRateOnSerialize;
  159.             extrapolatePosition = moveDelta * timePassed;
  160.             break;
  161.         }
  162.  
  163.         return extrapolatePosition;
  164.     }
  165.  
  166.     public void OnPhotonSerializeView( Vector3 currentPosition, PhotonStream stream, PhotonMessageInfo info )
  167.     {
  168.         if( m_Model.SynchronizeEnabled == false )
  169.         {
  170.             return;
  171.         }
  172.  
  173.         if( stream.isWriting == true )
  174.         {
  175.             SerializeData( currentPosition, stream, info );
  176.         }
  177.         else
  178.         {
  179.             DeserializeData( stream, info );
  180.         }
  181.  
  182.         m_LastSerializeTime = PhotonNetwork.time;
  183.         m_UpdatedPositionAfterOnSerialize = false;
  184.     }
  185.  
  186.     void SerializeData( Vector3 currentPosition, PhotonStream stream, PhotonMessageInfo info )
  187.     {
  188.         stream.SendNext( currentPosition );
  189.  
  190.         if( m_Model.ExtrapolateOption == PhotonTransformViewPositionModel.ExtrapolateOptions.SynchronizeValues ||
  191.             m_Model.InterpolateOption == PhotonTransformViewPositionModel.InterpolateOptions.SynchronizeValues )
  192.         {
  193.             stream.SendNext( m_SynchronizedSpeed );
  194.             stream.SendNext( m_SynchronizedTurnSpeed );
  195.         }
  196.     }
  197.  
  198.     void DeserializeData( PhotonStream stream, PhotonMessageInfo info )
  199.     {
  200.         m_OldNetworkPositions.Enqueue( m_NetworkPosition );
  201.  
  202.         while( m_OldNetworkPositions.Count > m_Model.ExtrapolateNumberOfStoredPositions )
  203.         {
  204.             m_OldNetworkPositions.Dequeue();
  205.         }
  206.  
  207.         m_NetworkPosition = (Vector3)stream.ReceiveNext();
  208.  
  209.         if( m_Model.ExtrapolateOption == PhotonTransformViewPositionModel.ExtrapolateOptions.SynchronizeValues ||
  210.             m_Model.InterpolateOption == PhotonTransformViewPositionModel.InterpolateOptions.SynchronizeValues )
  211.         {
  212.             m_SynchronizedSpeed = (Vector3)stream.ReceiveNext();
  213.             m_SynchronizedTurnSpeed = (float)stream.ReceiveNext();
  214.         }
  215.     }
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement