using Game.Plugins.App;
using Game.Plugins.App.Sync;
using UnityEngine;
namespace Pathfinding {
/// Exposes internal methods from
public interface IVersionedMonoBehaviourInternal {
void UpgradeFromUnityThread();
}
/// Base class for all components in the package
public abstract class VersionedMonoBehaviour : JNGSyncFrameDefault, ISerializationCallbackReceiver, IVersionedMonoBehaviourInternal {
/// Version of the serialized data. Used for script upgrades.
[SerializeField]
[HideInInspector]
int version = 0;
public override void OnSyncLoad()
{
// Make sure the version field is up to date for components created during runtime.
// Reset is not called when in play mode.
// If the data had to be upgraded then OnAfterDeserialize would have been called earlier.
if (Application.isPlaying) version = OnUpgradeSerializedData(int.MaxValue, true);
}
/// Handle serialization backwards compatibility
protected virtual void Reset () {
// Set initial version when adding the component for the first time
version = OnUpgradeSerializedData(int.MaxValue, true);
}
/// Handle serialization backwards compatibility
void ISerializationCallbackReceiver.OnBeforeSerialize () {
}
/// Handle serialization backwards compatibility
void ISerializationCallbackReceiver.OnAfterDeserialize () {
UpgradeSerializedData(false);
}
protected void UpgradeSerializedData (bool isUnityThread) {
var r = OnUpgradeSerializedData(version, isUnityThread);
// Negative values (-1) indicate that the version number should not be updated
if (r >= 0) version = r;
}
/// Handle serialization backwards compatibility
protected virtual int OnUpgradeSerializedData (int version, bool unityThread) {
return 1;
}
void IVersionedMonoBehaviourInternal.UpgradeFromUnityThread () {
var r = OnUpgradeSerializedData(version, true);
if (r < 0) throw new System.Exception();
version = r;
}
}
}