private ReferenceNode SearchSpriteAtlas( Object unityObject )
		{
			SpriteAtlas spriteAtlas = (SpriteAtlas) unityObject;
			ReferenceNode referenceNode = PopReferenceNode( spriteAtlas );

			SerializedObject spriteAtlasSO = new SerializedObject( spriteAtlas );
			if( spriteAtlas.isVariant )
			{
				Object masterAtlas = spriteAtlasSO.FindProperty( "m_MasterAtlas" ).objectReferenceValue;
				if( objectsToSearchSet.Contains( masterAtlas ) )
					referenceNode.AddLinkTo( SearchObject( masterAtlas ), "Master Atlas" );
			}

#if UNITY_2018_2_OR_NEWER
			Object[] packables = spriteAtlas.GetPackables();
			if( packables != null )
			{
				for( int i = 0; i < packables.Length; i++ )
					referenceNode.AddLinkTo( SearchObject( packables[i] ), "Packed Texture" );
			}
#else
			SerializedProperty packables = spriteAtlasSO.FindProperty( "m_EditorData.packables" );
			if( packables != null )
			{
				for( int i = 0, length = packables.arraySize; i < length; i++ )
					referenceNode.AddLinkTo( SearchObject( packables.GetArrayElementAtIndex( i ).objectReferenceValue ), "Packed Texture" );
			}
#endif

			return referenceNode;
		}
Пример #2
0
        /// <summary>
        /// 查找Atlas引用的所有的资源
        /// </summary>
        /// <param name="atlas"></param>
        /// <returns></returns>
        public static string[] GetDependAssets(SpriteAtlas atlas)
        {
            if (atlas == null)
            {
                return(null);
            }

            List <string> spriteAssetPathList = new List <string>();

            UnityObject[] objs = atlas.GetPackables();
            foreach (var obj in objs)
            {
                if (obj.GetType() == typeof(Sprite))
                {
                    spriteAssetPathList.Add(AssetDatabase.GetAssetPath(obj));
                }
                else if (obj.GetType() == typeof(DefaultAsset))//如果是文件夹
                {
                    string   folderPath = AssetDatabase.GetAssetPath(obj);
                    string[] assets     = AssetDatabaseUtil.FindAssetInFolder <Sprite>(folderPath);
                    spriteAssetPathList.AddRange(assets);
                }
            }
            return(spriteAssetPathList.Distinct().ToArray());
        }
Пример #3
0
        /// <summary>
        /// 由于UGUI中SpriteAtlas的特殊性,为了防止UI的Prefab打包无法与Atlas关联,
        /// 从而设定将SpriteAtlas所使用的Sprite一起打包
        /// </summary>
        /// <param name="atlasAssetPath">SpriteAtlas所在的资源路径</param>
        /// <param name="bundlePath">需要设置的BundleName</param>
        private static void SetSpriteBundleNameByAtlas(string atlasAssetPath, string bundlePath)
        {
            SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(atlasAssetPath);

            if (atlas != null)
            {
                List <string> spriteAssetPathList = new List <string>();
                UnityObject[] objs = atlas.GetPackables();
                foreach (var obj in objs)
                {
                    if (obj.GetType() == typeof(Sprite))
                    {
                        spriteAssetPathList.Add(AssetDatabase.GetAssetPath(obj));
                    }
                    else if (obj.GetType() == typeof(DefaultAsset))
                    {
                        string   folderPath = AssetDatabase.GetAssetPath(obj);
                        string[] assets     = AssetDatabaseUtil.FindAssetInFolder <Sprite>(folderPath);
                        spriteAssetPathList.AddRange(assets);
                    }
                }
                spriteAssetPathList.Distinct();
                foreach (var path in spriteAssetPathList)
                {
                    AssetImporter ai = AssetImporter.GetAtPath(path);
                    ai.assetBundleName = bundlePath;
                }
            }
        }
Пример #4
0
    static void ResetAtlas(SpriteAtlas atlas, Object[] objects)
    {
        var oldSprites = atlas.GetPackables();

        atlas.Remove(oldSprites);

        atlas.Add(objects);
    }
Пример #5
0
        public static Dictionary <string, string> CollectionAssetPathToBundleNames()
        {
            Dictionary <string, string> pathToNames = new Dictionary <string, string>();

            pathToNames[AssetAddressConfig.CONFIG_PATH] = AssetAddressConfig.CONFIG_ASSET_BUNDLE_NAME.ToLower();

            #region Collection
            AssetBundleTagConfig tagConfig = Util.FileUtil.ReadFromBinary <AssetBundleTagConfig>(BundlePackUtil.GetTagConfigPath());
            AssetAddressData[]   datas     = (from groupData in tagConfig.GroupDatas
                                              from detailData in groupData.AssetDatas
                                              select detailData).ToArray();

            long elapsedMS = Leyoutech.Utility.DebugUtility.GetMillisecondsSinceStartup();
            for (int iData = 0; iData < datas.Length; iData++)
            {
                AssetAddressData iterData   = datas[iData];
                string           assetPath  = iterData.AssetPath;
                string           bundleName = iterData.BundlePath.ToLower();
                pathToNames[assetPath] = bundleName;

                if (Path.GetExtension(assetPath).ToLower() != ".spriteatlas")
                {
                    continue;
                }

                SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(assetPath);
                if (atlas == null)
                {
                    continue;
                }

                UnityObject[] packables = atlas.GetPackables();
                for (int iPackable = 0; iPackable < packables.Length; iPackable++)
                {
                    UnityObject iterPackable = packables[iPackable];
                    if (iterPackable.GetType() == typeof(Sprite))
                    {
                        pathToNames[AssetDatabase.GetAssetPath(iterPackable)] = bundleName;
                    }
                    else if (iterPackable.GetType() == typeof(DefaultAsset))
                    {
                        string   folderPath = AssetDatabase.GetAssetPath(iterPackable);
                        string[] assets     = AssetDatabaseUtil.FindAssetInFolder <Sprite>(folderPath);
                        for (int iAsset = 0; iAsset < assets.Length; iAsset++)
                        {
                            pathToNames[assets[iAsset]] = bundleName;
                        }
                    }
                }
            }
            elapsedMS = Leyoutech.Utility.DebugUtility.GetMillisecondsSinceStartup() - elapsedMS;
            Leyoutech.Utility.DebugUtility.Log(Leyoutech.BuildPipeline.BuildPipelineGraph.LOG_TAG, $"Collection all bundleName count ({pathToNames.Count}) elapsed {Leyoutech.Utility.DebugUtility.FormatMilliseconds(elapsedMS)}");
            #endregion
            return(pathToNames);
        }
Пример #6
0
        public static void Clear(this SpriteAtlas atlas)
        {
            var packedObjects = atlas.GetPackables();
            var removedCount  = 0;

            for (var i = 0; i < packedObjects.Length; i++)
            {
                atlas.RemoveAt(i - removedCount);
                removedCount++;
            }
        }
        public static bool DeleteEmptyAtlas(SpriteAtlas atlas)
        {
            var packables = atlas.GetPackables();

            if (packables.Length != 0 || AtlasGeneratorSettings.Asset.deleteEmptyAtlas == false)
            {
                return(false);
            }

            var path = AssetDatabase.GetAssetPath(atlas);

            AtlasGeneratorSettings.Asset.generatedAtlases.RemoveAll(atlasPath => atlasPath == path);
            EditorUtility.SetDirty(AtlasGeneratorSettings.Asset);
            AssetDatabase.DeleteAsset(path);
            return(true);
        }
Пример #8
0
        private void TrySetupSpriteAtlas()
        {
            if (_atlas == null)
            {
                return;
            }

            Object[] atPath  = AssetDatabase.LoadAllAssetsAtPath(assetPath);
            Sprite[] sprites = atPath.Where(p => p is Sprite).Cast <Sprite>().ToArray();

            //remove existing
            _atlas.Remove(_atlas.GetPackables());

            //add sorted sprites
            Object[] inputSprites = sprites.Distinct().OrderBy(p => p.name).Cast <Object>().ToArray();
            _atlas.Add(inputSprites);
        }
Пример #9
0
        private void TryCloneSpriteAtlas()
        {
            SpriteAtlas atlas = _importer.Atlas;

            if (!atlas)
            {
                return;
            }

            //clone the sprite atlas asset
            SpriteAtlas newAtlas = CloneArtifact(atlas, "/Sprites");

            //clear, then re-fill the atlas with used sprites
            newAtlas.Remove(newAtlas.GetPackables());

            //add art tiles
            Object[] objects = _artTileSprites.OrderBy(p => p.name).Cast <Object>().ToArray();
            newAtlas.Add(objects);

            //pack
            SpriteAtlasUtility.PackAtlases(new [] { newAtlas }, EditorUserBuildSettings.activeBuildTarget);
        }
Пример #10
0
        void GetSpriteAssetitem(string atlasAssetPath, ref List <string> spriteAssetPathList)
        {
            SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(atlasAssetPath);

            if (atlas != null)
            {
                UnityObject[] objs = atlas.GetPackables();
                foreach (var obj in objs)
                {
                    if (obj.GetType() == typeof(Sprite))
                    {
                        spriteAssetPathList.Add(AssetDatabase.GetAssetPath(obj));
                    }
                    else if (obj.GetType() == typeof(DefaultAsset))
                    {
                        string   folderPath = AssetDatabase.GetAssetPath(obj);
                        string[] assets     = AssetDatabaseUtil.FindAssetInFolder <Sprite>(folderPath);
                        spriteAssetPathList.AddRange(assets);
                    }
                }
                spriteAssetPathList.Distinct();
            }
        }
Пример #11
0
        static public bool SetBundleName(string directory, string name, string variant, string[] ignores, bool separateFile, bool separateSubFolder, out string err)
        {
            err = string.Empty;

            string[] files         = Directory.GetFiles(directory);
            string[] subFolders    = Directory.GetDirectories(directory);
            bool     hasSubFolders = subFolders.Length > 0 && separateSubFolder;

            // handle files
            for (int i = 0; i < files.Length; i++)
            {
                string ext = Path.GetExtension(files[i]);
                if (".meta".Equals(ext) || ".cs".Equals(ext) || ".js".Equals(ext) || ".DS_Store".Equals(ext))
                {
                    continue;
                }

                string fileName = Path.GetFileName(files[i]);

                if (fileName.StartsWith(".", System.StringComparison.Ordinal))
                {
                    continue;
                }

                if (CheckIgnored(fileName, ignores))
                {
                    continue;
                }

                AssetImporter importer = AssetImporter.GetAtPath(files[i]);

                if (importer == null)
                {
                    Debug.LogError(files[i]);
                    err = files[i];
                    return(false);
                }

                string assetBundleName = string.Empty;
                if (separateFile || hasSubFolders)
                {
                    assetBundleName = name + "/" + Path.GetFileNameWithoutExtension(files[i]);
                }
                else
                {
                    assetBundleName = name;
                }

                assetBundleName = assetBundleName.ToLower();
                variant         = variant.ToLower();

                if (!importer.assetBundleName.Equals(assetBundleName))
                {
                    importer.assetBundleName = assetBundleName;
                }
                if (!importer.assetBundleVariant.Equals(variant))
                {
                    importer.assetBundleVariant = variant;
                }

#if UNITY_PS4
                if (assetBundleName.Split('/').Length >= 7)
                {
                    Debug.LogErrorFormat("{0}: folder depth exceeds the limit", assetBundleName);
                }
#endif

                if (!Application.isBatchMode && EditorUtility.DisplayCancelableProgressBar("Set: " + assetBundleName, files[i], 1f * i / files.Length))
                {
                    err = "User Canceled";
                    return(false);
                }

                // handle spriteatlas ref folder
                if (".spriteatlas".Equals(ext))
                {
                    SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(files[i]);
                    Object[]    objs  = atlas.GetPackables();
                    foreach (Object obj in objs)
                    {
                        string objPath = AssetDatabase.GetAssetPath(obj);
                        if (Directory.Exists(objPath))
                        {
                            AssetImporter imp = AssetImporter.GetAtPath(objPath);
                            if (!imp.assetBundleName.Equals(assetBundleName))
                            {
                                imp.assetBundleName = assetBundleName;
                            }
                            if (!imp.assetBundleVariant.Equals(variant))
                            {
                                imp.assetBundleVariant = variant;
                            }

                            if (!SetBundleName(objPath, assetBundleName, variant, ignores, false, false, out err))
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            AssetImporter imp = AssetImporter.GetAtPath(objPath);
                            if (imp != null)
                            {
                                if (!imp.assetBundleName.Equals(assetBundleName))
                                {
                                    imp.assetBundleName = assetBundleName;
                                }
                                if (!imp.assetBundleVariant.Equals(variant))
                                {
                                    imp.assetBundleVariant = variant;
                                }
                            }
                        }
                    }
                }
            }

            // handle sub folders
            for (int i = 0; i < subFolders.Length; i++)
            {
                if (subFolders[i].Contains(".DS_Store"))
                {
                    continue;
                }

                if (CheckIgnored(subFolders[i], ignores))
                {
                    continue;
                }

                if (separateSubFolder)
                {
                    if (!SetBundleName(subFolders[i], name + subFolders[i].Replace(directory, "").ToLower(), variant, ignores, separateFile, separateSubFolder, out err))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!SetBundleName(subFolders[i], name, variant, ignores, separateFile, separateSubFolder, out err))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        private static void PackedAuto()
        {
            string uipath = Application.dataPath + "/UI/";
            SpriteAtlasPackingSettings setting = new SpriteAtlasPackingSettings();

            setting.enableRotation     = false;
            setting.enableTightPacking = false;

            //SpriteAtlasTextureSettings texSetting = new SpriteAtlasTextureSettings();
            TextureImporterPlatformSettings texPlatSetting = new TextureImporterPlatformSettings();

            texPlatSetting.maxTextureSize      = 2048;
            texPlatSetting.crunchedCompression = true;
            texPlatSetting.compressionQuality  = 100;
            string[] dirs = Directory.GetDirectories(uipath);

            foreach (string dir in dirs)
            {
                string   folderName = dir.Replace(uipath, "");
                string   sourcePath = dir.Replace(Application.dataPath, "Assets");
                string[] guids      = AssetDatabase.FindAssets("t:Sprite", new string[] { sourcePath });
                if (guids.Length > 0)
                {
                    List <Sprite> listSpite = new List <Sprite>();
                    foreach (string guid in guids)
                    {
                        Sprite s = AssetDatabase.LoadAssetAtPath <Sprite>(AssetDatabase.GUIDToAssetPath(guid)) as Sprite;
                        listSpite.Add(s);
                    }

                    string      dest  = string.Format("Assets/UIAtlas/{0}.spriteatlas", folderName.ToLower());
                    SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(dest);
                    if (atlas)
                    {
                        SpriteAtlasExtensions.Remove(atlas, atlas.GetPackables());
                    }
                    else
                    {
                        atlas = new SpriteAtlas();
                        atlas.SetPackingSettings(setting);
                        atlas.SetPlatformSettings(texPlatSetting);
                        AssetDatabase.CreateAsset(atlas, dest);
                    }
                    SpriteAtlasExtensions.Add(atlas, listSpite.ToArray());
                    EditorUtility.SetDirty(atlas);
                }
            }
            EditorUtility.DisplayDialog("提示", "创建图集成功", "确认");
            //ICON ATLAS 重icon collection來
            //找 iconid to sprite collection

            /*string[] iconcollectons = AssetDatabase.FindAssets("t:IconIdToSpriteCollection", new string[]{ "Assets/MainAssets/IconCollection/Auto"});
             * foreach (var collectionGuid in iconcollectons)
             * {
             *  IconIdToSpriteCollection iconCollection = AssetDatabase.LoadAssetAtPath<IconIdToSpriteCollection>(AssetDatabase.GUIDToAssetPath(collectionGuid));
             *
             *  if (iconcollectons != null)
             *  {
             *      string dest = string.Format("Assets/MainAssets/ArtAssets/BundleAssets/IconCollectionAtlas/atlas_iconcollection_{0}.spriteatlas", iconCollection.name.ToLower());
             *      SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(dest);
             *      if (atlas)
             *      {
             *          SpriteAtlasExtensions.Remove(atlas, atlas.GetPackables());
             *      }
             *      else
             *      {
             *          atlas = new SpriteAtlas();
             *          atlas.SetPackingSettings(setting);
             *          AssetDatabase.CreateAsset(atlas, dest);
             *      }
             *
             *      Object[] t = iconCollection.GetAllSprites().ToArray();
             *      SpriteAtlasExtensions.Add(atlas, t);
             *
             *
             *      EditorUtility.SetDirty(atlas);
             *  }
             * }*/

            AssetDatabase.SaveAssets();
        }
Пример #13
0
    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        for (int i = 0; i < importedAssets.Length; i++)
        {
            string assetPath = importedAssets[i].Replace("\\", "/");
            if (!assetPath.StartsWith("Assets/Localization/") && !assetPath.StartsWith("Assets/Res/"))
            {
                continue;
            }
            if (!AssetDatabase.IsValidFolder(assetPath))
            {
                continue;                                          //非文件夹文件
            }
            DirectoryInfo dirAssetInfo = new DirectoryInfo(assetPath);
            for (int j = 0; j < _atlasRuleDir.Length; j++)
            {
                AtlasInfo atlasInfo_Rule = _atlasRuleDir[j];
                if (!assetPath.Equals(atlasInfo_Rule.dir) && !assetPath.StartsWith(atlasInfo_Rule.dir + "/"))
                {
                    continue;
                }
                //命中目标文件夹
                if (dirAssetInfo.Parent.FullName.Equals(atlasInfo_Rule.fullName))
                {
                    FileInfo[] atlasFiles  = dirAssetInfo.GetFiles("*.spriteatlas", SearchOption.AllDirectories);
                    FileInfo   targetAtlas = null; //文件夹下直属Atlas
                    for (int k = 0; k < atlasFiles.Length; k++)
                    {
                        FileInfo file = atlasFiles[k];
                        if (targetAtlas == null)
                        {
                            if (file.Directory.FullName.Equals(dirAssetInfo.FullName))
                            {
                                targetAtlas = file;
                            }
                        }
                        else
                        {
                            file.Delete(); //删除其他的Atlas
                        }
                    }

                    string targetName = atlasInfo_Rule.prefix_name + "_" + dirAssetInfo.Name + "_Atlas.spriteatlas";
                    if (targetAtlas == null) //没有找到直属Atlas
                    {
                        AssetDatabase.CreateAsset(new SpriteAtlas(), assetPath + "/" + targetName);
                        targetAtlas = new FileInfo(dirAssetInfo.FullName + "/" + targetName);
                    }
                    else
                    {
                        AssetDatabase.RenameAsset(assetPath + "/" + targetAtlas.Name, targetName); //改名
                        targetAtlas = new FileInfo(dirAssetInfo.FullName + "/" + targetName);
                    }
                    //对Atlas进行设置
                    SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(assetPath + "/" + targetAtlas.Name);
                    SpriteAtlasPackingSettings packingSettings = atlas.GetPackingSettings();
                    packingSettings.enableRotation     = atlasInfo_Rule.isRotation;
                    packingSettings.enableTightPacking = atlasInfo_Rule.isTight;
                    packingSettings.padding            = 2;
                    atlas.SetPackingSettings(packingSettings);

                    TextureImporterPlatformSettings platformSettings = atlas.GetPlatformSettings("iPhone");
                    platformSettings.overridden = true;
                    if (platformSettings.maxTextureSize > 2048)
                    {
                        platformSettings.maxTextureSize = 2048;
                    }
                    platformSettings.format = TextureImporterFormat.ASTC_RGBA_6x6;
                    atlas.SetPlatformSettings(platformSettings);

                    atlas.Remove(atlas.GetPackables());
                    atlas.Add(new [] { AssetDatabase.LoadAssetAtPath <Object>(assetPath) });
                }
                break;
            }
        }
    }