- 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
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                