- Home /
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);
}
}
Answer by BossClaw · Jul 22, 2018 at 04:22 AM
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);
}
}
}
Your answer
Follow this Question
Related Questions
How to consolidate models into a single Asset? 0 Answers
How to quickly change the texture on a material? 1 Answer
Do Sprites Hinder Preformance? 1 Answer
Creating multiple assets from the same texture 0 Answers
2D Layout + 2D Spritesheets 0 Answers