项目中使用的不少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图片_Unity UI图片的一种优化方式相关推荐

  1. 打开桌面计算机图片,电脑桌面截图呢?三种截图方式

    在日常工作的时候,经常会需要截图工具来截取一些图片用于保存,特别是有的时候,图片需要特定尺寸的时候,截图方法是最便捷的,但是很多人对电脑截图并不是很熟悉,电脑桌面截图呢?今天就给大家讲解一下三种截图方 ...

  2. Android中将方形图片截取成圆形的两种实现方式

    以下两种方法均有不足,仅供参考 第一种实现方式是通过设置画笔的渲染方式对图片进行处理: 首先要了解几种渲染方式 1.BitmapShader(图像渲染) BitmapShader的作用是使用一张位图作 ...

  3. unity代码更换ui图片_Unity3d 低分辨率UI素材换高分辨率素材填坑笔记

    迷糊 RectTransform PosX.PosY.Left .Right . Top .Bottom 以及 AchorMax/AnchorMin 的,开卷有益哟~ 背景 笔者开发的(PC)APP ...

  4. unity代码更换ui图片_关于Unity UI的动静图集分离,你需要了解这些!

    这是第101篇UWA技术知识分享的推送!(此处应有掌声)随着大家在UWA平台上的发言愈加活跃,我们也源源不断地收到了许多技术大咖的热心回复和真知灼见. UWA 问答社区:answer.uwa4d.co ...

  5. JS实现图片懒加载的几种简单方式,图片懒加载

    记得以前手机端有个业务时将用户上传的的图片在用户往上滑动手机的时候呈现,由于刚开始用户数量少就没留意,直接将后台的数据拉过来渲染,当时后台也没有分页,可是后来参与用户多了起来,跳转到这个页面就渲染个几 ...

  6. 移动端UI自动化Appium测试——Appium server两种启动方式

    执行自动化测试之前,需要先运行appium server,这样才能形成server与java client的通信,启动server有两种方式,一种是命令,一种是按钮图标,具体使用如下: 1.用命令启动 ...

  7. 如何做代码抽象设计,多种设计模式的应用【四种抽象方式,干货附上代码】

    代码这种东西,机器不管你写的怎么样,肯定能识别, 人就不一样了,前人拉屎后人踩屎,一坨认栽,n坨就有点过分了哈 一般写代码也不用太高大上,很多接口还是很简单的,如果把各种设计模式搞上来那叫过度设计,叫 ...

  8. 代码更换ui图片_不同人眼中的UI设计师都是什么样的?

    在日常生活中,当有人问你是做什么工作的,你谦虚的回答:我是一名UI设计师,平时使用软件绘图,画界面等.此时就会有人不屑一顾的说:UI设计不就是平面美工吗,还要扯啥设计师? ​而这样的称呼也被许多人所认 ...

  9. Android 天气APP(十三)仿微信弹窗(右上角加号点击弹窗效果)、自定义背景图片、UI优化调整

    上一篇:Android 天气APP(十二)空气质量.UI优化调整 天气预报详情,逐小时预报详情 新版------------------- 一.适配器点击监听 二.页面实现 三.天气预报详情弹窗 四. ...

最新文章

  1. 哪个工具编译java_用什么工具来编译JAVA啊?
  2. python实现mysql事务_python连接mysql并提交mysql事务示例
  3. C# AppDomain
  4. 信息系统项目管理知识--项目范围管理
  5. iOS常见问题(5)
  6. Java DB中的Java用户定义类型(UDT)
  7. 我们变成了最小的,当我们发现不了最弱小的时候
  8. 面试官 | 这位连单点登录都不知道,让他回家等通知去吧
  9. 「管理数学基础」3.4 凸分析:最优性的充要条件、无约束极小化问题、一般非线性规划问题
  10. matlab2c使用c++实现matlab函数系列教程-intersect函数
  11. 锂电池充电原理:充电电压电流的选择方法
  12. c语言机器人跑三角形图形,一种三角形物件运输机器人的制作方法
  13. 通信(一) 串口通信
  14. 竟有比双十一更令人发指的福利……
  15. 秋天,小溪潺潺,古老的树上黄叶灿灿,阳光像一个魔法师,在树叶间流动,远山,云天,充满秋阳的光线。以此景观做一首诗...
  16. 软件测试丨工具在接口测试中发挥什么样的作用?
  17. Matlab逆向归纳法,6.完全信息动态博弈—逆向归纳法和子博弈完美均衡.ppt
  18. 网友推荐;用起来特别爽的四款良心软件,每一款都是黑科技
  19. python做数据可视化视频_B站上的数据可视化视频是怎么做的,用到了什么技术和工具?...
  20. metis 论文串行图划分笔记

热门文章

  1. for else 使用方法
  2. 怎么判定自己的账号有没有被限流?短视频运营推广学习日记
  3. 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码
  4. node.js websocket connect的使用
  5. Linux命令中timedatectl、weget的使用以及如何创建目录
  6. PHP aws-sdk-php文件存储的实现与应用
  7. lejos+ev3+win7环境搭建
  8. 免费ftp服务器FileZilla Server配置
  9. ERROR: AddressSanitizer: odr-violation ord 错误
  10. Java环境百度地图Api的使用