It’s really all over the place. Anchoring and scaling and aspect ratio control can get you so far, sometimes that’s far enough. Having different scenes for different aspect ratios is another way to go. Obviously this makes it VERY important that nothing in the scene contains logic necessary to game function, because you do not want to have to change that in multiple places and have bugs.
When I do UI I always isolate 100% of the game logic outside of the UI controller, making the UI controller only for display and accepting input. I almost always do this with my Datasacks class, which is a bunch of lightweight scripts that transact between my Datasack scriptable objects and scene elements.