Scaling the GUI using a matrix issues

Hello everybody,

In another question I was able to get some code that would dynamically scale the GUI so that the buttons would end up in the right spots in the right scale. However, the code doesn’t scale them correctly, nor puts them in the right place. Actually, to be honest I can’t tell if they’re scaled correctly but they’re definitely not in the right places. The only idea I had was to edit the toffset of the matrix but I don’t know what to change. The only resolution that looks correct is 1600x770. Any help would be appreciated.

void OnGUI () {
		//GUI Matrix and GUI Scaling
		Vector3 scale;
		int originalWidth = 1600;
		int originalHeight = 770;
		
		scale.x = Screen.width/originalWidth;
		scale.y = Screen.height/originalHeight;
		scale.z = 1;
		Matrix4x4 svMat = GUI.matrix;
		GUI.matrix = Matrix4x4.TRS(new Vector3(0,0,0), Quaternion.identity, scale);
		
		//Start Matrix
		//Draw Background
		GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),Background,ScaleMode.StretchToFill, false, 0.0f);
		//End Draw Background
		
		//Draw PlayButton
		if (GUI.Button(new Rect(30,180,235,590),"",PlayButton))
		{
			Application.LoadLevel("LoginScreen");
		}
		//End Draw PlayButton
		
		//Draw OptionsButton
		GUI.Button(new Rect(260,330,220,440),"",OptionsButton);
		//End Draw OptionsButton
		
		//Draw InstructionsButton
		if (GUI.Button(new Rect(1160,330,145,440),"",InstructionsButton))
		{
			doWindow0 = true;
		}
		//End Draw InstructionsButton
		
		//Draw ExitButton
		if (GUI.Button(new Rect(1320,180,265,590),"",ExitButton))
		{
			Application.Quit();
		}
		//End Draw ExitButton
		//End Matrix
		GUI.matrix = svMat;
		
		if (doWindow0 == true)
			GUI.Window (0, new Rect(Screen.width/2-240,Screen.height/2-100,800,120), DoMyWindow, "Instructions:");
	}

The problem is that the code you posted will cause exceptions complaining about a invalid gui matrix. In the following code you are dividing ints (Screen.width and Screen.height) by floats. You’ll always get whatever the values they have. Cast them as floats and it works.

Yours:
scale.x = Screen.width/originalWidth;
scale.y = Screen.height/originalHeight;

Fixed:
scale.x = (float)Screen.width/originalWidth;
scale.y = (float)Screen.height/originalHeight;

I thought I would add, in case somebody else is using this for reference:

This will not fill the screen, as Screen.width/Screen.height should not be used.
GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),Background,ScaleMode.StretchToFill, false, 0.0f);

Instead use:
GUI.DrawTexture(new Rect(0,0,originalWidth,originalHeight),Background,ScaleMode.StretchToFill, false, 0.0f);