我想获取一个二维的 Sprite 数组,并在运行时将其转换为一个单独的 sprite 图像。所有精灵都是正方形的并且大小完全相同,但生成的图像不一定必须是正方形的,因为数组的宽度和高度可以变化。
我还没有找到这个资源:Combine Array of Sprite objects into One Sprite - Unity
但我认为它不适合我的目的。
我想获取一个二维的 Sprite 数组,并在运行时将其转换为一个单独的 sprite 图像。所有精灵都是正方形的并且大小完全相同,但生成的图像不一定必须是正方形的,因为数组的宽度和高度可以变化。
我还没有找到这个资源:Combine Array of Sprite objects into One Sprite - Unity
但我认为它不适合我的目的。
如果您的项目中已经有了这些精灵,您可以简单地将它们的导入设置编辑为高级并检查读/写启用切换。
然后你应该能够读取你的精灵内容并像这样合并它们:
public Sprite CombineSpriteArray(Sprite[][] spritesArray)
{
// Set those two or get them from one the the sprites you want to combine
int spritesWidth = (int)spritesArray[0][0].rect.width;
int spritesHeight = (int)spritesArray[0][0].rect.height;
Texture2D combinedTexture = new Texture2D(spritesWidth * spritesArray.Length, spritesHeight * spritesArray[0].Length);
for(int x = 0; x < spritesArray.Length; x++)
{
for(int y = 0; y < spritesArray[0].Length; y++)
{
combinedTexture.SetPixels(x * spritesArray.Length, y * spritesArray[0].Length, spritesWidth, spritesHeight, spritesArray[x][y].texture.GetPixels((int)spritesArray[x][y].textureRect.x, (int)spritesArray[x][y].textureRect.y, (int)spritesArray[x][y].textureRect.width, (int)spritesArray[x][y].textureRect.height));
// For a working script, use:
// combinedTexture.SetPixels32(x * spritesWidth, y * spritesHeight, spritesWidth, spritesHeight, spritesArray[x][y].texture.GetPixels32());
}
}
combinedTexture.Apply();
return Sprite.Create(combinedTexture, new Rect(0.0f, 0.0f, combinedTexture.width, combinedTexture.height), new Vector2(0.5f, 0.5f), 100.0f);
}
警告:代码未经测试
请注意,这样的操作很繁重,并且在协程中异步执行它可能是避免冻结的好主意。
编辑:
由于您似乎是 Stack Overflow 的新手,请记住它不是提供脚本的服务,人们是来互相帮助的:这意味着提供的代码并不总是完美的,但可能只会引导您走上正确的道路(这也是为什么我在我的代码之后添加了“警告:未经测试的代码”)。
您声称代码“完全损坏”并且“到处出现错误”。我写了一小段脚本来测试脚本,我得到的唯一错误是那个(同意它多次弹出):
所以在谷歌上搜索后(你应该自己做的),我注意到有些GetPixels32() / SetPixels32()
方法也可以用来代替GetPixels() / SetPixels()
(这里是显示这种方法的第 3和第 5 个结果)。通过简单地改变这一点,代码现在可以完美运行。
我得到的唯一问题是精灵被打包在纹理的左下角:我在这方面做得不好,我犯了一个小错误。不难找到哪里:只要改
x * spritesArray.Length, y * spritesArray[0].Length, ...
到方法
x * spritesWidth, y * spritesHeight, ...
里面SetPixels
。
所以请找到我写的整个测试脚本并随意使用它:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
public Image m_DisplayImage;
public Sprite m_Sprite1, m_Sprite2;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(CombineSpritesCoroutine());
}
}
private IEnumerator CombineSpritesCoroutine()
{
Sprite[][] spritesToCombine = new Sprite[4][];
for (int i = 0; i < spritesToCombine.Length; i++)
{
spritesToCombine[i] = new Sprite[4];
}
for (int x = 0; x < spritesToCombine.Length; x++)
{
for (int y = 0; y < spritesToCombine[x].Length; y++)
{
spritesToCombine[x][y] = ((x + y) % 2 == 0 ? m_Sprite1 : m_Sprite2);
}
}
Sprite finalSprite = null;
yield return finalSprite = CombineSpriteArray(spritesToCombine);
m_DisplayImage.sprite = finalSprite;
}
public Sprite CombineSpriteArray(Sprite[][] spritesArray)
{
// Set those two or get them from one the the sprites you want to combine
int spritesWidth = (int)spritesArray[0][0].rect.width;
int spritesHeight = (int)spritesArray[0][0].rect.height;
Texture2D combinedTexture = new Texture2D(spritesWidth * spritesArray.Length, spritesHeight * spritesArray[0].Length);
for (int x = 0; x < spritesArray.Length; x++)
{
for (int y = 0; y < spritesArray[0].Length; y++)
{
combinedTexture.SetPixels32(x * spritesWidth, y * spritesHeight, spritesWidth, spritesHeight, spritesArray[x][y].texture.GetPixels32());
}
}
combinedTexture.Apply();
return Sprite.Create(combinedTexture, new Rect(0.0f, 0.0f, combinedTexture.width, combinedTexture.height), new Vector2(0.5f, 0.5f), 100.0f);
}
}