How to add sprite preview to the Inspector window

 

We often use Scriptable Objects to store data about our in game items. To extend what we can see in the inspector we can create a Custom Editor for our MonoBehaviours or Scriptable Objects.

All we need to do is create an Editor folder and inside create a custom script (usually called “name of your script + Editor”). The Editor folder can be placed anywhere / you can have multiple of them in your project.

 


Weapon Scriptable Object + Custom Editor code

Here is the code behind my Scriptable Object

 
 
[CreateAssetMenu]
public class Weapon : ScriptableObject
{
    //just the data that I need the weapon to have
    public string weaponName = "Sword";
    public Sprite weaponSprite;
    [Range(0, 1)]
    public float baseHitChance = 0.5f;
    [Range(0,10)]
    public int weaponDamage = 3;
    
}

And here is the custom editor

 
//we need that using statement
using UnityEditor;
using UnityEngine;

//We connect the editor with the Weapon SO class
[CustomEditor(typeof(Weapon))]
//We need to extend the Editor
public class WeaponEditor : Editor
{
    //Here we grab a reference to our Weapon SO
    Weapon weapon;

    private void OnEnable()
    {
        //target is by default available for you
        //because we inherite Editor
        weapon = target as Weapon;
    }

    //Here is the meat of the script
    public override void OnInspectorGUI()
    {
        //Draw whatever we already have in SO definition
        base.OnInspectorGUI();
        //Guard clause
        if (weapon.weaponSprite == null)
            return;

        //Convert the weaponSprite (see SO script) to Texture
        Texture2D texture = AssetPreview.GetAssetPreview(weapon.weaponSprite);
        //We crate empty space 80x80 (you may need to tweak it to scale better your sprite
        //This allows us to place the image JUST UNDER our default inspector
        GUILayout.Label("", GUILayout.Height(80), GUILayout.Width(80));
        //Draws the texture where we have defined our Label (empty space)
        GUI.DrawTexture(GUILayoutUtility.GetLastRect(), texture);
    }
}
 

Want to learn more about Unity ?

Check out my OOP for Unity Devs video course and others !

 
 

You can also support me through Patreon:

 

If you agree or disagree let me know by joining the Sunny Valley Studio discord channel :)

Thanks for reading!

Peter

Previous
Previous

Curved World shader in Unity

Next
Next

How to highlight a 3D object in Unity?