美文网首页Unity项目优化
Unity UI图片的一种优化方式

Unity UI图片的一种优化方式

作者: 塘朗山小钻风 | 来源:发表于2020-10-15 19:50 被阅读0次

项目中使用的不少UI图片是轴对称的,包括:

1)横轴对称或纵轴对称

2)同时满足横轴对称和纵轴对称

图1:竖轴对称图片

可以使用镜像效果来节省图片资源。第一种情况可以省下完整资源的一半,第二种情况则可以省略3/4。普通的方法则是一个Image GameObject下面挂载1个或3个Image。这些Image的scale的x或y分量值设置为-1, 就产生一个镜像了,然后开发者小心翼翼把他们对齐。这个过程太繁琐,而且产生了冗余的GameObject。

更好的办法是使用纹理采样的Wrap Mode来实现。先设置图片Wrap Mode:

图2:Wrap Mode的设置

然后上代码:

public class MirrorImage : Image

{

    [SerializeField]

    public Vector2Int m_MirrorAttr = Vector2Int.one;

    protected override void OnPopulateMesh(VertexHelper toFill)

    {

        if (type == Type.Simple)

        {

            GenerateSimpleSprite(toFill, preserveAspect);

            return;

        }

        base.OnPopulateMesh(toFill);

    }

    void GenerateSimpleSprite(VertexHelper vh, bool lPreserveAspect)

    {

        var activeSprite = overrideSprite;

        Vector4 v = GetDrawingDimensions(lPreserveAspect);

        var uv = (activeSprite != null) ? UnityEngine.Sprites.DataUtility.GetOuterUV(activeSprite) : Vector4.zero;

        uv.z *= m_MirrorAttr.x;

        uv.w *= m_MirrorAttr.y;

        var color32 = color;

        vh.Clear();

        vh.AddVert(new Vector3(v.x, v.y), color32, new Vector2(uv.x, uv.y));

        vh.AddVert(new Vector3(v.x, v.w), color32, new Vector2(uv.x, uv.w));

        vh.AddVert(new Vector3(v.z, v.w), color32, new Vector2(uv.z, uv.w));

        vh.AddVert(new Vector3(v.z, v.y), color32, new Vector2(uv.z, uv.y));

        vh.AddTriangle(0, 1, 2);

        vh.AddTriangle(2, 3, 0);

    }

    private Vector4 GetDrawingDimensions(bool shouldPreserveAspect)

    {

        var activeSprite = overrideSprite;

        var padding = activeSprite == null ? Vector4.zero : UnityEngine.Sprites.DataUtility.GetPadding(activeSprite);

        var size = activeSprite == null ? Vector2.zero : new Vector2(activeSprite.rect.width, activeSprite.rect.height);

        Rect r = GetPixelAdjustedRect();

        // Debug.Log(string.Format("r:{2}, size:{0}, padding:{1}", size, padding, r));

        int spriteW = Mathf.RoundToInt(size.x);

        int spriteH = Mathf.RoundToInt(size.y);

        var v = new Vector4(

                padding.x / spriteW,

                padding.y / spriteH,

                (spriteW - padding.z) / spriteW,

                (spriteH - padding.w) / spriteH);

        if (shouldPreserveAspect && size.sqrMagnitude > 0.0f)

        {

            var spriteRatio = size.x / size.y;

            var rectRatio = r.width / r.height;

            if (spriteRatio > rectRatio)

            {

                var oldHeight = r.height;

                r.height = r.width * (1.0f / spriteRatio);

                r.y += (oldHeight - r.height) * rectTransform.pivot.y;

            }

            else

            {

                var oldWidth = r.width;

                r.width = r.height * spriteRatio;

                r.x += (oldWidth - r.width) * rectTransform.pivot.x;

            }

        }

        v = new Vector4(

                r.x + r.width * v.x,

                r.y + r.height * v.y,

                r.x + r.width * v.z,

                r.y + r.height * v.w

                );

        return v;

    }

}

[CustomEditor(typeof(MirrorImage), true)]

[CanEditMultipleObjects]

public class MirrorImageEditor : ImageEditor

{

    public override void OnInspectorGUI()

    {

        base.OnInspectorGUI();

        var property = serializedObject.FindProperty("m_MirrorAttr");

        EditorGUILayout.PropertyField(property);

        serializedObject.ApplyModifiedProperties();

    }

}

效果如下图:

图3:最终效果

PS:如果需要的是重复模式,比如绳子的每两节完全一样的效果。Wrap Mode选择Repeat就可以。

相关文章

  • Unity UI图片的一种优化方式

    项目中使用的不少UI图片是轴对称的,包括: 1)横轴对称或纵轴对称2)同时满足横轴对称和纵轴对称 可以使用镜像效果...

  • 【Unity】优化UI(一)

    Unity UI 优化引导 优化Unity UI是一门艺术。又快又见效的方法很罕见,每一种情况都必须仔细思考系统的...

  • Unity官方博文翻译——UI优化系列

    本文是转发大佬关于UGUI优化系列的翻译文章。 Unity官方博文翻译——UI优化01Unity官方博文翻译——U...

  • 图片压缩哪家强?

    图片压缩是图片优化效益较高的一种方式,对于拥有大量图片资源的网站来说优化效果是非常明显的,图片优化也是前端性能优化...

  • [Unity] UGUI拓展 - 实现Image的镜像

    参考:Unity3D UGUI优化:制作镜像图片(1) 1、序   这两天美术在整理UI资源,主要目的是降低内存,...

  • Jtro的技术分享:UGUI的极限优化

    关于unity中的UGUI优化,总有说不完的话题,优化方式有很多种,我今天要说的这种,算是一种简单的优化,实在开发...

  • Unity UI 优化指南 (0.介绍)

    Unity UI中的优化操作可能称为一门艺术。固定的规则很少,而是需要根据不同的情况进行仔细分析。优化UI性能的关...

  • Android App优化

    本篇文章来简单介绍一下App优化的方式。 1、UI优化 UI优化主要是提高UI的绘制效率,包括减少UI层次,提高初...

  • UGUI优化指南

    本文恶搞自A guide to optimizing Unity UI. 优化UGUI很费劲,因为没有强而有效规则...

  • 导入图片资源到Unity时,自动修改为UI 2D Sprite

    导入图片资源到Unity时,自动修改为UI 2D Sprite

网友评论

    本文标题:Unity UI图片的一种优化方式

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