Convert a variable type in C#

I am trying to write a script that lets my animate either the Image or the SpriteRenderer component of a gameobject, depending on which of the two is attached. I’ve noticed that my logic works for both types, but I don’t know if and how it’s possible to convert a variable type depending on what kind of component my script finds in Awake.

spriteRenderer.sprite = SetMyCurrentFrame();
image.sprite = SetMyCurrentFrame();

Is it possible in C# to create some kind of Object variable and convert its type to whatever is attached to the gameobject? I’m trying something like this (pseudo code):

public Object myRenderingComponent; //can be Image or SpriteRenderer

void Awake() {
    try
    {
        myRenderingComponent = GetComponent<Image>();
    }
    catch (myRenderingComponent == null)
    {
        myRenderingComponent = GetComponent<SpriteRenderer>();
    }
    catch (myRenderingComponent == null)
    {
    Debug.Log("Please attach an Image or SpriteRenderer component!");
    }
}

void Update() {
    //do my rendering code
    myRenderingComponent.enabled = true;
    myRenderingComponent.sprite = SetMyCurrentFrame();
    //...
}

Thanks a lot for any tips!

Could do it like:

public Component renderingComponent;
public Sprite TheSprite;

void Awake()
{
   renderingComponent = GetComponent<Image>() ?? GetComponent<SpriteRenderer>();

   if(renderingComponent)
   {
     theSprite = renderingComponent.sprite;
   }
   else
   {
    Debug.Log("Please attach an Image or SpriteRenderer component!");
   }
}


void Update()
{
   renderingComponent.enabled = true;
   theSprite = SetMyCurrentFrame();
}

Thanks, that looks elegant, but Unity is giving me an error that the type “Component” doesn’t contain a definition for “enabled” or “sprite”.

Maybe I need a custom type converter to cast from Image to SpriteRenderer or some custom class.

enabled is strangly removed in Unity3D (bug?) but I don’t know if that works if you use active.

Component.active = true;

And for convert a Image to SpriteRenderer and the inverte you can use a fonction like this:

   public void UIImageFromSpriteRenderer(ref Image OutputImage,SpriteRenderer spriterenderer)
    {
        OutputImage.color = spriterenderer.color;
        OutputImage.sprite = spriterenderer.sprite;
        OutputImage.material = spriterenderer.material;
    }
   public void SpriteRendererFromUIImage(Image OutputImage, ref SpriteRenderer spriterenderer)
    {
        spriterenderer.color = OutputImage.color;
        spriterenderer.sprite = OutputImage.sprite;
        spriterenderer.material = OutputImage.material;
    }

Component doesn’t have an enabled property (never has).

SpriteRenderer is descended from Renderer, which defines an enabled property.

UnityEngine.UI.Image is descended from Behaviour, which defines a different enabled property.

A simplified family tree is:

  • Component (no enabled property)

  • Renderer (enabled property)

  • SpriteRenderer

  • Behaviour (enabled property)

  • (a bunch of other classes)

  • Image

You can still use this line from @A.Killingbeck -

renderingComponent = GetComponent<Image>() ?? GetComponent<SpriteRenderer>();

But in your Update(), call a method similar to this:

void SetFrame(Component renderingComponent) {
    if (renderingComponent is SpriteRenderer) {
        var spriteRenderer = renderingComponent as SpriteRenderer;
        spriteRenderer.enabled = true;
        spriteRenderer... //(set your other SpriteRenderer-specific stuff here)
    } else if (renderingComponent is UnityEngine.UI.Image) {
        var image = renderingComponent as UnityEngine.UI.Image;
        image.enabled = true;
        image... //(set your other Image-specific stuff here)
    }
}

Thank you! TonyLi’s suggestion works and also clears up the inheritance of the mentioned classes.