Skip to main content

Unity: How Adapters can help you write fewer MonoBehaviours

TL;DR: You don't need to duplicate a bunch of code to do the same things to a Image and a SpriteRenderer, or RectTransform and Transform, etc. You can use a simple pattern called the Adapter Pattern. If you've never used it before, this post explains how.

The Problem: Image vs SpriteRenderer

Lets say you want to make a sprite fade out, maybe its a dead monster or a collectible, but in either case you want it to gracefully depart from the screen rather than blink out of existence. Kinda like this eyeball monster from Beastly:


So that's pretty easy right, one way of doing it is with a MonoBehaviour that modifies the sprites alpha value via SpriteRenderer.color. Your class might look something like this:
public class AlphaFaderSprite : MonoBehaviour {
  public SpriteRenderer spr;
  public float fade_percentage;

  void Update() {
    spr.color = new Color(spr.color.r, spr.color.g, spr.color.b,
        fade_percentage);
  }
}
Now, anyone who's used Unity for more than an hour is now screaming internally at how inefficient the above class is. You'd never write code like this in reality, but for the sake of this tutorial lets ignore the specifics and keep things simple.

It is simple, right?

But what happens when you want to do the same thing to a UI element? Like a UI.Image?

Well that's easy too: we can just do the same thing we did for sprites and build a AlphaFaderUI:
public class AlphaFaderUI : MonoBehaviour {
  public Image img;
  public float fade_percentage;

  void Update() {
    img.color = new Color(img.color.r, img.color.g, img.color.b,
        fade_percentage);
  }
}
Great, but now alarm bells are ringing all up in your brain because you just wrote the same class twice.

The only difference between the two classes is that one works with Image and the other works with SpriteRenderer. Usually, this is where something like Polymorphism would come in handy, but unfortunately Image and SpriteRenderer meet in the class tree at Component, which doesn't provide a color member.

So how can we avoid this duplication? We could use Reflection, or if we were using a later version of C# we might use the dynamic keyword. The answer that I want to talk about is the Adapter Pattern.

The Adapter Pattern

First we define the adapter abstract base class, ColorAdapter, this promises to give us a way of modifying the color. This is what our generic components will use instead of SpriteRenderer or Image
public abstract class ColorAdapter {
  public abstract Color color { get; set; }
}
Next we subclass ColorAdapter for both Image and SpriteRenderer, these each simply delegate color modifications to their "adaptee" member variables.
public class AdaptedImage :  ColorAdapter {
  Image adaptee;

  public AdaptedImage(Image adaptee) {
    this.adaptee = adaptee;
  }

  public override Color color {
    get { return adaptee.color; }
    set { adaptee.color = value; }
  }
}

public class AdaptedSpriteRenderer : ColorAdapter {
  SpriteRenderer adaptee;

  public AdaptedSpriteRenderer(SpriteRenderer adaptee) {
    this.adaptee = adaptee;
  }

  public override Color color {
    get { return adaptee.color; }
    set { adaptee.color = value; }
  }
}
Now, in our alpha fade component we simply define AlphaFader to use a ColorAdapter.
public class AlphaFader : MonoBehaviour {
  public ColorAdapter ca;
  public float fade_percentage;

  void Update() {
    ca.color = new Color(ca.color.r, ca.color.g, ca.color.b,
        fade_percentage);
  }
}
And now we can write Alpha Fading logic once and use it for both component types. Mission accomplished.

Pros and Cons

You might be thinking
"We've ended up writing more lines of boilerplate code than we duplicated in the first place!"
... and you'd be right, but remember that this is a toy example. This class could also be used for any color manipulation (for example: flashing a sprite red when taking damage and "greying out"a shop item to signify that the player has insufficient funds could be the same component). If you've got a more complex series of color transformations the benefits are even greater.

We can add other functionalities to our adapter class, such as access to underlying Sprite or Material for even more flexibility. This might limit the number of Unity Components that can make use of the adapter, but that's only because its an abstract class. ColorAdapter doesn't actually need to be abstract, it can be an interface. Which means that you can create a myriad of different adapter types which something like a AdaptedImage can implement, further increasing coverage. An AdaptedImage could be an IColorAdapter, an ISpriteAdapter and an IMaterialAdapter all at once.

Beyond that, its easy to extend this to work with other components. We can define a Adapted3DRenderer for GetComponent<Renderer>().material.color manipulation and reuse our AlphaFade component for 3D objects, we can define a AdaptedText and fiddle with UI.Text colors.

One catch we do need to watch out for here: Where do we construct the ColorAdapters in the first place? For a simple Image/Sprite adapter it might be okay to have a couple of GetComponent<T>() calls in the Start() method of our alpha fading class:
  ColorAdapter ca;

  public void Start() {
    SpriteRenderer spr = GetComponent<SpriteRenderer>();
    Image img = GetComponent<Image>();

    if (spr != null) {
      ca = new AdaptedSpriteRenderer(spr);
    } else if (img != null) {
      ca = new AdaptedImage(img);
    }
  }
but it's easy to see that this might get annoying or complicated as we expand the range of possible adapters. We could try and do this in some kind of baseclass for classes that use the color adapters, but that would limit our ability to use multiple different types of adapter (e.g. some kind of TransformAdapter for RectTransform and Transform manipulation). Its clear that this would be a band-aid and not a solution.

The good news is that in practice this is (usually) a non-issue. This is because (usually) there will be an attached component which references your ColorAdapter holding component. In our first example, the dying monster, this would be the Monster class, which would be working with AlphaFade, we can pass responsibility for initialization to Monster.Start() instead, where we already know that we're dealing with a SpriteRenderer.

Wrapping Up

So, not bad right? The Adapter pattern is very simple, the type of thing that many of you might have already used without knowing it. I'm highlighting it here because I feel like small patterns like this are often overlooked in favor of more fancy techniques. There are larger versions of this problem where one might be tempted to use Reflection to facilitate a Duck Typing solution but, bar some minor issues, you're probably better off writing a little boiler plate and saving yourself the headache.

~Charles

Comments

  1. Thanks for sharing informative post. Soulblu is a leading vape store Melbourne offering wide range of e liquids, e electronic cigarette, vape supplies, DIY mixing tools, etc.

    ReplyDelete
  2. Aw, this was a really nice post. Finding the time and actual effort to produce a really good article… but what can I say… I procrastinate a lot and don't seem to get anything done.
    Click here to getMoreinformation.

    ReplyDelete
  3. this is a very informative https://techgadgetguru.com

    ReplyDelete
  4. It is good post! Will you share it on facebook? I always do it for my good posts because I have many fb followers. If you want to get it too, just visit this site https://soclikes.com/buy-facebook-followers and get

    ReplyDelete
  5. I will be happy if you read my comment. I must say that I like all your posts and wait for new ones. That's because they seem so great and suitable for me. Thanks a ton for uploading your articles.
    Cyber Racer Battles best racing games for kids!
    Smart Pin Ball the best games online!
    Pixel Zombies the best games online!
    Impostor Punch free games online for school!
    https://jogosio123.blogspot.com/
    https://friv4school123.blogspot.com/

    https://2playergamesonline.blogspot.com

    ReplyDelete
  6. Thanks for the detailed article on this topic. I would like to see more such awesome articles from you.

    ReplyDelete
  7. Thank you for clearing all this information, I would love to see more of these.

    ReplyDelete
  8. As this program's name implies this detox process takes 5 days to complete, so a little forethought is advised. What sets this program aside from other detox kits is that it includes a nutritional plan to aid in supporting detox. Follow the instructions of this detox program for best results. ​​Pros Cons Price For a quick and easy detoxification process from your system try using the incredible Mega Clean detox drink. This detox drink aims to get rid of high levels of toxins from various types of drugs while replenishing lost vitamins and minerals for optimal health. This detox is a two-part system that provides a 5-hour detoxification zone during which the toxins in your urine are obscured. The drink comes in two exciting flavors: tropical fruity and wild berry. This detox drink is supported with the help of a Detoxify PreCleanse Herbal Supplement. According to the site, it's recommended that the supplement be taken 12 to 24 hours before drinking Mega Clean. ​​Pros Cons Price While there are many reasons to detox, as we've discussed, passing a drug test is high on the list for most people. One of the best THC detox drinks is none other than the Detoxify Xxtra Clean Herbal Cleanse Drink. This highly efficient detox drink is herbally based and full of fiber and vitamins. These are also good for your health and are suitable for everyone. Here are some ways you can detoxify your body and pass a drug test the natural way: We cannot say this is unexpected, because it is obvious. Why go through all of the hassle of detoxification and drug tests, especially when your job depends on it? If you want to be free from marijuana, there is no better way than quitting it. If you are searching for a reputed and trusted brand to come out clear in a drug test, then Test Clear is a good option

    ReplyDelete
  9. The information you provided is very useful, thank you very much for sharing useful information with us. You can apply for a Turkey visa online. You can get your Turkey Visa in just 1 hour by selecting the express processing type. It only takes 5 minutes to apply for an electronic visa Turkey. Apply Online.

    ReplyDelete
  10. Exellent blog. Thanks again. Nice... Foreign Citizens can easily apply for the Indian 30 days tourist visa, The process is completely online. And Within 5 to 10 minutes Foreign can apply for an Indian tourist e-visa.

    ReplyDelete
  11. Web Solution Centre is a leading and independent Website Designing Company In Delhi that has inspired businesses, associations, budding startups, and small businesses to massive multinational corporations by giving them innovative and intuitive website design and development solutions to showcase their business online to the customers. From website designing, development, search engine optimization, ecommerce development, branding to digital marketing, WSC has the resources as well as the competence to help your business grow organically. WSC provides advance and intuitive web design and development solutions that help businesses garner a traceable quantifiable profit (ROI). As a leading Website Development Company, Delhi our expertise lies in Responsive Website Design, Graphic Design, CMS Design & Development, WordPress design & development, Joomla development, Drupal development, Magento development, Prestashop development, PHP Development, Asp.net Development and Java Development. We are just a call 9891846187 and click away support@websolutioncentre.com.

    ReplyDelete
  12. Thanks for all you do. I like the website themes and layout, you are posting amazing blogs.... What is the e-visa Turkey? Visa Turkish website, You can check here about Turkey e-Visa or Sticker Visa Application information. And you can read all guidelines

    ReplyDelete
  13. An engine is the heart of a vehicle and we at BP Auto Spares India ensures that the engine of your Tata vehicle is getting the treatment of only genuine replacement Tata Engine Parts at reasonable price.

    BP Auto Spares India is engaged in supplying only OEM quality replacement Tata Electrical Parts for major Tata trucks and models. We supply clutch parts for Tata Indigo, Indica, Telcoline, Xenon, Ace and many more.

    BP Auto Spares India is exceptionally good in rolling out OEM quality aftermarket replacement Tata Brake Parts for major Tata trucks and models at best prices.

    BP Auto Spares India is proficient in delivering a wide range OEM and aftermarket Tata Body Parts for major Tata trucks and models at best prices.

    ReplyDelete
  14. We are known as the best website designing company in Gurgaon that provides high-quality website design & development service. Connect with us for more information.

    ReplyDelete
  15. Hey friends, emergency entry visa to India, Foreign citizens can apply for Indian visa online easily. Within 5 to 10 minutes you can fill your form and in 1 to 3 working days you can get your visa.

    ReplyDelete
  16. Your substance material is nothing prompt of throbbing in bunches of ways. I guess this is alluring and eye-start texture. much obliged accurately a huge amount for stressing generally your substance material and your perusers. Happy Friday Quotes For Work

    ReplyDelete
  17. Congratulations on your article, it was very helpful and successful. a7b4a626fdef4478a7c4af1a57f92ce1
    sms onay
    website kurma
    website kurma

    ReplyDelete
  18. Thank you for your explanation, very good content. a23f0f09edb296d6584849bca9f07dca
    altın dedektörü

    ReplyDelete
  19. Thanks for your article. b915f910d1b916c543c75429077bfef2
    evde iş imkanı

    ReplyDelete
  20. I got some wonderful knowledge from this post. The post is very informative and helpful also. Thanks for sharing such a post. Keep it up.
    unblocked games abcya
    moto x3m bike race game for boy
    wheely abcya unblocked | Best games for kids

    ReplyDelete
  21. CSS Founder is a leading website design company in Bangalore, providing innovative and customized web solutions to clients across various industries. With a team of experienced designers and developers, CSS Founders offers a wide range of services including website design, development, e-commerce solutions, and digital marketing.

    ReplyDelete
  22. Looking for high-quality Tata Truck Parts? Look no further than BP Auto Spare Parts. With a wide range of Tata truck parts in stock, we have everything you need to keep your vehicle running smoothly. Shop with us today and experience top-notch quality and affordability. Discover why we're the go-to supplier for Tata truck parts at BP Auto Spare Parts.

    ReplyDelete
  23. Looking for a unique and powerful Crystal Money Tree? Karma Gems LLC has you covered! Explore our stunning collection and bring abundance and prosperity into your life with a Crystal Money Tree.

    ReplyDelete

Post a Comment

Popular posts from this blog

Wacom vs N-Trig - A Modern Comparison

WARNING : This post is long. I wrote this because I could not find an unbiased comparison of the modern N-Trig and Wacom technologies online. It was written in response to the artistic outcry regarding the Surface Pro 3. If you are an artist, I believe it is worth reading. UPDATED as of 20th June 2014 to reflect N-Trig software advancements. UPDATED as of 23rd June 2014 to reflect new direct Digitizer comparison information. Those of you who may visit this site regularly will know that I am a game developer, but what you might not know is that I also do a lot of sketching. (Maybe one day I will post the stuff online) Since I am a geek, I do almost all of my sketching digitally, which means I am always looking out for new developments in digitizer technology. This brings me to this post in particular: Following the announcement of the Surface Pro 3 , many artists were shocked and disappointed by the news that the SP3 would be using N-Trig technology rather than Wacom techn

Design Bites: Minecraft - Feed The Beast

The "Design Bites" series is about learning or appreciating just one design element of one game. It's about applying an analytical eye, even if it doesn't touch on everything. What's Minecraft - Feed The Beast? Minecraft is a Sandbox developed and released by Mojang in 2011 (Kinda, it was in beta for a long time). The player roams a procedurally generated world building things and collecting resources with a variety of tools. Feed The Beast (FTB) is a collection of Mods for Minecraft, which add new items, creatures, resources and other features to the game. There are many different Feed The Beast modpacks, each with their own goals and focuses. This article is specifically about "Feed The Beast: Infinity Evolved". I would encourage anyone curious about FTB to head on over to the Feed The Beast website or Forums and check it out! What's Awesome? Deep inside all humans is the burning desire to build a nuclear reactor. No? Just me? Alr