目标

有时在UI显示的时候,需要将原图片左右或者上下镜像显示。一种简单的方法就是将对应轴的scale参数设置为-1,但这种设置方式会导致子物体的scale也发生变化。为了避免对子物体的显示造成影响,这里利用改变图片顶点数据的方式来实现图片的镜像显示,最终效果如下。

实现

这里主要利用了UnityEngine.UI中的IMeshModifier接口,这个接口用于对UI中已构建好的顶点进行修改。只要编写一个实现了这个接口的组件,将其挂载在与Image同一个的GameObject下,我们就能随意修改顶点数据来达到想要的效果。
实现脚本如下

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;[RequireComponent(typeof(Graphic))]public class ImageMirror : MonoBehaviour, IMeshModifier{public enum Axis{Horizontal,Vertical,Center,}[SerializeField]private Axis m_axis;[SerializeField]private bool m_on;public Axis axis{get{return m_axis;}set{m_axis = value;Graphic graphic = GetComponent<Graphic>();if (graphic != null){graphic.SetVerticesDirty();}}}void Awake(){Graphic graphic = GetComponent<Graphic>();if (graphic == null){DestroyImmediate(this);return;}}public void SetEnable(bool enable){if (m_on != enable){Graphic graphic = GetComponent<Graphic>();if (graphic != null){graphic.SetVerticesDirty();}m_on = enable;}}public void ModifyMesh(Mesh mesh){throw new System.NotImplementedException();}public void ModifyMesh(VertexHelper verts){if (!m_on) return;RectTransform rectTransform = GetComponent<RectTransform>();Vector2 center = rectTransform.rect.center;int vertCount = verts.currentVertCount;for (int i = 0; i < vertCount; ++i){UIVertex vertex = new UIVertex();verts.PopulateUIVertex(ref vertex, i);Vector3 position = vertex.position;switch (m_axis){case Axis.Horizontal:position.x = 2 * center.x - position.x;break;case Axis.Vertical:position.y = 2 * center.y - position.y;break;case Axis.Center:position.x = 2 * center.x - position.x;position.y = 2 * center.y - position.y;break;}vertex.position = position;verts.SetUIVertex(vertex, i);}}}#if UNITY_EDITOR[UnityEditor.CustomEditor(typeof(ImageMirror))]public class ImageMirrorEditor : UnityEditor.Editor{private ImageMirror instance;private void Awake(){instance = target as ImageMirror;}public override void OnInspectorGUI(){UnityEditor.EditorGUI.BeginChangeCheck();base.OnInspectorGUI();if (UnityEditor.EditorGUI.EndChangeCheck()){Graphic graphic = instance.GetComponent<Graphic>();graphic.SetVerticesDirty();}}}
#endif

注意

这种方式改变顶点位置,可能会改变面的方向。一般来说,UI里都是双面渲染的,但如果的对面片的朝向有要求,就需要再修改一下三角形的索引顺序才行。

Unity中镜像图片显示相关推荐

  1. word文档中插入图片显示不全解决办法

    在windows下写word文档,正常情况下,我们应该不会遇到插入图片显示不全的问题,好像是如果在已有的文档中插入图片,比如文档中间插入,图片没办法自动扩展空间,这就导致了显示不全的问题. 这个问题也 ...

  2. 浅谈Unity中的文字显示

    以UGUI系统为例,字体分为内置字体.外部导入字体.自定义字体. 文字一般通过Text组件进行显示.目前Unity已经官方支持TextMeshPro,因此也有一些文字通过TextMeshPro-Tex ...

  3. unity中多屏显示

    多屏显示分两种情况: 第一种情况:unity中可以为单独的摄像机设置显示屏,例如camera1的图像显示在屏幕1,camera2的图像显示在屏幕2等等.这方面内容可以根据unity官方文档中的mult ...

  4. 在word中粘贴图片显示出现问题

    问题:在word中粘贴从其他文档复制的照片,图片显示不全,并且被文字覆盖了. 解决办法:选中图片,清除格式,显示就正常了.然后重新设置图片的格式.

  5. Vue怎么将后台(springboot)中的图片显示到前端表格中

    1.首先,你后台的项目列表中有可以访问的图片,如下(我将图片保存到数据库并同步保存到项目文件夹的static中) 2.输入http:localhost:后台的端口+图片的名称 有的同学可能看不懂上面的 ...

  6. word2013中插入图片显示不全

    有时候,在word里面插入图片后,发现显示不全,对图片右击选择"设置对象格式"---"版式"---"环绕方式"各种尝试也没法解决,如下图所示 ...

  7. unity中UGUI图片箭头指向鼠标位置

    初学unity,公司项目中遇到的一个简单小功能,重新回顾了初高中的额数学知识,希望对同样初学者有用,demo就不上传了,工程中只用到一个图片(image),代码拖进去就能用了. 效果如图 using ...

  8. Unity中的图片压缩格式选择

    图片格式 不同格式的本质区别在于压缩算法不一样,结果图片大小,还原度也各不相同. 常用图片格式有Png,Jpg,Tga,Psd等.平时主要用Png,Jpg. Jpg是有损压缩不透明,Png是无损压缩有 ...

  9. Word中的图片显示出不来的解决办法

    "OFFICE"按钮-->"Word选项"-->"高级"-->"显示文档内容"-->" ...

最新文章

  1. NGUI 学习笔记实战——制作商城UI界面
  2. 2022年了我才发现Chrome原来可以直接生成二维码...
  3. Codevs 2296 仪仗队 2008年省队选拔赛山东
  4. linux select 进程id,Linux基础命令---显示进程ps
  5. Sharepoint 2013默认dll部署位置
  6. Mesos:数据库使用的持久化卷
  7. 三个关键词,看懂AI未来趋势丨不仅仅是高薪
  8. C++--第26课 - 异常处理 - 下
  9. C调用Lua与解决Lua环境问题
  10. 浏览器支持H.265解码总结
  11. 导图解文 从梦想到财富(05)世界第八大奇迹,知者赚不知者被赚
  12. mysql临时表删除_MySQL如何创建和删除临时表
  13. [ACM]【Dijkstra/DP】Atcoder 164 Two Currencies
  14. Elasticsearch 分布式搜索引擎 -- 自动补全(拼音分词器、自定义分词器、自动补全查询、实现搜索框自动补全)
  15. win10离线安装 .NetFramework3.5
  16. java switch的意思_switch与java
  17. 2021年高级维修电工证考试题库,职业技能鉴定职业资格
  18. 黑马程序员——C语言学习——概述
  19. html设置旋转中心兼容ie,IE中的CSS旋转属性
  20. 打开excel,提示 flash play2 错误,解决办法

热门文章

  1. 无线网络设置的dns服务器,DNS怎么设置才能上网
  2. android的边框设置
  3. vm镜像 黑群晖_VMWare虚拟机安装黑群晖 (DSM6.2.1)
  4. Google Earth Engine(GEE)——Landsat7条带去除两种方案
  5. Typora都开始收费了,不会有人还没用过吧
  6. win10家庭版调出组策略_正版Win10免费送!这绝对是全网最低价的正版Win10系统
  7. C语言习题:猜数字游戏(C语言随机数)
  8. python 计算月还款额度
  9. 笔记本无线热点共享批处理bat_马立杰_新浪博客
  10. 手把手教大家搭建微信公众号查题功能