复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同

2024-03-30 16:08

本文主要是介绍复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同

之前没做过关于texture的东西。

在打包的资源中有一个预设所有的图是打包在一起的。很多Sprite组成的图形。

在游戏加载后,需要对一些图层做处理,这时候需要处理贴图,但是又不想动原始的图。
复制Sprite里的贴图遇到很多问题。

Sprite.rect 大小可能比 Sprite.textureRect大得多,有时又有textureRectOffset,开始new的图形只是textureRect,发现比原始图像小,圆心在中心位置,所以出现了错位。

又想改坐标,但是发现别的地方有问题,最好不要动位置。

还是复制一个一模一样大小的纹理好一些。

很多问题找了文档,也没看懂

关于Sprite.textureRect的
https://docs.unity3d.com/ScriptReference/Sprite-textureRect.html

Sprite.textureRect
Leave feedback
public Rect textureRect;
Description
Get the rectangle this sprite uses on its texture. Raises an exception if this sprite is tightly packed in an atlas.

关于textureRectOffset的
https://docs.unity3d.com/ScriptReference/Sprite-textureRectOffset.html

Sprite.textureRectOffset
Leave feedback
public Vector2 textureRectOffset;
Description
Gets the offset of the rectangle this sprite uses on its texture to the original sprite bounds. If sprite mesh type is FullRect, offset is zero.

关于SetPixels的
https://docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html

public void SetPixels(int x, int y, int blockWidth, int blockHeight, Color[] colors, int miplevel = 0);
Description
Set a block of pixel colors.

This function is an extended version of SetPixels above; it does not
modify the whole mip level but modifies only blockWidth by blockHeight
region starting at x,y. The colors array must be
blockWidth*blockHeight size, and the modified block must fit into the
used mip level.

这能看懂?反正我没看懂!! 也没搜到相关问题~~

自己研究丰衣足食吧~

贴上来做一个记录。

//复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同。static Color ConstClearColor = Color.clear;/// <summary>/// /// </summary>/// <param name="sp">sp是当前的Sprite</param>/// <returns></returns>public static Texture2D CopyTextureFrom(Sprite sp){//这里是rect的大小,可能比textureRect的大小更大一些.Texture2D texture = new Texture2D((int)sp.rect.width, (int)sp.rect.height);//这里是因为texture默认不是透明的,灰色的,这里给他一个透明填充。//有其他更加效率高的写法再替换掉.Color[] xxx = new Color[texture.width* texture.height];for (int i = 0; i < xxx.Length; i++){xxx[i] = ConstClearColor;}texture.SetPixels(xxx);//这里是获取到对应在Atlas里的纹理.Color[] pixelBuffer = sp.texture.GetPixels((int)sp.textureRect.x, (int)sp.textureRect.y, (int)sp.textureRect.width, (int)sp.textureRect.height);//这个blockWidth和Height的用法是自己猜的,没找到相关的帖子,官网文档写的也含糊不是很懂.//自己猜测就是在这个位置填充这个大小的纹理texture.SetPixels((int)sp.textureRectOffset.x, (int)sp.textureRectOffset.y, (int)sp.textureRect.width, (int)sp.textureRect.height, pixelBuffer, 0);texture.Apply();return texture;}

调用:

nowSpriteRenderer1 = nowTrans1.GetComponent<SpriteRenderer>();Sprite sp = nowSpriteRenderer1.sprite;// NowSpriteAtlas.GetSprite(nowTrans1.name);Texture2D txt = CDrawTexture.CopyTextureFrom(sp);sp = Sprite.Create(txt, new Rect(0,0,txt.width,txt.height), new Vector2(0.5f, 0.5f)); //nowSpriteRenderer1.sprite = sp;

有纰漏欢迎留言

这篇关于复制一个纹理为SpriteAtlas的Sprite的纹理,大小和原始相同的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861942

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

MySQL配置多主复制的实现步骤

《MySQL配置多主复制的实现步骤》多主复制是一种允许多个MySQL服务器同时接受写操作的复制方式,本文就来介绍一下MySQL配置多主复制的实现步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 环境准备2. 配置每台服务器2.1 修改每台服务器的配置文件3. 安装和配置插件4. 启动组复制4.

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意