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);
}
}
}