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. Code (CSharp): 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): Code (CSharp): 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: Code (CSharp): 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. Code (CSharp): Component.active = true; And for convert a Image to SpriteRenderer and the inverte you can use a fonction like this: Code (CSharp): 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 - Code (csharp): renderingComponent = GetComponent<Image>() ?? GetComponent<SpriteRenderer>(); But in your Update(), call a method similar to this: Code (csharp): 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) } }