- Home /
"Could not create sprite" exception - copying and manipulating texture from SpriteAtlas
I have a bunch of 8bit car sprites, with black outlines and white paint. I am using the method called CopyTexture2D() from post #8 in this thread to change the color of the car to a random RGB value, generating a bunch of traffic.
That solution works brilliantly when I have a folder full of individual sprites. However, when pulling a sprite from a SpriteAtlas (and also when loading sprites directly from a multiple sprite sheet into Sprite[]) it errors. The following code:
Sprite.Create(carTexture, carSprite.rect, new Vector2(0f, 1f));
returns the following error:
ArgumentException: Could not create sprite (0.000000, 200.000000, 101.000000, 50.000000) from a 101x50 texture.
0, 200 is the position of the selected sprite within the sprite atlas. I can avoid the error by changing it to -
Sprite.Create(carTexture, new Rect(0f, 0f, 101f, 50f), new Vector2(0f, 1f));
but that pulls the sprite from position 0, 0 in the sprite atlas, rather than the sprite I originally loaded.
The full code (related to this problem, anyway) is-
public Transform GenerateCar(Vector2 position, Quaternion rotation)
{
string spriteName = "8bit-Car-Full-Sprite-Sheet_" + carNo.ToString();
carNo++;
if (carNo > 49)
{
carNo = 0;
}
Sprite carSprite = sa.GetSprite(spriteName);
Transform car = Instantiate(prefab, position, rotation);
// here is the call (CopyTexture2D() from the referenced post, here renamed to PaintCar())
Texture2D carTexture = PaintCar(carSprite.texture);
// here is the error
Sprite sprite = Sprite.Create(carTexture, carSprite.rect, new Vector2(0f, 1f));
car.GetComponent<SpriteRenderer>().sprite = sprite;
return car;
}
-and-
private Texture2D PaintCar(Texture2D copy)
{
// pick a random RGB color
byte colorR = (byte)UnityEngine.Random.Range(0, 255);
byte colorG = (byte)UnityEngine.Random.Range(0, 255);
byte colorB = (byte)UnityEngine.Random.Range(0, 255);
Texture2D texture = new Texture2D(101, 50, TextureFormat.ARGB32, false);
texture.filterMode = FilterMode.Point;
texture.wrapMode = TextureWrapMode.Clamp;
// loop through each row of pixels
int y = 0;
while (y < texture.height)
{
// loop through each pixel in the row
int x = 0;
while (x < texture.width)
{
if (copy.GetPixel(x, y) == Color.white )
{
texture.SetPixel(x, y, new Color32(colorR, colorG, colorB, 255));
}
else
{
texture.SetPixel(x, y, copy.GetPixel(x, y));
}
x++;
}
y++;
}
texture.Apply();
return texture;
}
Hopefully, that's enough info to help get to the bottom of this. Let me know if I am missing something you need. Thanks in advance!
Answer by medinaline · Dec 15, 2019 at 08:01 PM
After giving up and importing individual sprites, I found that I had to delete the now unused SpriteAtlas in the Sprites folder. The SpriteAtlas was still being used behind the scenes when referencing the sprite I had manually loaded with Resources.Load("Sprites/Car01"). The Texture2D was later being swapped with the sprite in that position in the SpriteAtlas.
Lessen learned, I guess.
Your answer
Follow this Question
Related Questions
2D sprite renders a small part of another one with "Sprite Mode : Multiple" 0 Answers
Image is crushed --- Sprite 2 Answers
Override sprite geometry of sprite generated at runtime 1 Answer
Turning GIFs to spritesheets IN UNITY 1 Answer
TexturePacker 0 Answers