130 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using FishNet.Managing.Predicting;
 | |
| using FishNet.Managing.Timing;
 | |
| using FishNet.Object;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace FishNet.Component.Prediction
 | |
| {
 | |
|     public partial class OfflineRigidbody : MonoBehaviour
 | |
|     {
 | |
| 
 | |
|         #region Serialized.
 | |
|         /// <summary>
 | |
|         /// Type of prediction movement which is being used.
 | |
|         /// </summary>
 | |
|         [Tooltip("Type of prediction movement which is being used.")]
 | |
|         [SerializeField]
 | |
|         private RigidbodyType _rigidbodyType;
 | |
|         /// <summary>
 | |
|         /// GraphicalObject to unparent when pausing.
 | |
|         /// </summary>
 | |
|         private Transform _graphicalObject;
 | |
|         /// <summary>
 | |
|         /// Sets GraphicalObject.
 | |
|         /// </summary>
 | |
|         /// <param name="value"></param>
 | |
|         public void SetGraphicalObject(Transform value)
 | |
|         {
 | |
|             _graphicalObject = value;
 | |
|             UpdateRigidbodies();
 | |
|         }               
 | |
|         /// <summary>
 | |
|         /// True to also get rigidbody components within children.
 | |
|         /// </summary>
 | |
|         [Tooltip("True to also get rigidbody components within children.")]
 | |
|         [SerializeField]
 | |
|         private bool _getInChildren;
 | |
|         #endregion
 | |
| 
 | |
|         #region Private.
 | |
|         /// <summary>
 | |
|         /// Pauser for rigidbodies.
 | |
|         /// </summary>
 | |
|         private RigidbodyPauser _rigidbodyPauser = new RigidbodyPauser();
 | |
|         /// <summary>
 | |
|         /// TimeManager subscribed to.
 | |
|         /// </summary>
 | |
|         private PredictionManager _predictionManager;
 | |
|         #endregion
 | |
| 
 | |
| 
 | |
|         private void Awake()
 | |
|         {
 | |
|             InitializeOnce();
 | |
|         }
 | |
| 
 | |
| 
 | |
|         private void OnDestroy()
 | |
|         {
 | |
|             ChangeSubscription(false);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes this script for use.
 | |
|         /// </summary>
 | |
|         private void InitializeOnce()
 | |
|         {
 | |
|             _predictionManager = InstanceFinder.PredictionManager;
 | |
|             UpdateRigidbodies();
 | |
|             ChangeSubscription(true);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Sets a new TimeManager to use.
 | |
|         /// </summary>
 | |
|         /// <param name="tm"></param>
 | |
|         public void SetPredictionManager(PredictionManager pm)
 | |
|         {
 | |
|             if (pm == _predictionManager)
 | |
|                 return;
 | |
| 
 | |
|             //Unsub from current.
 | |
|             ChangeSubscription(false);
 | |
|             //Sub to newest.
 | |
|             _predictionManager = pm;
 | |
|             ChangeSubscription(true);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Finds and assigns rigidbodie using configured settings.
 | |
|         /// </summary>
 | |
|         public void UpdateRigidbodies()
 | |
|         {
 | |
|             _rigidbodyPauser.UpdateRigidbodies(transform, _rigidbodyType, _getInChildren, _graphicalObject);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Changes the subscription to the TimeManager.
 | |
|         /// </summary>
 | |
|         private void ChangeSubscription(bool subscribe)
 | |
|         {
 | |
|             if (_predictionManager == null)
 | |
|                 return;
 | |
| 
 | |
|             if (subscribe)
 | |
|             {
 | |
|                 _predictionManager.OnPreReconcile += _predictionManager_OnPreReconcile;
 | |
|                 _predictionManager.OnPostReconcile += _predictionManager_OnPostReconcile;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 _predictionManager.OnPreReconcile -= _predictionManager_OnPreReconcile;
 | |
|                 _predictionManager.OnPostReconcile -= _predictionManager_OnPostReconcile;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void _predictionManager_OnPreReconcile(NetworkBehaviour obj)
 | |
|         {
 | |
|             //Make rbs all kinematic/!simulated before reconciling, which would also result in replays.
 | |
|             _rigidbodyPauser.Pause();
 | |
|         }
 | |
| 
 | |
|         private void _predictionManager_OnPostReconcile(NetworkBehaviour obj)
 | |
|         {
 | |
|             _rigidbodyPauser.Unpause();
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |