/// <summary> /// アトラス内のスプライト項目を描画します. /// </summary> public void Draw(Rect rect, AtlasMetaData meta) { var r = rect; tmpContent.text = meta.spriteMetaData.name; r.Set(rect.x + 5, rect.y + 3, rect.width - 120, rect.height - 3); GUI.Label(r, tmpContent); styleButton.normal.background = styleButton.hover.background = styleButton.active.background = styleButton.focused.background = GetTextureGUIStyle(meta.mode); r.Set(rect.x + rect.width - 100, rect.y + 3, 100, rect.height - 3); GUI.Label(r, GetGUIContent(meta.mode), styleButton); r.Set(rect.x + rect.width - 20, rect.y + 3, 24, 24); if (GUI.Button(r, meta.isDelete ? textureReflash : textureTrash, EditorStyles.label)) { meta.isDelete = !meta.isDelete; } r.Set(rect.x, rect.y + rect.height, rect.width, 1); GUI.Label(rect, GUIContent.none, "sv_iconselector_sep"); }
/// <summary> /// 選択オブジェクト変更コールバック. /// プロジェクトウィンドウでオブジェクトの選択を変更した時にコールされます. /// </summary> public void OnSelectionChanged() { //アトラスが選択されていたら、ターゲットアトラスを更新. var atlas = Selection.objects.OfType <Atlas>().FirstOrDefault(); if (atlas) { ChangeCurrentAtlas(atlas); } //作業中のアトラスメタデータから、スプライトの参照を破棄. foreach (var meta in metaDatas) { meta.selectedTexture = null; meta.selectedSprite = null; } //プロジェクトウィンドウで選択しているテクスチャをすべて取得(DeapAsset).アトラステクスチャは除外する. var selectedImages = Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets) .Select(x => x as Texture2D); //選択したテクスチャについて、すべてのアトラスメタデータを作成. foreach (var texture in selectedImages) { //選択したテクスチャのアトラスメタデータを取得、もしくは作成. string path = AssetDatabase.GetAssetPath(texture); AtlasMetaData atlasMetaData = GetOrAddMetaData(texture, false); //multipleSpriteの場合、すべてのスプライトをリストに追加. if (!atlasMetaData.isIgnore && (AssetImporter.GetAtPath(path) as TextureImporter).spriteImportMode == SpriteImportMode.Multiple) { //multipleSprite自身はリストから除外. metaDatas.Remove(atlasMetaData); //multipleSpriteに含まれる全てのスプライトを追加. foreach (var sprite in AssetDatabase.LoadAllAssetsAtPath(path).OfType <Sprite> ()) { GetOrAddMetaData(sprite, true); } } } //メタデータリストから、スプライトもテクスチャも指定されていない(=使用されない)メタデータを除外. metaDatas.RemoveAll(meta => meta.isUnused); //メタデータリストをスプライト名とモードで並び替え. metaDatas = metaDatas .OrderBy(x => x.mode == AtlasMetaData.Mode.Add || x.mode == AtlasMetaData.Mode.Ignore) .ThenBy(x => x.spriteMetaData.name) .ToList(); }
/// <summary> /// アトラスメタデータを取得、または生成します. /// すでに同じ名前のメタデータがある場合、そちらを取得します. /// </summary> /// <param name="image">アトラスメタデータに紐づくSprite、もしくはTexture.</param> /// <param name="spriteOverride">入力されたオブジェクトがSpriteの場合、overrideSpriteとしてマークします.</param> AtlasMetaData GetOrAddMetaData(UnityEngine.Object image, bool spriteOverride = false) { if (!image) { return(null); } //既に同じ名前のメタデータがある場合は取得.ない場合は新規作成. AtlasMetaData atlasMetaData = metaDatas.FirstOrDefault(meta => meta.spriteMetaData.name == image.name); if (atlasMetaData == null) { atlasMetaData = new AtlasMetaData(); atlasMetaData.spriteMetaData.name = image.name; metaDatas.Add(atlasMetaData); } //入力されたオブジェクトがTextureの場合. if (image is Texture2D) { atlasMetaData.selectedTexture = image as Texture2D; //atlasTextureと同じオブジェクトの場合は無視(isIgnore)する. atlasMetaData.isIgnore = (atlasMetaData.selectedTexture == targetAtlasTexture); } //入力されたオブジェクトがSpriteの場合. else if (image is Sprite) { var sprite = image as Sprite; if (spriteOverride) { atlasMetaData.selectedSprite = sprite; } else { atlasMetaData.spriteInAtlas = sprite; } atlasMetaData.isIgnore = false; atlasMetaData.spriteMetaData.border = sprite.border; atlasMetaData.spriteMetaData.pivot = sprite.pivot; } return(atlasMetaData); }
/// <summary> /// 作業アトラスを変更します. /// これは、AtlasMakerWindowに反映されます. /// </summary> /// <param name="atlas">アトラス.</param> /// <param name="forceChanged">アトラスに変更がある場合はtrue.</param> public void ChangeCurrentAtlas(Atlas atlas, bool forceChanged = true) { //作業中のアトラスメタデータから、スプライトの参照を破棄します. foreach (var meta in metaDatas) { if (forceChanged) { meta.spriteInAtlas = null; meta.isDelete = false; } meta.isIgnore = (meta.selectedTexture == targetAtlasTexture); } //アトラスを変更.アトラステクスチャがある場合は、アトラステクスチャを更新. m_TargetAtlas = atlas; if (targetAtlasTexture) { m_TargetAtlas.UpdateTexture(targetAtlasTexture); //アトラステクスチャ内のスプライトを全て取得. string assetPath = AssetDatabase.GetAssetPath(targetAtlasTexture); TextureImporter textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter; List <Sprite> sprites = AssetDatabase.LoadAllAssetsAtPath(assetPath).OfType <Sprite>().ToList(); //スプライトシートの内容を取得. foreach (var spriteSheet in textureImporter.spritesheet) { AtlasMetaData atlasMetaData = GetOrAddMetaData(sprites.Find(sprite => sprite.name == spriteSheet.name), false); if (forceChanged) { atlasMetaData.isDelete = false; } } } //メタデータリストから、スプライトもテクスチャも指定されていないメタデータを除外. metaDatas.RemoveAll(meta => meta.isUnused); }