Unity – Scaling instantiated child elements in uGUI

It’s been a while since my last post, but I randomly discovered that someone RT’d my tip about safe renaming in Unity. I just ran across something else that isn’t really complex, but I’ve had run-ins with it a number of times. I’ll continue to post common issues that I encounter if it ends up being useful to someone out there.

Unity’s native GUI system is powerful and covers most use cases. But one thing I’ve consistently needed to do is create a number of child elements that are parented to a RectTransform that has a width that scales with screen width. While your RectTransform may look fine when hand-parented in the hierarchy, Unity performs a number of hidden transformations when an object is instantiated from a script and then parented.

Screen Shot 2015-11-05 at 12.20.32 PM

What you see in the editor.

Screen Shot 2015-11-05 at 12.20.07 PM

What you see during runtime.

I needed to parent a number of characters to a ScrollRect menu, but their offsets were incorrect when parented. This probably occurs because my content panel width scales with the screen width, causing a bit of chaos when parenting and scaling the offsets according to my content width.

Basically, I need to re-assign the x-values of my offset (the y-values are a fixed size of 64 and do not scale with screen height).

for (int i = 0; i < GetInventoryCharacterCount (); i++) {
	// Create new button for char in inventory.
	GameObject gobj = GameObject.Instantiate (this.loadoutCharacterButtonPrefab, Vector3.zero, Quaternion.identity) as GameObject;
	gobj.transform.SetParent (this.contentParent);

	// Reset position and offsets of button.
	RectTransform rt = gobj.GetComponent<RectTransform> ();
	rt.offsetMin = new Vector2 (0.0f, rt.offsetMin.y);
	rt.offsetMax = new Vector2 (0.0f, rt.offsetMax.y);
	rt.anchoredPosition = new Vector2 (0.0f, i * -64.0f);
	rt.localScale = Vector3.one;

	// Populate character button with info from inventory.

The key is to reset the x-offsets to 0, or whatever you want the offsets to be. I’m keep the same y-offset, but you may have a different usage depending on what elements you want or don’t want to keep fixed.

rt.offsetMin = new Vector2 (0.0f, rt.offsetMin.y);
rt.offsetMax = new Vector2 (0.0f, rt.offsetMax.y);

Also, the prefab that I’m instantiating is set to scale with the parent content.

Screen Shot 2015-11-05 at 12.16.12 PM

I have a scaling width, fixed height, and anchor and pivot set to top.

After that, you should have no problems with the child element being rescaled.

Hope this helps!

Commenting and Unity

Nobody gives a straight answer when asked “how do you make good comments?” The responses are all formatted in terms of what to do and what not to do. Don’t overdo it. Don’t try to make them look pretty. Be concise. The vague-ness of our answers exists because there’s no right way to comment, but there are plenty of wrong ones. Also, strong-arming a particular cookie-cutter series of required components can potentially lead to bloated, irrelevant comments. Even so, as an industry with so many existing development and production standards and so many different coding styles, why is there no standard practice for commenting? Would this not vastly improve the quality and readability of our collective code?

When it comes to Unity, the entity-component system that the engine employs makes so much damn sense, it’s a wonder that not all development platforms follow a similar system. When so many games depend on interacting elements in 3D space nowadays, simplicity and flexibility are at the top of the list in terms of organizing assets and code.

It is because of this system, why not do this…

/* MobileControls
* Attaches to: Player
* Function: Controls device touch points, rotates and translates the character
* Function: Displays the directional pointers */

Okay fine, given that the functionality of this particular MonoBehavior isn’t very complex, we allow for simplicity in the comment. However, the way the Unity Engine is set up, the ability to create ambiguously floating scripts often lends itself to require answers for two questions: where do I go, and what do I do? Answer them, and for the most part, you’re golden.

Regressing Regrets

Recently, I looked back at some art pieces I did about 2-3 years ago or so. After going through the usual “oh god this looks awful” reactions that comes with improvement over time, I noticed something that was missing in my more recent work.

There was a sense of adventurousness and creativity that I had not seen in a long time.

In 2010, I played around with a project making playing cards that used C2 symmetry. I wanted the end-product to combine hand-drawn and techno-punk aspects, and playing card styles seemed like an ideal platform to try out the idea.


The Machine Court

At first glance, I immediately identified issues with proportions, line-work, layout, and a host of other embarrassing problems, but the ideas were there. The imagination was there.

The core part of creating interesting gameplay derives from established norms of fun and imbues them with differentiable aspects that make the game unique. In an art sense, this can mean adding mechanical elements to contrast medieval themes, creating steampunk-like properties. In designing gameplay, surprising the player by applying a twist to what’s expected is crucial to making a good game.

For the most part I’ve transitioned away from art and almost exclusively code gameplay for games. Reflecting back, the goal now is to channel that naive, explorative mindset and add it to the work that I’m doing now.

New Beginnings

When art challenges our perception of reality, our senses have been usurped by someone else’s imagination. Successfully accomplishing this feat is what drives the creation of the art game.

Ultimately, the role of an artist is to draw upon unique perspectives, inviting others to evaluate their world from a foreign point of view. Our collective growth requires the constant challenging of expectations and understanding of how things are or should be. Sadly, we can only exist in our own separate worlds, limited by the extent of our perceptions. Art is one way to deliver an alternate version of reality that plays by the rules of the artist. By sharing these experiences, the preconceived impossibilities of our separate worlds suddenly become connected and realizable.