Unity Sprite Atlas与Sprite Mask

作者: 罗卡恩 | 来源:发表于2019-07-10 19:30 被阅读42次

    Sprite Atlas

    发现unity新版有图集,其实挺好用的
    参考
    https://mp.weixin.qq.com/s/yo3XiKpi6lJNH16MsJ-KUw
    https://www.jianshu.com/p/bdd223184738
    创建图集

    image.png
    这里面可以直接放文件夹,老图集,图
    先看Variant 模式
    image.png
    然后拖一个新图集,相当于把传入的老图集粘贴一遍,调整Scale可以降低分辨率,为高低分辨率做不同的适配,mode改为Point模式
    image.png

    如果缩放以后不是2次幂就会有提示,不管就会性能倒贴


    image.png

    压缩了好多倍


    image.png
    image.png
    这个是Editor调用代码 选一个文件或者一堆图生成
    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor;
    using UnityEditor.U2D;
    using UnityEngine;
    using UnityEngine.U2D;
    
    public class AtlasTools
    {
        const string atlasPath = "Assets/atlas.spriteatlas";
    
        [MenuItem("Tools/ChangeAtlasSetting", false, 1)]
        static void ChangeAtlasSetting()
        {
            //这个是Always Enabled 设置完SpriteAtlas才有Pack Preview 去看图集
            // ->  Enable For Builds:在打包时将规划好的小图打成图集
            //->  AlwaysEnabled:一直激活状态,总是将规划好的小图打成图集
            EditorSettings.spritePackerMode = SpritePackerMode.AlwaysOn;
        }
        [MenuItem("Tools/SetSpriteAtlas", true, 0)]
        static bool CreateAtlasJudgement()
        {
            if (Selection.objects.Length <= 0)
                return false;
            else
                return true;
        }
    
        [MenuItem("Tools/SetSpriteAtlas", false, 0)]
        static void CreateAtlas()
        {
            SpriteAtlas spriteAtlas = new SpriteAtlas();
            //选中以在构建中包含Atlas Asset。请注意,取消选中此选项会导致在播放模式期间不呈现任何打包的资产。
            //会导致打包冗余  取消后需要在代码中监听SpriteAtlasManager.atlasRequested事件来在程序中加载贴图集。
            //不然会导致AB包首个加载图片为空白 ResourceLoad没问题
            spriteAtlas.SetIncludeInBuild(false);
            SpriteAtlasPackingSettings packSetting = new SpriteAtlasPackingSettings()
            {
                //包偏移
                blockOffset = 1,
                //打包时是否支持包旋转
                enableRotation = false,
                //是否紧密打包
                enableTightPacking = false,
                //边界填充值
                padding = 2
            };
            spriteAtlas.SetPackingSettings(packSetting);
    
            SpriteAtlasTextureSettings textureSettings = new SpriteAtlasTextureSettings()
            {
                //是否开启读写
                readable = false,
                //Point分离过滤模式 点过滤 - 纹理像素变得块状近距离。
                //Bilinear双线性过滤 - 纹理样本的平均值。
                //Trilinear三线性过滤 - 对纹理样本进行平均,并在mipmap级别之间进行混合。
                filterMode = FilterMode.Bilinear,
                //是否启用mipmap
                generateMipMaps = false,
                //纹理存储在伽马空间中。
                sRGB = true
            };
    
            spriteAtlas.SetTextureSettings(textureSettings);
    
    
            TextureImporterPlatformSettings textureImporterPlatformSettings = new TextureImporterPlatformSettings()
            {
                //设置类型名字
                name = "Android",
                //是否重写
                overridden = true,
                //在不支持ETC2的手机上回退
                androidETC2FallbackOverride = AndroidETC2FallbackOverride.Quality16Bit,
                maxTextureSize = 1024,
                //压缩格式 用之前人家测试最好的手游压缩格式
                format = TextureImporterFormat.ASTC_RGBA_4x4,
                //纹理不会被压缩。未压缩的= 0,
                //摘要纹理将根据平台// (DXT, ASTC,…)使用标准格式进行压缩。Compressed= 1,
                //摘要纹理将根据平台和可用性(BC7, ASTC4x4,…)使用高质量的格式进行压缩。CompressedHQ = 2,
                //摘要根据平台和可用性(2bpp PVRTC, ASTC8x8,…),纹理将使用低质量但高性能、高压缩/格式进行压缩。CompressedLQ = 3
                textureCompression = TextureImporterCompression.CompressedHQ,
                //可使用时压缩
                crunchedCompression = true,
                //压缩纹理质量[0-100]
                compressionQuality = 50,
            };
            spriteAtlas.SetPlatformSettings(textureImporterPlatformSettings);
            spriteAtlas.Add(Selection.objects);
    
            AssetDatabase.CreateAsset(spriteAtlas, atlasPath);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }
    

    AB包加载和这个差不多

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.U2D;
    using UnityEngine.UI;
    
    public class Test : MonoBehaviour
    {
    
        public Image image;
        private void OnEnable()
        {
            SpriteAtlasManager.atlasRequested += Request;
        }
    
        private void OnDestroy()
        {
            SpriteAtlasManager.atlasRequested -= Request;
        }
    
        private void Request(string tag, Action<SpriteAtlas> action)
        {
            SpriteAtlas sa = Resources.Load<SpriteAtlas>("atlas");
            image.sprite = sa.GetSprite("Mybackgr");
            action(sa);
        }
    }
    
    Sprite[] sprites = new Sprite[10];
    
    uiSpriteAtlas.GetSprites(sprites, "head");
    

    这样还能取多个名字一样的

    https://www.cnblogs.com/TheChenLin/p/9763710.html
    这个问题留着以后出了看

    image.png
    还有这个也是

    Sprite Mask

    这个就是图片遮罩
    只能用在用不了在Image上
    Inside是显示在图片里 Outside是显示在图片外


    image.png

    然后创建一个spriteMask父节点 出了范围就会被隐藏掉
    Alpha Cutoff会影响Mash形状


    image.png
    粒子特效也可以设置
    image.png
    这里可以设置遮罩可以作用的范围
    image.png

    把一个order in layer改为5 就是不在范围内


    image.png
    然后另外一个就不显示了
    image.png
    把这个设置为灰度梯度后
    image.png
    image.png
    拖动这个会有奇妙的效果
    image.png

    相关文章

      网友评论

        本文标题:Unity Sprite Atlas与Sprite Mask

        本文链接:https://www.haomeiwen.com/subject/pbpfkctx.html