4 #if UNITY_WINRT && !UNITY_EDITOR 9 using System.Collections.Generic;
10 using System.Globalization;
24 private Dictionary<long, SyncPrimitive> primitiveMap;
25 private List<SyncPrimitive> primitives;
36 get {
return internalObjectElement; }
39 if (internalObjectElement == null)
41 internalObjectElement = value;
42 NetworkElement = value;
44 if (internalObjectElement != null)
46 CreateSyncListener(internalObjectElement);
53 public override object RawValue
94 get {
return internalObjectElement != null ? internalObjectElement.
GetOwnerID() :
int.MaxValue; }
100 InitializePrimitives();
106 InitializePrimitives();
115 return primitives.ToArray();
118 private void InitializePrimitives()
120 primitiveMap =
new Dictionary<long, SyncPrimitive>();
121 primitives =
new List<SyncPrimitive>();
124 Type baseType = GetType();
127 var typeFields = baseType.GetRuntimeFields();
129 var typeFields = baseType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
132 foreach (FieldInfo typeField
in typeFields)
139 object[] customAttributes = typeField.GetCustomAttributes(typeof(
SyncDataAttribute),
true);
140 if (customAttributes.Length > 0)
146 if (attribute != null)
148 Type fieldType = typeField.FieldType;
149 string memberName = typeField.Name;
159 if (dataPrimitive == null)
168 bool hasConstructor = fieldType.GetConstructor(
new[] { typeof(
string) }) != null;
171 dataPrimitive = (SyncPrimitive)Activator.CreateInstance(fieldType, memberName);
176 dataPrimitive = (SyncPrimitive)Activator.CreateInstance(fieldType, null);
180 typeField.SetValue(
this, dataPrimitive);
184 Debug.LogWarningFormat(
"Unable to create SyncPrimitive of type {0}. Exception: {1}", memberName, ex);
188 if (dataPrimitive != null)
191 AddChild(dataPrimitive);
205 long guid = data.
Guid;
207 primitiveMap.Add(guid, data);
210 if (!primitives.Contains(data))
212 primitives.Add(data);
229 if (parentElement != null)
243 bool primitiveDataChanged =
false;
244 for (
int i = 0; i < primitives.Count; i++)
246 if (primitives[i].XStringFieldName.IsEqual(element.
GetName()))
249 primitives[i].AddFromRemote(element);
253 primitiveMap[guid] = primitives[i];
254 primitiveDataChanged =
true;
259 if (primitiveDataChanged)
262 if (primitiveMap.Count == primitives.Count)
264 if (InitializationComplete != null)
266 InitializationComplete(
this);
280 if (primitiveMap.ContainsKey(guid))
282 RemoveChild(primitiveMap[guid]);
293 if (primitiveMap.ContainsKey(elementID))
297 NotifyPrimitiveChanged(primitive);
301 LogUnknownElement(elementID.ToString(), newValue.ToString(), typeof(
bool));
312 if (primitiveMap.ContainsKey(elementID))
316 NotifyPrimitiveChanged(primitive);
320 LogUnknownElement(elementID.ToString(), newValue.ToString(), typeof(
int));
331 if (primitiveMap.ContainsKey(elementID))
335 NotifyPrimitiveChanged(primitive);
339 LogUnknownElement(elementID.ToString(), newValue.ToString(), typeof(
long));
350 if (primitiveMap.ContainsKey(elementID))
354 NotifyPrimitiveChanged(primitive);
358 LogUnknownElement(elementID.ToString(), newValue.ToString(CultureInfo.InvariantCulture), typeof(
float));
369 if (primitiveMap.ContainsKey(elementID))
373 NotifyPrimitiveChanged(primitive);
377 LogUnknownElement(elementID.ToString(), newValue.ToString(CultureInfo.InvariantCulture), typeof(
double));
388 if (primitiveMap.ContainsKey(elementID))
392 NotifyPrimitiveChanged(primitive);
396 LogUnknownElement(elementID.ToString(), newValue.
GetString(), typeof(
string));
400 private void LogUnknownElement(
string elementName,
string elementValue, Type elementType)
402 Debug.LogWarningFormat(
"Error: Trying to update an unknown child element! Discarding update. Type: {0}, Value: {1}, Id: {2}", elementType, elementValue, elementName);
407 ObjectChanged.RaiseEvent(
this);
425 #region From SyncPrimitive 441 for (
int i = 0; i < primitives.Count; i++)
445 primitiveMap[data.
Guid] = data;
449 if (InitializationComplete != null)
451 InitializationComplete(
this);
458 NetworkElement = remoteElement;
461 #endregion //From SyncPrimitive