public NetSyncOptions(string name, float lerpSpeed = 1, int accuracy = 2, float jumpThreshold = 0, bool initOnly = false)
 {
     Name = name;
     NetSyncMemberAttribute = new NetSyncMemberAttribute(lerpSpeed, accuracy, jumpThreshold, initOnly);
 }
예제 #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);
    }