77 lines
2.4 KiB
C#
77 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using JetBrains.Annotations;
|
|
using Unity.HLODSystem.Streaming;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.HLODSystem.Serializer
|
|
{
|
|
public abstract class UserDataSerializerBase : MonoBehaviour , ISerializationCallbackReceiver
|
|
{
|
|
private Dictionary<int, int> m_idTable = new Dictionary<int, int>();
|
|
|
|
[SerializeField]
|
|
[HideInInspector]
|
|
private List<int> m_idList = new List<int>();
|
|
[SerializeField]
|
|
[HideInInspector]
|
|
private List<HLODUserData> m_userDataList = new List<HLODUserData>();
|
|
|
|
public void SerializeUserData(HLODControllerBase controller, int id, GameObject gameObject)
|
|
{
|
|
int index = 0;
|
|
int encodedID = EncodeID(controller.ControllerID, id);
|
|
if (m_idTable.TryGetValue(encodedID, out index) == false)
|
|
{
|
|
HLODUserData userData = new HLODUserData();
|
|
SerializeUserData(gameObject, userData);
|
|
|
|
if (userData.HasAnyData())
|
|
{
|
|
m_idList.Add(encodedID);
|
|
m_userDataList.Add(userData);
|
|
m_idTable[encodedID] = m_userDataList.Count - 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
HLODUserData userData = m_userDataList[index];
|
|
SerializeUserData(gameObject, userData);
|
|
}
|
|
}
|
|
|
|
public void DeserializeUserData(HLODControllerBase controller, int id, GameObject gameObject)
|
|
{
|
|
int index = 0;
|
|
int encodedID = EncodeID(controller.ControllerID, id);
|
|
if (m_idTable.TryGetValue(encodedID, out index) == false)
|
|
return;
|
|
|
|
DeserializeUserData(gameObject, m_userDataList[index]);
|
|
}
|
|
|
|
#region Interface
|
|
protected abstract void SerializeUserData(GameObject gameObject, HLODUserData data);
|
|
protected abstract void DeserializeUserData(GameObject gameObject, HLODUserData data);
|
|
#endregion
|
|
|
|
public void OnBeforeSerialize()
|
|
{
|
|
}
|
|
|
|
public void OnAfterDeserialize()
|
|
{
|
|
m_idTable.Clear();
|
|
|
|
for (int i = 0; i < m_idList.Count; ++i)
|
|
{
|
|
m_idTable[m_idList[i]] = i;
|
|
}
|
|
}
|
|
|
|
private int EncodeID(int controllerID, int id)
|
|
{
|
|
return (controllerID & 0xff) << 24 | id;
|
|
}
|
|
}
|
|
} |