Ref to Texture Missing when Creating Sprite by Script during Asset Postprocessing

Greetings folks!

  • I’ve written a PostProcessing script to create a new Sprite from a Texture
  • The Sprite Asset is made but it doesn’t maintain a ref to the Texture.
  • Below is a picture of the Sprite using the Debug Inspector
  • I can drag the Texture Asset onto the Sprite, and everything works
  • Below that is the code
  • Any hints? Ideas? Thanks in advance!

using UnityEngine;
using UnityEditor;

using System.IO;


public class TextureToSpriteDemoProcessor : AssetPostprocessor
	{
	void OnPostprocessTexture(Texture2D texture)
		{		
		// CREATE NEW SPRITE WITH REF TO TEXTURE
		Sprite newSpr = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 16, 0, SpriteMeshType.FullRect);

		// CREATE NEW PATH FOR SPRITE
		string sprPath = Path.GetDirectoryName(assetPath) + "/" + Path.GetFileNameWithoutExtension(assetPath) + ".ASSET";

		// WRITE NEW ASSET
		AssetDatabase.CreateAsset(newSpr, sprPath);		
		}	
	}

Nevermind for I have made my own solution;

After posting the question I thought “The Texture ref is probably lost because it’s not an asset yet.” So I rewrote it as a Right-Click Context Menu.

It’s better this way for it gives more control over which files are processing at any time.

using System.IO;
using UnityEditor;
using UnityEngine;


public class SprFromTexture : EditorWindow
	{
	[MenuItem("Assets/Create Sprite From Texture")]
	private static void EditorCreateSpriteFromTexture()
		{
		// LOOP THROUGH EACH GUID OF SELECTION
		foreach(string guid in Selection.assetGUIDs)
			{
			// MAKE ASSETPATH FROM GUID
			string assetPath = AssetDatabase.GUIDToAssetPath(guid);

			// ATTEMPT LOAD ASSET AS TEXTURE2D
			Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);

			// SKIP IF THIS IS NOT TEXTURE2D
			if (texture == null) {Debug.LogError("SELECTION[" + assetPath + "] IS NOT TEXTURE"); continue;}

			// MAKE THE NEW SPRITE ASSET SUCCESSFULLY            
			Sprite newSpr = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 16, 0, SpriteMeshType.FullRect);

			// MAKE SPRITE PATH SAME AS TEXTURE BUT WITH .ASSET EXTENSION
			string sprPath = Path.GetDirectoryName(assetPath) + "/" + Path.GetFileNameWithoutExtension(assetPath) + ".ASSET";

			// WRITE / OVERWRITE
			AssetDatabase.CreateAsset(newSpr, sprPath);
			}
		}
	}