2D显示是 GUI.DrawTexture(); 策划提了个需求,说是做个表,有时针、分针、秒针,要求和系统时间相对应。解决思路如下:使用矩阵的旋转来做,使用一个临时变量保存正常的矩阵,调用函数 static function RotateAroundPivot (angle : float, pivotPoint : Vector2) : void 来进行旋转(ScaleAroundPivot可以用来缩放),第一个参数为旋转角度,从当前状态顺时针旋转的度数。第二个为中心点。做完相应操作,还原矩阵。代码如下:
var n : int;
function OnGUI()
{
n++;
var oldMatrix : Matrix4x4 = GUI.matrix;
GUIUtility.RotateAroundPivot(n,Vector2(100,100));
GUI.Button( Rect(100,100,100,100), "Rotation" );
GUI.matrix = oldMatrix;
GUI.Button( Rect(200,200, 100,100),"static" );
}
用Unity开发移动平台的游戏 不可避免的会遇到屏幕分辨率的问题
不同的分辨率上会使得原本正常的UI变得乱七八糟
我们知道 在Unity中可以拿一个plane作为背景 UI则是绘制在离摄像机最近的位置 可以认为是绘制在摄像机上的
因此分辨率的不同会导致UI的位置和大小出现错误
我们完全可以用一个plane去模拟button 并将它放在世界空间中 这样虽然可以解决位置和大小的问题 但是所带来的问题也一大堆并难于维护
因此我们需要根据屏幕的大小去按比例缩放UI
假如原本有个按钮是这样,并且当前的480x854分辨率下没问题,如果改成600x1024或者其他的分辨率,便会发现位置和大小都不正确了
function OnGUI () { if (GUI.Button(Rect(Screen.width - 200, Screen.height - 100, 64, 64), "Start")) { // dosomething } }
// original screen size var m_fScreenWidth : float = 480; var m_fScreenHeight : float = 854; // scale factor var m_fScaleWidth : float; var m_fScaleHeight : float; function Awake () { m_fScaleWidth = parseFloat(Screen.width)/m_fScreenWidth; m_fScaleHeight = parseFloat(Screen.height)/m_fScreenHeight; } function OnGUI () { if (GUI.Button(Rect(Screen.width - 200 * m_fScaleWidth , Screen.height - 100 * m_fScaleHeight , 64 * m_fScaleWidth , 64 * m_fScaleHeight ), "Start")) { // dosomething } }
则使用矩阵实现
GUI.matrix = Matrix4x4.TRS (Vector3(0, 0, 0), Quaternion.identity, Vector3 (m_fScaleWidth, m_fScaleHeight, 1));
这样就将button的位置和大小都按照比例缩放了 很简单