Ejemplo n.º 1
0
    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);
            }
        }
    }
Ejemplo n.º 2
0
    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);
    }