public static void OpenWindow(FxAtlasAssembler assembler = null) { var win = GetWindow <FxAtlasEditorWindow>(); win.titleContent = new GUIContent("FxAtlas Editor"); win.Show(); if (assembler) { win.assembler = assembler; } }
static Texture2D GeneratePackedTexture(FxAtlasAssembler assembler) { var renderTexture = new RenderTexture(assembler.AtlasWidth, assembler.AtlasHeight, 0); renderTexture.Create(); var originalActive = RenderTexture.active; RenderTexture.active = renderTexture; GL.PushMatrix(); GL.LoadPixelMatrix(0, renderTexture.width, renderTexture.height, 0); GL.Clear(true, true, Color.clear); foreach (var sprite in assembler.Sprites) { if (sprite.Texture) { if (DrawTextureMaterial) { Graphics.DrawTexture(sprite.GetPixelRectFlipY(assembler.AtlasHeight), sprite.Texture, new Rect(0, 0, 1, 1), 0, 0, 0, 0, DrawTextureMaterial, 0); //drawColor Graphics.DrawTexture(sprite.GetPixelRectFlipY(assembler.AtlasHeight), sprite.Texture, new Rect(0, 0, 1, 1), 0, 0, 0, 0, DrawTextureMaterial, 1); //drawAlpha } else { Graphics.DrawTexture(sprite.GetPixelRectFlipY(assembler.AtlasHeight), sprite.Texture, new Rect(0, 0, 1, 1), 0, 0, 0, 0); } } } Texture2D tex2D = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.RGBA32, false); tex2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); tex2D.Apply(); GL.PopMatrix(); RenderTexture.active = originalActive; renderTexture.Release(); return(tex2D); }
void GetAssembler() { EditorGUILayout.PrefixLabel("FxAtlas Editor"); assembler = (FxAtlasAssembler)EditorGUILayout.ObjectField( assembler, typeof(FxAtlasAssembler), true); }
public static bool SaveAtlas(FxAtlasAssembler assembler) { if (!assembler) { return(false); } string atlasAssetPath; string atlasTexturePath; FxAtlas atlasAsset = assembler.AtlasAsset; Texture2D atlasTexture; //没有atlas的时候,新建一个 if (atlasAsset == null) { atlasAssetPath = EditorUtility.SaveFilePanel("Save", "Assets", "atlas.asset", "asset"); if (string.IsNullOrEmpty(atlasAssetPath)) { return(false); } else if (atlasAssetPath.EndsWith(".asset") == false) { Debug.LogError("must has .asset extension"); return(false); } atlasAssetPath = FileUtil.GetProjectRelativePath(atlasAssetPath); atlasAsset = ScriptableObject.CreateInstance <FxAtlas>(); AssetDatabase.CreateAsset(atlasAsset, atlasAssetPath); AssetDatabase.ImportAsset(atlasAssetPath, ImportAssetOptions.ForceUpdate); atlasAsset = AssetDatabase.LoadAssetAtPath <FxAtlas>(atlasAssetPath); } else { //得到当前atlas的路径 atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset); } atlasTexturePath = atlasAssetPath.Replace(".asset", ".png"); atlasTexture = GeneratePackedTexture(assembler); SavePackedTexture(atlasTexturePath, ref atlasTexture); Undo.RecordObjects(new Object[] { assembler, atlasAsset }, "Save Atlas"); EditorUtility.SetDirty(assembler); EditorUtility.SetDirty(atlasAsset); atlasAsset.AtlasTexture = atlasTexture; var sprites = new FxSprite[assembler.Sprites.Length]; for (int i = 0; i < assembler.Sprites.Length; i++) { sprites[i] = new FxSprite() { id = assembler.Sprites[i].ID, name = assembler.Sprites[i].IdentityName, scaleOffset = assembler.Sprites[i].GetUVRect(assembler.AtlasWidth, assembler.AtlasHeight) }; } atlasAsset.Sprites = sprites; assembler.AtlasAsset = atlasAsset; return(true); }