示例#1
0
        public void SetUp()
        {
            NetworkableId <Type> .Create(null);

            // Assign IDs for all networkable types

            NetworkableId <Type> .AddWithId(typeof(AbstractBaseByValue), 128);

            NetworkableId <Type> .AddWithId(typeof(ConcreteChildByValue), 129);

            NetworkableId <Type> .AddWithId(typeof(AbstractBaseById), 130);

            NetworkableId <Type> .AddWithId(typeof(ConcreteChildById), 131);

            NetworkableId <Type> .AddWithId(typeof(NullMembers), 132);

            // Items that get networked by ID need to have an ID hierarchy setup

            NetworkableId <AbstractBaseById> .Create(null);

            NetworkableId <ConcreteChildById> .Create(typeof(AbstractBaseById));

            // Register Photon serializer/deserializer callbacks for the types

            PhotonRegisterSerializers registerSerializers = new PhotonRegisterSerializers();

            registerSerializers.RegisterSerializersForDefaultObjectType(typeof(AbstractBaseByValue));
            registerSerializers.RegisterSerializersForValueType(typeof(ConcreteChildByValue));
            registerSerializers.RegisterSerializersForDefaultObjectType(typeof(AbstractBaseById));
            registerSerializers.RegisterSerializersForIdType(typeof(ConcreteChildById));
            registerSerializers.RegisterSerializersForValueType(typeof(NullMembers));
        }
示例#2
0
    public static void Initialize(NetworkableSettings networkableSettings, RegisterSerializers registerSerializers)
    {
        Assembly currAssembly = Assembly.GetExecutingAssembly();

        Dictionary <Type, Type> typeToRoot = new Dictionary <Type, Type>();

        List <Type> networkable = new List <Type>();
        List <Type> roots       = new List <Type>();
        List <Type> children    = new List <Type>();
        List <Type> needsDefaultObjectSerializers = new List <Type>();
        List <Type> needsReferenceSerializers     = new List <Type>();
        List <Type> needsValueSerializers         = new List <Type>();

        List <Type> loadResourcesAndInitializeIds = new List <Type>();

        foreach (Type type in currAssembly.GetTypes())
        {
            object[] attributesWithInheritance = type.GetCustomAttributes(true);
            bool     isNetworkableById         = Array.Exists <object>(attributesWithInheritance, attribute => attribute is NetworkableById);
            bool     isNetworkableByValue      = Array.Exists <object>(attributesWithInheritance, attribute => attribute is NetworkableByValue);
            bool     isNetworkable             = (isNetworkableById || isNetworkableByValue);

            Assert.IsFalse(isNetworkableById && isNetworkableByValue, "Class " + type.FullName + " is tagged both as NetworkableByValue and NetworkableById. This is not supported.");

            object[] baseAttributesWithInheritance = (type.BaseType != null ? type.BaseType.GetCustomAttributes(true) : new object[0]);
            bool     isBaseNetworkableById         = Array.Exists <object>(baseAttributesWithInheritance, attribute => attribute is NetworkableById);
            bool     isBaseNetworkableByValue      = Array.Exists <object>(baseAttributesWithInheritance, attribute => attribute is NetworkableByValue);
            bool     isBaseNetworkable             = (isBaseNetworkableById || isBaseNetworkableByValue);

            bool isNetworkableRoot = (isNetworkable && !isBaseNetworkable);

            if (isNetworkable)
            {
                networkable.Add(type);

                if (isNetworkableRoot)
                {
                    roots.Add(type);
                }
                else
                {
                    children.Add(type);
                }

                if (isNetworkableByValue && !type.IsAbstract)
                {
                    needsValueSerializers.Add(type);
                }
                else if (isNetworkableById)
                {
                    needsReferenceSerializers.Add(type);
                }
                else
                {
                    needsDefaultObjectSerializers.Add(type);
                }

                if (isNetworkableById && isNetworkableRoot)
                {
                    loadResourcesAndInitializeIds.Add(type);
                }
            }
        }

        foreach (Type type in networkable)
        {
            Type root = type;
            while (!roots.Exists(rootEntry => rootEntry == root))
            {
                root = root.BaseType;
            }

            typeToRoot[type] = root;
        }

        NetworkableId <Type> .Create(null);

        Debug.Log("========= register networkable classes =====");

        RegisterNetworkableTypes(networkable, networkableSettings.PersistentTypeIds);

        Debug.Log("========= setup NetworkableId registries for root classes =====");

        foreach (Type root in roots)
        {
            RegisterNetworkableIdHierarchy(root, null);
        }

        Debug.Log("========= set Networkableid registries for child classes =====");

        foreach (Type child in children)
        {
            RegisterNetworkableIdHierarchy(child, typeToRoot[child]);
        }

        Debug.Log("========= register byValue serializers =====");

        foreach (Type type in needsValueSerializers)
        {
            registerSerializers.RegisterSerializersForValueType(type);
        }

        Debug.Log("========= register byId serializers =====");

        foreach (Type type in needsReferenceSerializers)
        {
            registerSerializers.RegisterSerializersForIdType(type);
        }

        Debug.Log("========= register default-object serializers =====");

        foreach (Type type in needsDefaultObjectSerializers)
        {
            registerSerializers.RegisterSerializersForDefaultObjectType(type);
        }

        Debug.Log("========= register assets that are by-id and present in asset database =====");

        RegisterNetworkableAssets(networkableSettings.PersistentAssetIds);
    }