当前位置: 首页 > news >正文

【Unity小工具】多张图片显示在一个Image组件上

Unity开发中经常会用到将多个图片显示在一个Image组件上
比如:关卡预览、头像选择等

实现原理:

  1. 创建一个新的Texture2D
  2. 将待合成的Texture2D分别置于新的Texture2D的不用位置
  3. 转换为Sprite进行展示

代码

  1. TextureKit

    • 负责对 Texture2D 的合成,可指定行数、列数
public static class TextureKit{public static Texture2D CombineTextures(Texture2D[] textures, int row, int column){int width = textures[0].width;int height = textures[0].height;// 创建一个新的纹理,宽度为3个纹理的宽度,高度为2个纹理的高度Texture2D combinedTexture = new Texture2D(width * column, height * row, TextureFormat.RGBA32, false);// 遍历每个纹理并设置它们的像素for (int i = 0; i < textures.Length; i++){int xOffset = (i % column) * width; // 每排纹理int yOffset = (1 - i / column) * height; // 上排从1-0, 下排从0-1// 如果是默认纹理(如黑色或白色纹理),则填充透明像素if (textures[i] == Texture2D.blackTexture || textures[i] == Texture2D.whiteTexture){Color[] clearPixels = new Color[width * height];for (int j = 0; j < clearPixels.Length; j++)clearPixels[j] = Color.clear;combinedTexture.SetPixels(xOffset, yOffset, width, height, clearPixels);}else{Color[] pixels = textures[i].GetPixels();combinedTexture.SetPixels(xOffset, yOffset, width, height, pixels);}}// 应用更改combinedTexture.Apply();return combinedTexture;}}
  1. ImageKit
    • Image组件扩展,将Texture2D转换为Sprite赋值为Image组件
public static class ImageKit{public static void CombineTextures(this Image image, Texture2D[] textures, int row, int column){var combineTextures = TextureKit.CombineTextures(textures, row, column);var sprite = Sprite.Create(combineTextures, new Rect(0, 0, combineTextures.width, combineTextures.height), new Vector2(0.5f, 0.5f));image.sprite = sprite;}}
  1. Test
    • 测试脚本
public class Test : MonoBehaviour
{public Image image;void Start(){var loadAll = Resources.LoadAll<Texture2D>("");List<Texture2D> list = new List<Texture2D>();for (int i = 0; i < 6; i++){list.Add(loadAll[i]);}image.CombineTextures(list.ToArray(),2,3);}
}

最终效果请添加图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容
  • python进阶篇-day03-学生管理系统与深浅拷贝
  • tomcat redis minio nginx windows开机自启
  • Python刷算法题必备技巧总结
  • Fluent 超音速射流噪声仿真分析
  • 697.数组的度
  • Marked: 一款高效、轻量级且全功能的Markdown解析器
  • 【C语言必学知识点六】自定义类型——结构体
  • 单品月GMV破4900W,2024防晒衣赛道在狂飙!
  • 以下是一些对公打款的测试方法
  • 【微信小程序】自定义 tabBar
  • 计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析
  • Python脚本参数总结:argparse库基础用法
  • docker容器使用aconda运行python程序
  • KVM是什么,如何给一台Linux系统使用KVM技术变成好几个不同配置的Linux系统?
  • AHK 中 = 和 == 等比较运算符的用法
  • Fundebug计费标准解释:事件数是如何定义的?
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Laravel Telescope:优雅的应用调试工具
  • node.js
  • node学习系列之简单文件上传
  • Python连接Oracle
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 第二十章:异步和文件I/O.(二十三)
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ### RabbitMQ五种工作模式:
  • #14vue3生成表单并跳转到外部地址的方式
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #宝哥教你#查看jquery绑定的事件函数
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C语言)共用体union的用法举例
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (超详细)语音信号处理之特征提取
  • (二)WCF的Binding模型
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (全注解开发)学习Spring-MVC的第三天
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (五)activiti-modeler 编辑器初步优化
  • (一)Linux+Windows下安装ffmpeg
  • (已解决)什么是vue导航守卫
  • (转)视频码率,帧率和分辨率的联系与区别