private void UpdateDataState <T>() where T : struct, IComponentData { ComponentType componentType = ComponentType.Create <T>(); ComponentGroup group = GetComponentGroup(ComponentType.Create <NetworkSyncState>(), componentType, ComponentType.Create <NetworkComponentState <T> >(), ComponentType.Create <NetworktAuthority>()); ComponentDataArray <NetworkSyncState> networkSyncStateComponents = group.GetComponentDataArray <NetworkSyncState>(); ComponentDataArray <T> networkComponents = group.GetComponentDataArray <T>(); ComponentDataArray <NetworkComponentState <T> > networkComponentStates = group.GetComponentDataArray <NetworkComponentState <T> >(); EntityArray entities = group.GetEntityArray(); ComponentDataFromEntity <NetworkSyncState> networkSyncStateEntities = EntityManager.GetComponentDataFromEntity <NetworkSyncState>(); NetworkMemberInfo[] networkMemberInfos = reflectionUtility.GetNetworkMemberInfo(componentType); for (int i = 0; i < entities.Length; i++) { DynamicBuffer <int> values = EntityManager.GetBuffer <NetworkValue>(networkComponentStates[i].dataEntity).Reinterpret <int>(); ComponentDataContainer componentDataContainer = new ComponentDataContainer { ComponentTypeId = reflectionUtility.GetComponentTypeID(componentType), }; for (int j = 0; j < networkMemberInfos.Length; j++) { NetworkMemberInfo <T> networkMemberInfo = (networkMemberInfos[j] as NetworkMemberInfo <T>); if (networkMemberInfo.netSyncOptions.InitOnly) { continue; } int newValue = networkMemberInfo.GetValue(networkComponents[i], networkSyncStateEntities); if (newValue != values[j]) { componentDataContainer.MemberData.Add(new MemberDataContainer { MemberId = j, Data = newValue, }); } values[j] = newValue; } if (componentDataContainer.MemberData.Count != 0) { NetworkSyncState networkSyncState = networkSyncStateComponents[i]; ownNetworkSendMessageUtility.SetComponentData(entities[i], networkSyncState.actorId, networkSyncState.networkId, componentDataContainer); AllNetworkSendMessageUtility.SetComponentData(entities[i], networkSyncState.actorId, networkSyncState.networkId, componentDataContainer); } } }
private void ExtractNetworkMemberInfos(Type type) { componentTypeId++; componentTypeToIdMap.Add(type, componentTypeId); idToComponentTypeMap.Add(componentTypeId, type); int numberOfMembers = 0; List <NetworkMemberInfo> networkMemberInfos = new List <NetworkMemberInfo>(); MemberInfo[] memberInfos = type.GetMembers().OrderBy((x) => x.Name).Where(memberInfo => memberInfo.IsDefined(typeof(NetSyncMemberAttribute), false)).ToArray(); for (int i = 0; i < memberInfos.Length; i++) { MemberInfo memberInfo = memberInfos[i]; Type networkMemberInfoType = typeof(NetworkMemberInfo <,>); Type mainMemberInfoTypeType = memberInfo.MemberType == MemberTypes.Field ? (memberInfo as FieldInfo).FieldType : (memberInfo as PropertyInfo).PropertyType; Type mainMemberInfoGenericType = networkMemberInfoType.MakeGenericType(type, mainMemberInfoTypeType); NetSyncMemberAttribute netSyncMemberAttribute = memberInfo.GetCustomAttribute <NetSyncMemberAttribute>(false); NetworkMemberInfo mainMemberInfo = (NetworkMemberInfo)Activator.CreateInstance(mainMemberInfoGenericType, memberInfo, netSyncMemberAttribute); NetSyncSubMemberAttribute[] netSyncSubMemberAttributes = memberInfo.GetCustomAttributes <NetSyncSubMemberAttribute>(false).ToArray(); numberOfMembers += netSyncSubMemberAttributes.Length; foreach (NetSyncSubMemberAttribute NetSyncSubMemberAttribute in netSyncSubMemberAttributes) { if (!NetSyncSubMemberAttribute.OverriddenValues) { NetSyncSubMemberAttribute.SetValuesFrom(netSyncMemberAttribute); } Type subType = memberInfo.MemberType == MemberTypes.Field ? (memberInfo as FieldInfo).FieldType : (memberInfo as PropertyInfo).PropertyType; bool found = false; IEnumerable <MemberInfo> subMemberInfos = subType.GetMembers().OrderBy(x => x.Name); foreach (MemberInfo subMemberInfo in subMemberInfos) { if (subMemberInfo.Name.Equals(NetSyncSubMemberAttribute.MemberName)) { Type networkSubMemberInfoType = typeof(NetworkMemberInfo <, ,>); Type mainSubMemberInfoTypeType = subMemberInfo.MemberType == MemberTypes.Field ? (subMemberInfo as FieldInfo).FieldType : (subMemberInfo as PropertyInfo).PropertyType; Type subMemberInfoGenericType = networkSubMemberInfoType.MakeGenericType(type, subType, mainSubMemberInfoTypeType); networkMemberInfos.Add((NetworkMemberInfo)Activator.CreateInstance(subMemberInfoGenericType, subMemberInfo, mainMemberInfo, NetSyncSubMemberAttribute)); found = true; break; } } if (!found) { throw new MissingMemberException(NetSyncSubMemberAttribute.MemberName); } } if (netSyncSubMemberAttributes.Length == 0) { numberOfMembers++; networkMemberInfos.Add(mainMemberInfo); } } cashedNetworkMemberInfo.Add(type, networkMemberInfos.ToArray()); componentTypeMemberCount.Add(type, numberOfMembers); }