@@ -704,21 +704,7 @@ private void ApplyAuthoritativeState()
704704 // We always apply the interpolated state for any axis we are synchronizing even when the state has no deltas
705705 // to assure we fully interpolate to our target even after we stop extrapolating 1 tick later.
706706 var useInterpolatedValue = ! networkState . IsTeleportingNextFrame && Interpolate ;
707- if ( ! useInterpolatedValue )
708- {
709- if ( networkState . HasPositionX ) { adjustedPosition . x = networkState . PositionX ; }
710- if ( networkState . HasPositionY ) { adjustedPosition . y = networkState . PositionY ; }
711- if ( networkState . HasPositionZ ) { adjustedPosition . z = networkState . PositionZ ; }
712-
713- if ( networkState . HasScaleX ) { adjustedScale . x = networkState . ScaleX ; }
714- if ( networkState . HasScaleY ) { adjustedScale . y = networkState . ScaleY ; }
715- if ( networkState . HasScaleZ ) { adjustedScale . z = networkState . ScaleZ ; }
716-
717- if ( networkState . HasRotAngleX ) { adjustedRotAngles . x = networkState . RotAngleX ; }
718- if ( networkState . HasRotAngleY ) { adjustedRotAngles . y = networkState . RotAngleY ; }
719- if ( networkState . HasRotAngleZ ) { adjustedRotAngles . z = networkState . RotAngleZ ; }
720- }
721- else if ( useInterpolatedValue )
707+ if ( useInterpolatedValue )
722708 {
723709 if ( SyncPositionX ) { adjustedPosition . x = m_PositionXInterpolator . GetInterpolatedValue ( ) ; }
724710 if ( SyncPositionY ) { adjustedPosition . y = m_PositionYInterpolator . GetInterpolatedValue ( ) ; }
@@ -736,6 +722,30 @@ private void ApplyAuthoritativeState()
736722 if ( SyncRotAngleZ ) { adjustedRotAngles . z = interpolatedEulerAngles . z ; }
737723 }
738724 }
725+ else
726+ {
727+ if ( networkState . HasPositionX ) { adjustedPosition . x = networkState . PositionX ; }
728+ if ( networkState . HasPositionY ) { adjustedPosition . y = networkState . PositionY ; }
729+ if ( networkState . HasPositionZ ) { adjustedPosition . z = networkState . PositionZ ; }
730+
731+ if ( networkState . HasScaleX ) { adjustedScale . x = networkState . ScaleX ; }
732+ if ( networkState . HasScaleY ) { adjustedScale . y = networkState . ScaleY ; }
733+ if ( networkState . HasScaleZ ) { adjustedScale . z = networkState . ScaleZ ; }
734+
735+ if ( networkState . HasRotAngleX ) { adjustedRotAngles . x = networkState . RotAngleX ; }
736+ if ( networkState . HasRotAngleY ) { adjustedRotAngles . y = networkState . RotAngleY ; }
737+ if ( networkState . HasRotAngleZ ) { adjustedRotAngles . z = networkState . RotAngleZ ; }
738+ }
739+
740+ // NOTE: The below conditional checks for applying axial values are required in order to
741+ // prevent the non-authoritative side from making adjustments when interpolation is off.
742+
743+ // TODO: Determine if we want to enforce, frame by frame, the non-authoritative transform values.
744+ // We would want save the position, rotation, and scale (each individually) after applying each
745+ // authoritative transform state received. Otherwise, the non-authoritative side could make
746+ // changes to an axial value (if interpolation is turned off) until authority sends an update for
747+ // that same axial value. When interpolation is on, the state's values being synchronized are
748+ // always applied each frame.
739749
740750 // Apply the new position if it has changed or we are interpolating and synchronizing position
741751 if ( networkState . HasPositionChange || ( useInterpolatedValue && SynchronizePosition ) )
0 commit comments