- Home /
SetPixels/Apply: Texture2D resets on restart
I have a basic test script, that draws a sprite on top of a base sprite and then the output is saved onto a third sprite. The sprite gets drawn perfectly and it keeps the changes even after the scene stops playing, but when I restart Unity, the sprite resets! How can I make the changes permanent? Tried changing it with an editor script and tried just doing it live. No matter what changes reset after restart.
Here's the script:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
public class SpriteCombiner : MonoBehaviour
{
public Sprite sword1, sword2;
public Sprite baseSprite;
public Sprite overwriteSprite;
Rect myRect;
public void Start()
{
myRect = overwriteSprite.rect;
}
void Update ()
{
// Clear
if (Input.GetKeyDown(KeyCode.C))
{
ClearSprite();
}
// Draw sword 1 on sprite
if (Input.GetKeyDown(KeyCode.Q))
{
DrawSprite(sword1);
}
// Draw sword 2 on sprite
if (Input.GetKeyDown(KeyCode.W))
{
DrawSprite(sword2);
}
}
public void ClearSprite()
{
Stopwatch sw = new Stopwatch();
sw.Start();
overwriteSprite.texture.SetPixels(new Color[(int)myRect.width * (int)myRect.height]);
overwriteSprite.texture.SetPixels(baseSprite.texture.GetPixels());
overwriteSprite.texture.Apply();
sw.Stop();
print("Clear took: " + sw.ElapsedMilliseconds + " ms");
}
public void DrawSprite(Sprite spriteToDraw)
{
ClearSprite();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int x = 0; x < myRect.width; x++)
{
for (int y = 0; y < myRect.height; y++)
{
Color curPixel = spriteToDraw.texture.GetPixel(x, y);
if (curPixel.a > 0)
{
overwriteSprite.texture.SetPixel(x, y, curPixel);
}
}
}
overwriteSprite.texture.Apply();
sw.Stop();
print("Draw took: " + sw.ElapsedMilliseconds + " ms");
}
}
And here's the editor script
using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;
[CustomEditor(typeof(SpriteCombiner))]
public class SpriteCombinerEditorTest : Editor
{
SpriteCombiner spriteCombiner;
public override void OnInspectorGUI()
{
DrawDefaultInspector();
spriteCombiner = (SpriteCombiner)target;
GUILayout.Space(10);
EditorGUILayout.LabelField("Editor Stuff", EditorStyles.boldLabel);
if (GUILayout.Button("Clear Sprite"))
{
spriteCombiner.Start();
spriteCombiner.ClearSprite();
}
if (GUILayout.Button("Draw Sword"))
{
spriteCombiner.Start();
spriteCombiner.DrawSprite(spriteCombiner.sword1);
}
}
}
Your answer
Follow this Question
Related Questions
Texture2D SetPixels/Apply changes not permanent. 2 Answers
Draw tilemap with Texture2D.SetPixels: Performance and Memory? 0 Answers
Fastest rendering of 2D world with lots of changes to screen every frame? 3 Answers
How do you crop a Texture2d 1 Answer
Unity UpdateExternalTexture from MovieTexture windows crash 0 Answers