GUILayout对齐问题

时间:2014-01-24 23:58:41

标签: unity3d unityscript

我正在尝试为游戏设置一个高分评分指标,我希望每个设备看起来都一样,这就是为什么我要尝试使用GUILayout。我还是新手,发现这个特殊的功能令人困惑。一般的想法是有一个如下所示的布局: 高分:(得分),并在游戏屏幕中看起来像这样:(硬币纹理)x(收集的数量)。任何有关如何正确设置它的帮助都会很棒。每一个都会进入屏幕的左上角。

1 个答案:

答案 0 :(得分:1)

Unity中的GUILayout更多的是关于自动定位而不是关于分辨率独立性。基本上,除非您使用GUILayoutOptions指定维度,否则GUILayout元素将自动定位到其包含区域的左上角,并自动调整大小。查看GUILayout tutorial

要支持所有分辨率,您需要使用GUI.Matrix(解释here),或使用Screen.widthScreen.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();
}