- Home /
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:");
}
Answer by wiley.a · Nov 05, 2012 at 01:48 AM
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;
Answer by BobbyDoogle · Feb 21, 2015 at 08:26 PM
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);