文章目录

  • 应用场景
    • 代码

应用场景

  1. Sprite精灵不需要完全显示贴图,仅需要在屏幕显示区域大小的贴图生成的精灵。
  2. 动态加载一张贴图,同样也是仅需要显示Image或RawImage在屏幕区域大小的。(隐私问题,不再过多赘述)

代码

  1. 参数输入
    /// <param name="x">Image或RawImage组件RectTran.anchoredPosition.x</param>/// <param name="y">Image或RawImage组件RectTran.anchoredPosition.y</param>/// <param name="texture2D">裁剪目标贴图</param>Init(float x, float y, Texture2D targetTexture)
  1. 计算裁剪部分起始坐标和宽高
    (1) 首先需要计算出贴图超出屏幕区域的偏移量值
    (2) 贴图是以左下角为(0,0)作为起点,RecTransform.anchoredPosition的x和y属性,与偏移量的差,获得裁剪的起始坐标(注意:当RawImage对象,左下角完全在屏幕左下方以外的区域,起点位置既是坐标与偏移量绝对值的和;若左下角完全在屏幕范围内,则差值计算结果小于0,即当差值小于0时,x或y轴是完全在屏幕范围的,需要校准)
    (3)裁剪宽高最大值既是屏幕的宽高,当RawImage的左下角完全在屏幕范围内,获取的起始坐标既是RawImage左下角到屏幕左下角的距离,做差值计算出裁剪的宽高;若RawImage左下角在屏幕区域外时,起点坐标左边和下边的区域需要裁剪掉,通过贴图宽高与起始坐标作差,但是需要注意最大值是屏幕的宽高。总的来说,RawImage的x和y坐标,要么在屏幕范围内,要么在屏幕范围外面。
    /// <summary>/// 计算裁剪起点和宽高/// </summary>/// <param name="x"></param>/// <param name="y"></param>private void CalculateTextureRange(int x, int y){m_StartPosX = m_OffsetX - x;m_StartPosY = m_OffsetY - y;m_Width = m_ScreenWidth - Mathf.Abs(m_StartPosX);m_Height = m_ScreenHeight - Mathf.Abs(m_StartPosY);if (m_StartPosX <= 0){m_Width = m_ScreenWidth - Mathf.Abs(m_StartPosX);m_StartPosX = 0;}else{m_Width = m_TargetTexture.width - Mathf.Abs(m_StartPosX);m_Width = m_Width > m_ScreenWidth ? m_ScreenWidth : m_Width;}if (m_StartPosY <= 0){m_Height = m_ScreenHeight - Mathf.Abs(m_StartPosY);m_StartPosY = 0;}else{m_Height = m_TargetTexture.height - Mathf.Abs(m_StartPosY);m_Height = m_Height > m_ScreenHeight ? m_ScreenHeight : m_Height;}m_Width = m_Width > m_TargetTexture.width ? m_TargetTexture.width : m_Width;m_Height = m_Height > m_TargetTexture.height ? m_TargetTexture.height : m_Height;}
  1. 贴图裁剪
    计算出贴图裁剪的其实坐标和宽高后,需要对贴图进行裁剪操作
    (1)方法一:返回值是Sprite精灵(显示效果是裁剪后的贴图,其实Sprite.Texture的贴图并没有被裁剪)
private Texture2D GetTextureResizer(){if (m_Width <= 0 || m_Height <= 0)return null;Sprite sprite = Sprite.Create(m_TargetTexture, new Rect(new Vector2(m_StartPosX, m_StartPosY),new Vector2(m_Width, m_Height)), new Vector2(0.5f, 0.5f));}

(2)方法二:操作像素,返回值是Texture对象(逐像素优化:尽量不要使用for循环嵌套的方式获取像素点的Color对象,效率很低。相同大小贴图块,GetPixels用时40-50ms,逐像素650-700ms)

    private Texture2D GetTextureResizer(){if (m_Width <= 0 || m_Height <= 0)return null;Texture2D resultTexture = new Texture2D(m_Width, m_Height, TextureFormat.RGBA4444, true);m_Colors = m_TargetTexture.GetPixels(m_StartPosX, m_StartPosY, m_Width, m_Height);resultTexture.SetPixels(m_Colors);resultTexture.Apply();m_TargetTexture = null;return resultTexture;}

Unity动态裁剪Texture相关推荐

  1. unity 动态裁剪图片

    在加载图片又是需要去动态获取图片的一部分,或者要识别一张图片的二维码,但是二维码比较小一整张识别容易失败,就可以对图片进行分区识别 public void TailorTexture()     { ...

  2. unity动态修改标准材质自发光(Emission)

    目录 一.目的 1.想知道:unity动态修改标准材质自发光(Emission) 二.参考 1Unity利用材质自发光实现物体闪烁 三.操作:一:完成:变换材质自发光的数值 1.运行效果:材质变换了 ...

  3. Unity动态加载3D模型

    Unity动态加载3D模型 在Unity中创建游戏对象的方法有 3 种: 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中: 第二种是在 Unity 3D 菜单 G ...

  4. Unity 动态修改URP自带材质参数

    Unity 动态修改URP自带材质参数 前言 代码 Emission 参考连接 前言 修改此处默认参数 代码 Emission 启用自发光效果的代码是 material.EnableKeyword(& ...

  5. Unity 动态生成球体模型

    系列文章目录 Unity 动态生成球体模型 文章目录 系列文章目录 Unity 动态生成球体模型 前言 如何生成一个模型 球体模型的创建方法 计算正二十面体 正二十面体顶点 三角形连接顺序 前言 本篇 ...

  6. Unity动态字体在手机上出现字体丢失问题解决

    Unity动态字体在手机上出现字体丢失问题解决 参考文章: (1)Unity动态字体在手机上出现字体丢失问题解决 (2)https://www.cnblogs.com/bicker/p/3669176 ...

  7. Unity动态更换APP图标及名称

    Unity动态更换APP图标及名称 参考链接:https://blog.csdn.net/fu908323236/article/details/78813136 本文环境:(本文为安卓版) Unit ...

  8. nginx php image,PHP加Nginx实现动态裁剪图片方案

    许久以前写过一篇也是关于高性能PHP图片动态裁剪方案的文章,那文章使用的是nginx Cache和rewrite实现的,当然再加上CDN,那个方案存在一个问题就是图片并没有实际生成,而是以二进制的形式 ...

  9. 在3dmax里仿unity的Unlit/Texture shader并渲染

    在3dmax里实现unity的texture shader并渲染 3dsmax版本:2019 首先感谢这位大哥的 Unity与3DMax效果同步--3DMaxDX Shader:https://zhu ...

最新文章

  1. 关于C语言中的malloc和free函数的用法
  2. Science组合图表解读
  3. 你就是你自己paper最好的审稿人:宾大苏炜杰提出peer review新机制
  4. Google 全球员工围攻 Google!
  5. 跨平台开发Flutter初体验
  6. JS中Base64的编码与解码
  7. 第二章(jQuery选择器)
  8. rocketmq发送第一条消息(三)
  9. 解决 Ubuntu Software (Software Center) Crash 问题
  10. 计算机与人力资源管理论文,人力资源管理专业计算机能力培养模式论文
  11. TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
  12. 宝藏女孩程序媛,谈谈职场成长这些事
  13. 前端:【学成在线项目】HTML+CSS详细制作过程(代码只做参考)
  14. mapabc地图开发之定位篇(GPS+谷歌基站定位+高德基站定位)
  15. 41-fcntl设置文件锁
  16. NCRE-嵌入式系统开发工程师-计算机组成与接口知识整理
  17. 中级软件设计师简要知识点(5):网络与多媒体基础知识
  18. 你感受过VR视频故事线吗?适用于哪些方面?
  19. slice,splice,split区别和作用
  20. 上传文件时,文件名中文乱码

热门文章

  1. 携创教育:统招本科学位证书和自考学位证书一样吗?
  2. 记录一下OCR常用的数据集
  3. 改计算机高级设置吃鸡,玩端游吃鸡卡怎么办
  4. 北京短租2021年Airbnb数据分析(探索性数据分析+简单建模尝试)
  5. SuccBI,带你玩转各种复杂的中国式报表
  6. 入门DP | 2:租用游艇问题
  7. 电脑无法正常关机,只能强制关机问题
  8. Matlab进行多项式的因式分解
  9. 详解PHP反序列化漏洞
  10. WeCode在线少儿编程|创交会三大领域机器人各显神通