public void Assemble(FCEquipmentsBase equipment, AvatarController avatar)
    {
        // check if the equipment is resource-meet, if not, load default resource.
        FCEquipmentsBase equipmentRes = CheckEquipmentResource(equipment);

        if (equipmentRes == null)
        {
            return;
        }

        System.Collections.Generic.List <Renderer> renderers = new System.Collections.Generic.List <Renderer>();
        //mount the equipment models
        foreach (FCEquipmentsBase.EquipmentSlot slot in equipmentRes._equipmentSlots)
        {
            if (!string.IsNullOrEmpty(slot._modelPath)) //equipment does not have a mesh
            {
                GameObject prefab = InJoy.AssetBundles.AssetBundles.Load(GetModelPathOnQuality(slot._modelPath, avatar._quality)) as GameObject;

                GameObject equipmentInstance = null;

                if (prefab != null)
                {
                    Transform transSlot = avatar.GetSlotNode(slot._equipSlot);
                    if (equipment._specNode != "" &&
                        equipment._isLogicEquipment)
                    {
                        transSlot = Utils.GetNode(equipment._specNode, avatar.gameObject).transform;
                    }
                    equipmentInstance = Utils.InstantiateGameObjectWithParent(prefab, transSlot).gameObject;

                    equipmentInstance.name = prefab.name;

                    // create connection.
                    MessageReciever[] receivers = equipmentInstance.GetComponentsInChildren <MessageReciever>();
                    foreach (MessageReciever mr in receivers)
                    {
                        mr._parent = equipment;
                    }

                    equipment.OnAssembled(slot._equipSlot, equipmentInstance, slot._equipmentType);

                    Renderer [] equipmentRenderers = equipmentInstance.GetComponentsInChildren <Renderer>();
                    foreach (Renderer r in equipmentRenderers)
                    {
                        if (r.gameObject.tag != "weaponEffect")
                        {
                            renderers.Add(r);
                        }
                    }

                    if (!equipment._isLogicEquipment)
                    {
                        avatar.AddEquipmentNode(slot._equipSlot, equipmentInstance, false);
                    }

                    UpgradeEffect [] effects = equipmentInstance.GetComponentsInChildren <UpgradeEffect>();
                    foreach (UpgradeEffect e in effects)
                    {
                        e.SetGrade(equipment._evolutionLevel);
                    }
                }
            }
        }
        if (equipmentRes is FCArmor)
        {
            string[] avatarAreas = new string[equipmentRes._avatarAreas.Length];
            for (int i = 0; i < avatarAreas.Length; ++i)
            {
                avatarAreas[i] = FCEquipmentsBase.GetAvatarAreaNameByArea(equipmentRes._avatarAreas[i]);
            }
            string    baseTexPath = GetTexturePathOnQuailty(equipmentRes._texturePath, avatar._quality);
            Texture2D baseTex     = InJoy.AssetBundles.AssetBundles.Load(baseTexPath, typeof(Texture2D)) as Texture2D;
            Assertion.Check(baseTex != null);
            Texture2D normalTex   = null;
            Texture2D speTex      = null;
            FCArmor   armor       = equipmentRes as FCArmor;
            string    normTexPath = armor._normalTexturePath;
            if (normTexPath != "" && avatar._quality == CharacterGraphicsQuality.CharacterGraphicsQuality_Preview)
            {
                normalTex = InJoy.AssetBundles.AssetBundles.Load(normTexPath, typeof(Texture2D)) as Texture2D;
                Assertion.Check(normalTex != null);
            }
            avatar._materialBuilder.UpdateMaterialOfEquipment(avatar.materialInst, renderers.ToArray(), avatarAreas, baseTex, normalTex, armor._customColor, avatar._quality);
            // clean up.
            Resources.UnloadAsset(baseTex);
            Resources.UnloadAsset(normalTex);
            Resources.UnloadAsset(speTex);
        }
        // for weapon, only collect materials, do not take part in atlas.
        if (equipment is FCWeapon)
        {
            if (!equipment._isLogicEquipment)
            {
                avatar.materialInst.GetWeaponMaterial(renderers.ToArray());
            }
        }
        // perhaps there are extra game objects to display upgrade effect.
        foreach (FCEquipmentsBase.EquipmentSlot es in equipmentRes._upgradeSlots)
        {
            // create a game object for display upgrade effect only.
            GameObject prefab     = InJoy.AssetBundles.AssetBundles.Load(es._modelPath) as GameObject;
            Transform  transSlot  = avatar.GetSlotNode(es._equipSlot);
            GameObject effectInst = Utils.InstantiateGameObjectWithParent(prefab, transSlot).gameObject;
            // active level effect on this instance.
            UpgradeEffect [] effects = effectInst.GetComponentsInChildren <UpgradeEffect>();
            foreach (UpgradeEffect e in effects)
            {
                e.SetGrade(equipment._evolutionLevel);
            }
            avatar.AddEquipmentGradeEffect(es._equipSlot, effectInst);
        }
    }