public override void OnInspectorGUI() { if (!atlas) { atlas = (UIAtlas)target; } if (list == null) { list = serializedObject.FindProperty("objectsForPacking"); } serializedObject.Update(); EditorGUILayout.HelpBox("You Can Select Folder or Texture Here To Packger Atlas.\n Remember to Select Save Path and Click Packer Button.", MessageType.Info); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Save Path:"); GUILayout.Label(atlas.savePath); if (GUILayout.Button("...", GUILayout.Width(30))) { string path = EditorUtility.OpenFolderPanel("Select Folder To Save Atlas", atlas.savePath, ""); if (!string.IsNullOrEmpty(path)) { string[] ps = path.Split(new[] { "Assets/" }, StringSplitOptions.None); if (ps.Length == 2) { atlas.savePath = "Assets/" + ps[1]; } else { EditorUtility.DisplayDialog("Note", "You Can Select Assets Folder Only!", "Ok, I will."); } } } GUILayout.EndHorizontal(); atlas.atlasSize = (UIAtlas.AtlasSize)EditorGUILayout.EnumPopup("Atlas Size:", atlas.atlasSize); EditorGUILayout.PropertyField(list, true); GUILayout.Space(10); if (atlas.objectsForPacking.Count > 0) { if (GUILayout.Button(" Packer ", GUILayout.ExpandWidth(false))) { List <Texture2D> textures = ScanForTextures(atlas.objectsForPacking); Texture2D texture = new Texture2D((int)atlas.atlasSize, (int)atlas.atlasSize); Rect[] rs = texture.PackTextures(textures.ToArray(), 1); byte[] bs = texture.EncodeToPNG(); string selfPath = AssetDatabase.GetAssetPath(target); string atlasName = selfPath.Replace(Path.GetExtension(selfPath), ".png"); //atlas.savePath + "/" + target.name + ".png"; File.WriteAllBytes(atlasName, bs); List <SpriteMetaData> sheet = new List <SpriteMetaData>(); for (int i = 0; i < rs.Length; i++) { var rect = rs[i]; rect.x *= texture.width; rect.y *= texture.height; rect.width *= texture.width; rect.height *= texture.height; SpriteMetaData meta = new SpriteMetaData(); meta.rect = rect; meta.name = textures[i].name; meta.border = Vector4.zero; meta.pivot = Vector2.zero; sheet.Add(meta); } AssetDatabase.Refresh(); TextureImporter texImp = AssetImporter.GetAtPath(atlasName) as TextureImporter; texImp.spritesheet = sheet.ToArray(); texImp.textureType = TextureImporterType.Sprite; texImp.spriteImportMode = SpriteImportMode.Multiple; AssetDatabase.ImportAsset(atlasName, ImportAssetOptions.ForceUpdate); GameObject obj = new GameObject(target.name); SpriteAtlas spriteAtlas = obj.AddComponent <SpriteAtlas>(); object[] sps = AssetDatabase.LoadAllAssetsAtPath(atlasName); foreach (var sp in sps) { if (sp is Sprite) { Sprite sprite = (Sprite)sp; spriteAtlas.AddToList(sprite); } } string prefabPath = atlas.savePath + "/" + target.name + ".prefab"; PrefabUtility.CreatePrefab(prefabPath, obj); AssetDatabase.Refresh(); DestroyImmediate(obj); var genetare = AssetDatabase.LoadAssetAtPath <Texture2D>(atlasName); atlas.preview = genetare; atlas.genreteSize = new Vector2(genetare.width, genetare.height); var prefab = AssetDatabase.LoadAssetAtPath <GameObject>(prefabPath); atlas.spriteAtlas = prefab.GetComponent <SpriteAtlas>(); } } GUILayout.Space(30); GUILayout.Label("Preview Parms"); GUI.enabled = false; //if (atlas.spriteAtlas) EditorGUILayout.ObjectField("Sprite Atlas:", atlas.spriteAtlas, typeof(SpriteAtlas), false); //if(atlas.preview) EditorGUILayout.Vector2Field("Generated Size:", atlas.genreteSize); EditorGUILayout.ObjectField("Preview Atlas:", atlas.preview, typeof(Texture2D), false); GUI.enabled = true; GUILayout.EndVertical(); if (GUI.changed) { EditorUtility.SetDirty(target); } serializedObject.ApplyModifiedProperties(); }