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); }
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); } }); }