void fillMatTexHolder(GameObject target) { MatTextureHolder matTexHolder = target.GetComponent <MatTextureHolder>(); if (matTexHolder.finishedSet) { //Debug.Log(target + " 已经设置了材质,不可重复设置"); return; } if (matTexHolder != null && matTexHolder.allTransformInfos != null && matTexHolder.allTransformInfos.Count > 0) { foreach (var item in matTexHolder.allTransformInfos) { Transform childTarget = item.target; var matInfos = item.matInfos; if (matInfos != null && matInfos.Count > 0) { foreach (var matInfo in matInfos) { switch (matInfo.matType) { case MatTextureHolder.MatInfo.MatType.Image: if (matInfo.textureInfos == null || matInfo.textureInfos.Count > 1) { Debug.LogError("Image 类型的texInfo有错!"); } if (matInfo.textureInfos.Count == 0) { } else { //////childTarget.GetComponent<Image>().sprite = LoadSprite(matInfo.texInfos[0].atlasName, matInfo.texInfos[0].texName); LoadSprite <Image>(matInfo.textureInfos[0].atlasName, matInfo.textureInfos[0].texName, childTarget.GetComponent <Image>()); } break; case MatTextureHolder.MatInfo.MatType.SpriteRenderer: if (matInfo.textureInfos == null || matInfo.textureInfos.Count > 1) { Debug.LogError("SpriteRenderer 类型的texInfo有错!"); } //////childTarget.GetComponent<SpriteRenderer>().sprite = LoadSprite(matInfo.texInfos[0].atlasName, matInfo.texInfos[0].texName); LoadSprite <SpriteRenderer>(matInfo.textureInfos[0].atlasName, matInfo.textureInfos[0].texName, childTarget.GetComponent <SpriteRenderer>() ); break; case MatTextureHolder.MatInfo.MatType.NormalRenderer: MatTextureHolder.TextureInfo texInfo = null; for (int k = 0; k < matInfo.textureInfos.Count; k++) { texInfo = matInfo.textureInfos[k]; if (texInfo.isSprite) { Debug.LogError("texInfo有错,项目中规定NormalRenderer不可使用Sprite,objPath:" + childTarget.Hierarchy()); } Texture tex = null; LoadTexture(texInfo.texName, childTarget, out tex); matInfo.mat.SetTexture(matInfo.textureInfos[k].shaderProperty, tex); } break; default: break; } #if UNITY_EDITOR //editor下,若使用android或者ios的bundle,需要使用本地的shader,否则红色 if (matInfo.mat != null) { var shader = Shader.Find(matInfo.shaderName); if (shader != null) { matInfo.mat.shader = shader; } else { Debug.LogError("can not find shader:" + matInfo.shaderName); } } #endif } } if (childTarget.gameObject.activeInHierarchy)//TODO:偶尔会出现有物体不渲染,暂时没有搞明白导致的原因,通过该方式hack { childTarget.gameObject.SetActive(false); childTarget.gameObject.SetActive(true); } } } //处理spriteSequence if (matTexHolder != null && matTexHolder.allSpriteSequenceInfos != null && matTexHolder.allSpriteSequenceInfos.Count > 0) { for (int j = 0; j < matTexHolder.allSpriteSequenceInfos.Count; j++) { var ssi = matTexHolder.allSpriteSequenceInfos[j]; var childTarget = ssi.target; if (ssi.texInfos != null && ssi.texInfos.Count > 0) { var ss = childTarget.GetComponent <SpriteSequence>(); for (int k = 0; k < ssi.texInfos.Count; k++) { var ti = ssi.texInfos[k]; LoadSpriteToSeq(ss, ti.atlasName, ti.texName, k); } } if (childTarget.gameObject.activeInHierarchy)//TODO:偶尔会出现有物体不渲染,暂时没有搞明白导致的原因,通过该方式hack { childTarget.gameObject.SetActive(false); childTarget.gameObject.SetActive(true); } } } matTexHolder.finishedSet = true; }
public List <AssetBundleBuild> GetMatTexMap(string originPath, GameObject tmpPrefab) { List <AssetBundleBuild> buildMap = new List <AssetBundleBuild>(); var holder = tmpPrefab.GetComponent <MatTextureHolder>(); var holders = tmpPrefab.GetComponents <MatTextureHolder>(); if (holder == null) { Debug.LogError(originPath + " error, not have MatTexHolder component"); } if (holders != null && holders.Length > 1) { Debug.LogError(originPath + " error, have more than 1 MatTexHolder"); } if (holder.finishedSet == true) { Debug.LogError("finishedSet should be false,please uncheck!"); } holder.allTransformInfos = new List <MatTextureHolder.TransformInfo>(); holder.allSpriteSequenceInfos = new List <SpriteSequenceInfo>(); //保存需要打包的图片 或图集名 var needBuildTextures = new Dictionary <string, BuildTextureValue>(); //所有的Render类型组件,包括MeshRender,TrailRender,ParticleSystem使用的Render //还有 SpriteRenderer,其中SpriteRenderer使用的图片类型为 精灵 格式 var rendererChilds = new List <Renderer>(); tmpPrefab.GetComponentsInChildren <Renderer>(true, rendererChilds); Debug.Log(tmpPrefab.name + "'s Renderer count:" + rendererChilds.Count); var imageChilds = new List <Image>();//UGUI Image组件,使用的图片类型为 精灵 格式 tmpPrefab.GetComponentsInChildren <Image>(true, imageChilds); Debug.Log(tmpPrefab.name + "'s Image count:" + imageChilds.Count); var textChilds = new List <Text>(); tmpPrefab.GetComponentsInChildren <Text>(true, textChilds); Debug.Log(tmpPrefab.name + "'s Text count:" + textChilds.Count); var spriteSequenceChilds = new List <SpriteSequence>();//UGUI ext组件。使用图片类型为 精灵 格式 tmpPrefab.GetComponentsInChildren <SpriteSequence>(true, spriteSequenceChilds); Debug.Log(tmpPrefab.name + "'s SpriteSequence count:" + spriteSequenceChilds.Count); //TODO:其它类型有图片依赖的 for (int i = 0; i < rendererChilds.Count; i++) { Renderer renderer = rendererChilds[i]; //////if (renderer.gameObject.GetComponent<SkeletonAnimation>() != null) //////{ ////// continue;//说明是Spine做的东西,不需要处理依赖 //////} bool isSprite = false; var matInfos = new List <MatTextureHolder.MatInfo>(); if (renderer is SpriteRenderer) { isSprite = true; SpriteRenderer sr = renderer as SpriteRenderer; if (sr.sprite == null) { continue; } string atlasName = sr.sprite.texture.name; string texName = sr.sprite.name; MatTextureHolder.TextureInfo texInfo = new MatTextureHolder.TextureInfo(isSprite, "", texName, atlasName); MatTextureHolder.MatInfo matInfo = new MatTextureHolder.MatInfo(sr.sharedMaterial, MatTextureHolder.MatInfo.MatType.SpriteRenderer, sr.sharedMaterial.shader.name, new List <MatTextureHolder.TextureInfo>() { texInfo } ); string texPath = AssetDatabase.GetAssetPath(sr.sprite.texture); needBuildTextures[sr.sprite.texture.name] = new BuildTextureValue(texPath, true); matInfos.Add(matInfo); MatTextureHolder.TransformInfo trsMatInfo = new MatTextureHolder.TransformInfo(renderer.transform, matInfos); holder.allTransformInfos.Add(trsMatInfo); } else { isSprite = false; var mats = renderer.sharedMaterials; if (mats != null && mats.Length > 0) { foreach (var mat in mats) { if (mat == null) { continue; } if (mat.name == "Font Material")//对于字体 { continue; } var texInfos = new List <MatTextureHolder.TextureInfo>(); for (int j = 0; j < ShaderUtil.GetPropertyCount(mat.shader); j++) { var t = ShaderUtil.GetPropertyType(mat.shader, j); if (t == ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = ShaderUtil.GetPropertyName(mat.shader, j); Texture tex = mat.GetTexture(propertyName); if (tex == null) { continue; } //检测使用的图片是否在工程内 string texPath = AssetDatabase.GetAssetPath(tex); if (!texPath.Contains("Assets")) { Debug.LogError("error, texPath:" + texPath + ", renderer:" + renderer.gameObject); continue; } //TODO:这里需要检测使用的图片是否是基本图片类型,不允许使用sprite类型 //TODO: string atlasName = ""; string texName = tex.name; needBuildTextures[tex.name] = new BuildTextureValue(texPath, false); MatTextureHolder.TextureInfo texInfo = new MatTextureHolder.TextureInfo(isSprite, propertyName, texName, atlasName); texInfos.Add(texInfo); } } MatTextureHolder.MatInfo matInfo = new MatTextureHolder.MatInfo(mat, MatTextureHolder.MatInfo.MatType.NormalRenderer, mat.shader.name, texInfos); matInfos.Add(matInfo); } MatTextureHolder.TransformInfo trsMatInfo = new MatTextureHolder.TransformInfo(renderer.transform, matInfos); holder.allTransformInfos.Add(trsMatInfo); } else { Debug.Log(renderer.name + " 没有材质球 [这里可能跟期望的不同,注意!!!]"); } } } for (int i = 0; i < imageChilds.Count; i++) { Image image = imageChilds[i]; bool isSprite = true; var matInfos = new List <MatTextureHolder.MatInfo>(); if (image.sprite == null && image.material == null) //sprite和material都为null,则跳过。 //只有sprite,没有material则是错误 //只有material,没有sprite,属于正常情况 { continue; } string atlasName = image.sprite == null ? "" : image.sprite.texture.name; string texName = image.sprite == null ? "" : image.sprite.name; MatTextureHolder.TextureInfo texInfo = new MatTextureHolder.TextureInfo(isSprite, "", texName, atlasName); MatTextureHolder.MatInfo matInfo = new MatTextureHolder.MatInfo(image.material, MatTextureHolder.MatInfo.MatType.Image, image.material.shader.name, image.sprite == null ? null : new List <MatTextureHolder.TextureInfo>() { texInfo } ); if (image.sprite != null) { string texPath = AssetDatabase.GetAssetPath(image.sprite.texture); needBuildTextures[image.sprite.texture.name] = new BuildTextureValue(texPath, true); } matInfos.Add(matInfo); MatTextureHolder.TransformInfo trsMatInfo = new MatTextureHolder.TransformInfo(image.transform, matInfos); holder.allTransformInfos.Add(trsMatInfo); } for (int i = 0; i < textChilds.Count; i++) { Text text = textChilds[i]; bool isSprite = false; var matInfos = new List <MatTextureHolder.MatInfo>(); string atlasName = ""; string texName = ""; MatTextureHolder.TextureInfo texInfo = new MatTextureHolder.TextureInfo(isSprite, "", texName, atlasName); MatTextureHolder.MatInfo matInfo = new MatTextureHolder.MatInfo(text.material, MatTextureHolder.MatInfo.MatType.Image, text.material.shader.name, null ); matInfos.Add(matInfo); MatTextureHolder.TransformInfo trsMatInfo = new MatTextureHolder.TransformInfo(text.transform, matInfos); holder.allTransformInfos.Add(trsMatInfo); } for (int i = 0; i < spriteSequenceChilds.Count; i++) { SpriteSequence seq = spriteSequenceChilds[i]; var sprites = seq.sprites; List <TextureInfo> texInfos = new List <TextureInfo>(); if (sprites != null && sprites.Length > 0) { for (int j = 0; j < sprites.Length; j++) { Sprite s = sprites[j]; bool isSprite = true; var matInfos = new List <MatTextureHolder.MatInfo>(); string atlasName = s.texture.name; string texName = s.name; MatTextureHolder.TextureInfo texInfo = new MatTextureHolder.TextureInfo(isSprite, "", texName, atlasName); texInfos.Add(texInfo); string texPath = AssetDatabase.GetAssetPath(s.texture); needBuildTextures[atlasName] = new BuildTextureValue(texPath, true); } } var spriteSequenceInfo = new SpriteSequenceInfo(seq.transform, texInfos); holder.allSpriteSequenceInfos.Add(spriteSequenceInfo); } //处理打包map Debug.Log(tmpPrefab.name + "'s Texture count:" + needBuildTextures.Keys.Count); foreach (var item in needBuildTextures) { AssetBundleBuild build = new AssetBundleBuild(); string preFix = ""; if (item.Value.isSprite) { preFix = ABTypeUtil.GetPreFix(ABType.Sprite); } else { preFix = ABTypeUtil.GetPreFix(ABType.Texture); } build.assetBundleName = preFix + item.Key.ToLower() + IOTools.abSuffix; build.assetNames = new string[] { item.Value.path }; buildMap.Add(build); } return(buildMap); }