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();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} |