Пример #1
0
        /// <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");
        }
Пример #2
0
        /// <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();
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }