Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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);
        }