Пример #1
0
        private Dictionary <string, CocoDressItemHolder> GenerateItems(Dictionary <string, bool> materialPaths)
        {
            var itemHolders = new Dictionary <string, CocoDressItemHolder> ();

            foreach (var materialPath in materialPaths.Keys)
            {
                var materialId = Path.GetFileNameWithoutExtension(materialPath);
                // material
                var materialHolder = new CocoAssetMaterialHolder
                {
                    id = materialId, assetPath = GetRelativePath(materialPath)
                };

                var itemId = ExtractItemId(materialId);
                if (!itemHolders.ContainsKey(itemId))
                {
                    // create item
                    var itemHolder = GenerateItem(itemId);
                    itemHolders.Add(itemId, itemHolder);

                    // model (only add material holder now, other content will fill later)
                    var modelHolder = new CocoAssetModelHolder();
                    itemHolder.modelHolders.Add(modelHolder);
                    modelHolder.materialHolders.Add(materialHolder);
                }
                else
                {
                    // add multi material
                    itemHolders [itemId].modelHolders [0].materialHolders.Add(materialHolder);
                }
            }

            return(itemHolders);
        }
        private GameObject LoadModel(CocoAssetModelHolder modelHolder)
        {
            var go = CocoLoad.Instantiate(modelHolder.AssetEntity, transform);

            LoadModelMaterials(go, modelHolder);
            return(go);
        }
Пример #3
0
        private Dictionary <string, CocoDressItemHolder> CollectDressItemsInScene(string scenePath)
        {
            // collect asset files
            var rootPath      = Path.Combine(scenePath, "materials");
            var materialPaths = CollectFiles(rootPath, SearchOption.AllDirectories, "*.mat");

            rootPath = Path.Combine(scenePath, "models");
            var modelPaths = CollectFiles(rootPath, SearchOption.AllDirectories, "*.FBX", "*.prefab");

            rootPath = Path.Combine(scenePath, "icons");
            var spritePaths         = CollectFiles(rootPath, SearchOption.AllDirectories, "*.png");
            var spriteMaterialPaths = CollectFiles(rootPath, SearchOption.AllDirectories, "*.mat");

            // generate items base on materials
            var itemHolders = GenerateItems(materialPaths);

            // fill contents
            itemHolders.ForEach(itemHolder => {
                FillModelContentsInItem(itemHolder, modelPaths);
                if (spritePaths.Count > 0)
                {
                    FillSpriteContentsInItem(itemHolder, spritePaths, spriteMaterialPaths);
                }
            });

            // generate only model
            foreach (var kvpModelPath in modelPaths)
            {
                if (kvpModelPath.Value)
                {
                    // used
                    continue;
                }

                var modelPath = kvpModelPath.Key;
                var modelId   = Path.GetFileNameWithoutExtension(modelPath);
                if (string.IsNullOrEmpty(modelId))
                {
                    continue;
                }
                if (itemHolders.ContainsKey(modelId))
                {
                    continue;
                }

                var itemHolder = GenerateItem(modelId);
                itemHolders.Add(itemHolder.id, itemHolder);

                // model
                var modelHolder = new CocoAssetModelHolder {
                    id = modelId, assetPath = GetRelativePath(modelPath)
                };
                itemHolder.modelHolders.Add(modelHolder);
            }

            return(itemHolders);
        }
        private void LoadModelMaterials(GameObject go, CocoAssetModelHolder modelHolder)
        {
            var renderers = go.GetComponentsInChildren <Renderer> ();

            if (renderers.Length <= 0)
            {
                return;
            }

            var materialHolders = modelHolder.materialHolders;

            if (materialHolders.Count <= 0)
            {
                return;
            }

            var materials = new List <Material> (materialHolders.Count);

            materialHolders.ForEach(holder => {
                var material = holder.AssetEntity;
                if (material == null)
                {
                    return;
                }

                materials.Add(holder.AssetEntity);

                if (Application.isEditor)
                {
                    ResourceManager.FixShaderOnEditor(holder.AssetEntity);
                }
            });
            if (materials.Count <= 0)
            {
                return;
            }

            // update materials of renderers
            var availableMaterials  = materials.ToArray();
            var targetRendererNames = modelHolder.TargetSmrSet;

            renderers.ForEach(modelRenderer => {
                if (targetRendererNames.Count <= 0 || targetRendererNames.Contains(modelRenderer.name))
                {
                    //renderer.sharedMaterials = availableMaterials;
                    UpdateRendererMaterials(modelRenderer, availableMaterials);
                }
                else
                {
                    Destroy(modelRenderer.gameObject);
                }
            });
        }