public override bool Build(Object obj) { abPrefix = ABTypeUtil.GetPreFix(ABType.Audio); if (obj.name.ContainChinese()) { Debug.LogError("资源名不能有中文字符," + obj.name); return(false); } string path = AssetDatabase.GetAssetPath(obj); AssetBundleBuild[] buildMap = new AssetBundleBuild[1]; buildMap[0].assetBundleName = abPrefix + obj.name.ToLower() + IOTools.abSuffix; buildMap[0].assetNames = new string[] { path }; BuildPipeline.BuildAssetBundles(BuildConfig.outputPath, buildMap, BuildConfig.options, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); return(true); }
public override bool Build(Object obj) { abPrefix = ABTypeUtil.GetPreFix(ABType.Sprite); return(base.Build(obj)); }
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); }