我正在尝试为游戏设置一个高分评分指标,我希望每个设备看起来都一样,这就是为什么我要尝试使用GUILayout。我还是新手,发现这个特殊的功能令人困惑。一般的想法是有一个如下所示的布局: 高分:(得分),并在游戏屏幕中看起来像这样:(硬币纹理)x(收集的数量)。任何有关如何正确设置它的帮助都会很棒。每一个都会进入屏幕的左上角。
答案 0 :(得分:1)
Unity中的GUILayout更多的是关于自动定位而不是关于分辨率独立性。基本上,除非您使用GUILayoutOptions指定维度,否则GUILayout元素将自动定位到其包含区域的左上角,并自动调整大小。查看GUILayout tutorial。
要支持所有分辨率,您需要使用GUI.Matrix(解释here),或使用Screen.width
和Screen.height
手动缩放内容。
但除了分辨率问题,这里有一些代码可以帮助您入门(使用GUI.Matrix方法 - 硬编码的像素值将相对于所选的1280x800“原生”布局分辨率)。
public int currentScore = 120;
public int highScore = 1490;
public Texture2D coinTexture;
// Native layout dimensions
public const float LAYOUT_WIDTH = 1280f;
public const float LAYOUT_HEIGHT = 800f;
private void SetGUIMatrix()
{
Vector3 scale = new Vector3(Screen.width/LAYOUT_WIDTH,
Screen.height/LAYOUT_HEIGHT,
1f);
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
}
void OnGUI ()
{
SetGUIMatrix();
Rect highScoreRect = new Rect(10, 10, 120, 100); // 120x100px rect near top left corner of the screen
GUILayout.BeginArea(highScoreRect);
// High score
GUILayout.Box("High score: " + highScore, new GUILayoutOption[] { GUILayout.Height(40) });
// Current score
GUILayout.BeginHorizontal();
GUILayout.Box(coinTexture, new GUILayoutOption[] { GUILayout.Width(60), GUILayout.Height(40) });
GUILayout.Box(currentScore.ToString(), new GUILayoutOption[] { GUILayout.Height(40) });
GUILayout.EndHorizontal();
GUILayout.EndArea();
}
请注意,使用此方法,元素将被拉伸以适应不同的宽高比,这可能是也可能不是您想要的。希望这有帮助!
编辑:抱歉,错过了问题中的JavaScript代码。这在JS中是相同的:
var currentScore = 120;
var highScore = 1490;
var coinTexture : Texture2D;
// Native layout dimensions
var LAYOUT_WIDTH = 1280.0;
var LAYOUT_HEIGHT = 800.0;
function SetGUIMatrix()
{
var scale = new Vector3(Screen.width/LAYOUT_WIDTH,
Screen.height/LAYOUT_HEIGHT,
1.0);
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
}
function OnGUI ()
{
SetGUIMatrix();
var highScoreRect = new Rect(10, 10, 120, 100); // 120x100px rect near top left corner of the screen
GUILayout.BeginArea(highScoreRect);
// High score
GUILayout.Box("High score: " + highScore, GUILayout.Height(40));
// Current score
GUILayout.BeginHorizontal();
GUILayout.Box(coinTexture, GUILayout.Width(60), GUILayout.Height(40));
GUILayout.Box(currentScore.ToString(), GUILayout.Height(40));
GUILayout.EndHorizontal();
GUILayout.EndArea();
}