unity3d的GUI元素的界面坐标系统总结(有公式)

大家好,我是孙广东,我近期在做一个游戏,UI就是使用了系统提供的GUI。遇到非常多的问题。相信大家经常使用的就是NGUI或者2DTOOLKIT.活不多说。

Unity有四个重要的坐标系统。

能够查看例如以下文章进行了解:

我今天主要是要说的内容就两个:GUIText 和GUITexture

1、GUIText

锚点(Anchor)的概念我就不介绍了。像NGUI和tookit2d还有 Cocos2d中都有这个重要的概念,对于图片我们能够觉得是图片自身的原点。

而GUIText 对象本身也是支持设置锚点的,可是仅仅有9个选项。用于设置显示的Text文本的总体的自身坐标原点。

不论什么对象都会有Transform组件,而在GUIText对象中的实用的就是Position。这个Position代表了什么呢?

一个重要的公式:

整个Text文本的的总体的自身坐标原点在窗体屏幕上的位置:

pos(x,y) = (Position.x*Screen.width + PixelOffset.x,  Position.y*Screen.height + PixelOffset.y)

这个Position它代表了整个Text文本的的总体的自身坐标原点的位置的基础,Position.x是整个窗体屏幕的宽度的倍数,Position.y是整个窗体屏幕的高度的倍数。

注意屏幕的坐标原点是左下角为(0,0)。

你最好还是能够尝试的试试这些值。观察变化。

其它的属性这里不做介绍。

2、GUITexture

这个是没有锚点的,图片的自身原点就是在左下角为(0,0,)。

一个重要的公式:

整个GUITexture图片的总体的自身坐标原点在窗体屏幕上的位置:

pos(x,y) = (Position.x*Screen.width +PixelInset.x,  Position.y*Screen.height +PixelInset.y)

这个Position它代表了整个Text文本的的总体的自身坐标原点的位置的基础,Position.x是整个窗体屏幕的宽度的倍数,Position.y是整个窗体屏幕的高度的倍数。

两个值的自己能够尝试着去修改。观察现象。

最后给大家做这个逻辑:    例如以下的一个游戏结束的效果。

对象的逻辑是这种,GameOver是一个空对象。

BG_End 是游戏结束的大背景图

以下是三个文本GUIText

和还有GUITexture”本次获得积分“图片。

和一个button形状的GUITexture图片

为了让整个的逻辑不变形。就是让前面的各个小的UI元素做游戏结束的大背景图的子对象。    我们让子对象和父对象都是相对于Transform.Position.x,y的值(要注意), 可能觉得我设置子对象的Transform.position.x.y都是 0,0,。注意子对象从父对象那继承了。对子对象一样。这样我们就这是子对象的PixelInset.x,y 调整到合适的位置。

我们记录button假图片的这个值。

如上图:我们编写代码显示真正的button时要用到。

以下编写代码来显示这个button:

voidOnGUI()     //显示button //

{

GUI.skin= myGUI;

if(GUI.Button(newRect(Screen.width*0.5f-26.3f,Screen.height*0.5f+178.71f-67f,61f,67f),"",GUI.skin.GetStyle("ContinueButton")))

{

Application.LoadLevel("mainMenu");

}

}

这里要注意一个基本的内容是“绘制GUI界面的坐标系以屏幕的左上角为(0,0)点

Button的位置公式:

(Screen.width*(子Position.x+父Position.x)+子PixelInset.x的原值,Screen.height*(子Position.y+父Position.y)+
子PixelInset.y的绝对值值-子PixelInset.h)

大小游戏中一般就是美工提供的原图大小。

自己好好领悟吧。

时间: 2024-08-05 07:08:22

unity3d的GUI元素的界面坐标系统总结(有公式)的相关文章

Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收

今天和盆友们讨论IOS的高级界面与unity3d游戏引擎的交互,这个在开发中是非常重要的,unity3d 毕竟是一个面向多平台的一个游戏引擎,它不可能全部为IOS 考虑的面面俱到,引擎中也不存在针对IOS的高级界面的控件的使用. 本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情. 上一章介绍了触摸IOS屏幕 移动摄像机的位置,下面有盆友问我说他不想移动摄像机的位置,就想移动物体的位置,我在这里

GUI测试(界面测试)

GUI(Graphical User Interface,图形用户界面)是计算机软件与用户进行交互的主要方式.GUI软件测试是指对使用GUI的软件进行的软件测试. GUI测试覆盖准则 GUI的存在为用户的操作带来了极大的方便,同时,也使得GUI软件更复杂.更难以测试.GUI软件的测试由于其凸现出来的/重要性,已日渐引起学术界和工业界的兴趣和重视.然而,关于GUI软件测试的研究还处于初级阶段:很多问题还没有解决,GUI软件测试依然需要较高人工成本,还不能满足保证软件质量的实际需求. GUI的存在为

Unity3D开发——LeRunning角色选择界面制作

//////////////////2015/08/20/////////////////// /////////////////by  xbw///////////////////////// /////////////////环境 unity4.6.1///////////// 今天的玲珑杯数字媒体创意大赛算是差不多结束了,做了一个多月的也积累了不少经验,写一下教程吧,关于这个人物角色选择的界面 先看一下效果图 UI内容不少吧,现在先说一下这个人物切换, 这个呢就用预制体了,把需要的角色添加

[原]Unity3D深入浅出 - GUI控件

Unity的GUI类提供了丰富的界面控件,通过组合这些控件,完成和用户交互的界面. Lable:绘制文本和图片 Box:绘制一个图形框 Button:绘制一个响应单击事件的按钮 RepeatButton:绘制一个处理连续按下事件的按钮 TextField:绘制一个单行文本输入框 PasswordField:绘制一个密码输入框 TextArea:绘制一个多行文本输入框 Togle:绘制一个开关 Toolbar:绘制一个工具条 SelectionGrid:绘制一组网格按钮 HorizontalSli

tkinter的GUI设计:界面与逻辑分离(四)-- 与 matplotlib 结合

有些场合,我们需要对数据可视化.单是靠 tkinter 难度太大,而且做出来的效果不一定理想. 此时,将 tkinter 与 matplotlib 结合,是最好的选择. 知识点: 将 tkinter 与 matplotlib 结合的整个套路是固定的,只需要关心我们的绘图逻辑和程序逻辑即可 import matplotlib matplotlib.use('TkAgg') import numpy as np from matplotlib.backends.backend_tkagg impor

python gui之tkinter界面设计pythonic设计

ui的设计,控件id的记录是一件比较繁琐的事情. 此外,赋值和读取数据也比较繁琐,非常不pythonic. 有没有神马办法优雅一点呢?life is short. 鉴于控件有name属性,通过dir(Entry_obj)得知,存放在一个_name的属性里面.于是就有了以下代码: Entry(frame,name='your_id1').grid(row=x1,column=y1) Entry(frame,name='your_id2').grid(row=x2,column=y2) ... En

GUI用户图形界面

/*记事本小练习 * GUI & IO综合运用 */ import java.awt.*; import java.awt.event.*; import java.io.*; public class Test33 { public static void main(String[] args) { MyTest mytest = new MyTest(); mytest.frameInit(); //运行窗口 } } class MyTest{ //定义成员变量,包括窗体,文本区域,对话框,

unity3d 改动gui label颜色,定义颜色需除以256

GUIStyle titleStyle2 = new GUIStyle(); titleStyle2.fontSize = 20; titleStyle2.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f); GUI.Label(new Rect(Screen.width / 2 - 70, Screen.height / 2 -30, 100, 30), "是否覆盖已有关卡?", titleS

unity3d的矩阵元素存储方式

想知道u3d矩阵各个元素的存储方式,所以测试了一下 Matrix4x4 m = Matrix4x4.TRS(new Vector3(1, 2, 3), Quaternion.Euler(0, 0, 30), new Vector3(1, 1, 1));        for (int i = 0; i < 4; i++)        {            for (int j = 0; j<4; j++)            {                Debug.Log(m[i