2d image representing a 3d object?

I'm trying to emulate the style of the newer Pokemon games where the player and NPC's are 2d sprites in a 3d environment. Right now I have a 3d cube that conforms to an appropriately-sized grid, but what I'd really like is to be able to show a 32x32 image where that cube is instead. Is this possible, and if so, how? OnGUI doesn't seem appropriate to me as at times I'll need to have the GUI appear over this setup.

Having not played the newer ones, I can't say for certain, but from the videos I've seen of them, it is entirely possible that these pokemon games are actually 2d sprites in an 2d environment made up of pre-rendered 3D sprites. Regardless, your question was how to do 2D sprites in a 3D environment.

You can have multiple GUIs and you can have stuff appear on top of other stuff, but in order to actually be "in" a 3D environment, your object would need to have some depth position in the environment. To do this with an object in the scene, you would essentially map your sprite with alpha to a camera-aligned plane. in the scene. If you want to use GUI sprites, it may as well be a GUITexture GameObject which you can setup in the scene and muck about with.

How you choose to align to the camera depends on the look that wish to achieve. You could simply make the plane always face the camera like:

@script ExecuteInEditMode()
function Update () {
    transform.up = Camera.main.transform.position - transform.position;
    transform.forward = -Camera.main.transform.up;
}

Or you could just assume a camera alignment and fix all your planes relative to this.

A 32x32 image? That's the minimum allowed size for a Unity texture, but it will work just fine. To animate your sprite, you could swap out the image. This is robust because the same code essentially works even for larger sized sprites, etc.

An alternative approach is to choose a larger image size, tiled on the plane to only show one 32x32 block, include the frames of various animations at particular points in the larger texture and then you could animate it by simply changing your texture's offset. With a bit of math at the start, this could work for arbitrarily-sized sprites as well.

Mapping with the alpha is done fairly easily with the standard transparent cut-out shaders. If you don't want them to be affected by lighting, there is also an unlit version of these.

I'm not sure why you were using a cube. If you have multiple perspectives on your sprite, to make that actually look correct, you'd be better off animating (or simply swapping) the sprite for the rotation.

I had some luck by spawning a prefab with a GUITexture component and moving that using this code in C#:

public Transform GuiHelper;

void Start()
{
GuiHelper = (Transform)Instantiate(GUIHelperPrefab, Vector3.zero, Quaternion.identity);
}

Vector2 GetScreenPos()
{
    Vector2 screenPos = Camera.main.WorldToScreenPoint(transform.position);
    Vector2 convertedGUIPos = GUIUtility.ScreenToGUIPoint(screenPos);

    return new Vector2(convertedGUIPos.x / Screen.width, convertedGUIPos.y / Screen.height);
}

void OnGUI()
{
    if (GuiHelper)
    {
        GuiHelper.transform.position = GetScreenPos();
    }
}

The 'GUIHelper' is just a prefab I made that contains a GUITexture.

The caveat being that you may run into sorting weirdness if your objects overlap in your playfield. But if their positions are fixed you might be okay.