I often explore new ways to optimise my assets or to create quality-of-life improvements. An example of such an optimization is the Scalable Wrench.
A wrench of this type comes in a wide variety of sizes, but the main shape remains the same. After concluding this, I realised I could optimize this asset by removing the need of seperate sized versions and scale the default 10mm size wrench by the factor of the required size.
![](http://ronaldmeijers.com/wp-content/uploads/2019/07/Wrench_01_1080-1024x576.png)
This, however, resulted in each wrench having the same number indication in the texture, which would prove to be an unwanted result as the details could be observed from up close. I solved this issue by creating a separate Detail Normal map, which included all the numbers, and an additional UV channel which only mapped the area where the number would be shown.
![](http://ronaldmeijers.com/wp-content/uploads/2019/07/WrenchUVs-1-1024x576.jpg)
Through coding, the UV scale and offset change accordingly to the selected size as well as the scaling, resulting in a live update of the desired wrench size.
[ExecuteInEditMode]
...
void ChangeSize()
{
//Set scale from base 10 mm to sizefactor
float t_Scale = m_WrenchSize / 10.0f;
transform.localScale = new Vector3(t_Scale, t_Scale, t_Scale);
//Convert size to index in 4x4 array
int t_Index = 4 - (10 - m_WrenchSize);
float t_UVoffsetX = (1f / 4f) * t_Index;
float t_UVoffsetY = (1f / 4f) * Mathf.FloorToInt(t_Index / 4f);
//Apply offset to UV
GetComponent<Renderer>().sharedMaterial.SetTextureOffset(
"_DetailAlbedoMap", new Vector2(t_UVoffsetX, t_UVoffsetY));
}
![](http://ronaldmeijers.com/wp-content/uploads/2019/07/WrenchAnimation.gif)