unity ios buildbuild了之后GUIText位置不对

【GUI】4.6以后的GUIText控件怎么写文字?【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:83,786贴子:
【GUI】4.6以后的GUIText控件怎么写文字?收藏
我看过一个教程里面,是X-Z坐标平面的,然后加了一个GUIText。这时候他是viewport坐标,左下角0,0右上角1,1的,然后我就很顺利的做好了。但是现在我自己做工程,是X-Y平面,我加了一个空游戏对象,给他添加GUIText控件,inspector里面写了一点字,他没有显示,场景视图和游戏视图都没有。我还发现他好像不是viewport坐标,中间变成了0,0。然后不管我怎么变换他的位置或者旋转他,他就是不显示文字。我知道脚本里面应该是public GUIText xTxText.text=&xxx&;然后在inspector里面把那个GUIText所在的游戏对象拖到脚本那个xText里面。但是他现在不显示是什么道理?
「猎聘网」互联网名企招聘,年薪30万起工作,「0加班」 互联网行业垂直招聘网
gameobject对象同样坐标要归一化,跟viewport一样
GUIText这些过时了吧,用以前的NGUI或者官方新出的UGUI
登录百度帐号Unity中的GUI编程
在这篇文章中我将给读者介绍Unity中的图形用户界面(GUI)编程.Unity有一个非常强大的GUI脚本API.它允许你使用脚本快速创建简单的菜单和GUI.
Unity提供了使用脚本创建GUI界面的能力.在写这篇文章的时候,Unity还没有提供一套原生的可视化GUI开发工具,尽管你可能会在Unity
Asset商店找到一些使用某种形式的图形化脚本编程编写GUI的工具.也提供了一个可以单独购买并整合进Unity的插件但这超出了这篇文章的范围.如果你对Scaleform插件的unity版本感兴趣,我推荐你看看.
Unity提供了两个主要的类来创建GUI.类用于创建手动放置的GUI控件.类用于创建自动放置的GUI控件.这两个类之间的区别将在文章后面搞清楚.
Unity也提供了资源(asset翻译成套件?).它可以被应用于给你的GUI控件提供一种通用的的"外观和感觉".一个GUISkin只是GUIStyle对象的集合.每个GUIStyle对象定义了单个GUI控件的样式,比如按钮,标签或者文本域.
GUiText组件可被用于渲染单个的文本元素,GUITexture组件可以被用于渲染2D材质到屏幕.GUIText和GUITexture都适用于为你的游戏绘制GUI元素(就像HUD),但这些组件不适用于在游戏中绘制菜单.对于游戏中的菜单(像等级选择和选项设置页面)你应该使用GUI和GUILayout类.
这些不同的类,资源(Asset)和组件每一个本文中都会阐述
首先我讲述一下如何在使用GUI和GUILayout在Unity中创建菜单.我也会向你展示如何使用GUISkin和GUIStyle来自定义GUI控件的外观
OnGUI回调函数
GUI的渲染是通过创建脚本并定义OnGUI函数来执行的.所有的GUI渲染都应该在该函数中执行或者在一个被OnGUI调用的函数中执行
ButtonDemo.js
脚本ButtonDemo.js将会在屏幕中间绘制一个按钮,松开按钮文字"Thanks!"就会被打印到调试控制台.
GUIContent
大多数通用控件比如按钮和标签允许你指定控件上该呈现在控件上的的文本或者材质.如果你想在一个控件上指定文本与材质,那必须使用结构.
CUIContent结构有几个构造函数允许你创建一个带有文本,材质和tooltip的CUIContent对象.
下面的例子扩展了之前的例子,但在这个例子中按钮的内容由GUIContent结构指定.
ButtonDemo.js
改进后的ButtonDemo.js脚本将会在屏幕上显示一个文本与材质.材质,文本和tooltip参数可以在检视器(inspector)中指定.
ButtonDemo.js脚本会产生如下结果.
使用GUI类你必须手动的摆放屏幕上的控件.控件使用GUI静态函数的position参数来摆放.为了在屏幕上摆放控件,必须将一个Rect结构作为第一个参数传递给GUI控件函数.Rect结构的为控件定义了X,Y,Width,Height属性.X,Y,Width和Height单位都是像素.
Screen.width和Screen.height属性可以被用于检视当前屏幕的范围.
脚本ScreenDimension.js可以被用于渲染上面的截图.
ScreenDimensions.js
ScreenDimension.js脚本将绘制4个标签.每个标签都使用Screen.width和Screen.height属性来决定其屏幕位置并对齐到屏幕角落里(测量单位为像素)
GUI类是Unity用于将控件渲染到屏幕上的主要类.GUI类使用手动摆放来决定屏幕上控件的位置.这意味着在渲染控件时你必须显式的指定控件在屏幕上的位置.使用这种方法手动摆放控件需要多做些工作但他可以让你精确地控制屏幕上的控件位置.如果你不想手动的指定GUI控件的位置,那你应该使用GUILayout类.我们后面再详细阐述GUILayout.
在下面的章节中,我将介绍在使用GUI和GUILayout时可利用的不同控件这些类提供的默认控件是box,button,label,window,texture,scroll
bars,sliders,textfield,textarea,toggle和toolbar
GUI.BUTTON
可能你最常用的控件之一就是按钮了.你可以使用GUI.Button()静态函数来创建一个按钮.这个函数用于将按钮渲染到屏幕上,当松开按钮时函数返回true.
这里值得一说的是GUI.Button函数只会在鼠标在按钮上按下并且在按钮上松开时才返回true,如果用户按下按钮移动鼠标在按钮外面释放鼠标,则函数不会返回TRUE,同样的如果用户按下了鼠标之后将光标移动到按钮上然后释放鼠标该函数也不会返回TRUE.要使该函数返回true,鼠标必须在按钮上按下并释放.
以下代码可用于使用按钮创建一个简单的等级选择屏幕(假定你在Build Settings对话框中有多个场景文件要设置)
LevelSelect.js
将脚本添加到空的场景中会产生如下结果:
你也许会想看看Unity脚本参考里的和,这些与控件类似但略有不同的功能.
GUI.Label()静态函数用于绘制一个标签.标签通常实在屏幕上指定位置绘制的文字.标签控件最常用的是在菜单屏幕中指定选项名称(比如文本框和文本域).
标签可包含文字,材质或者两者兼有(使用之前讲过的GUIContent结构)
下面的例子在屏幕上显示绘制了两个选项.选项名称和滑块的值使用标签呈现
OptionsMenu.js
OptionsMenu.js脚本运行结果如下:
你也应该改看看和这些控件允许你创建可编辑文字输入控件.
GUI.HorizontalSlider和GUI.verticalSlider
GUI.HorizontalSlider和GUI.verticalslider静态函数可相应的用于绘制水平和竖直滑块.滑块用于指定在一定范围内的一个数值.在上面的例子中,使用了两个水平滑块来指定主音量和音效范围为0到1
Slider函数接受当前滑块值和滑块最小值和滑块最大值.上面的例子展示了如何使用水平滑块,竖直滑块使用与水平滑块同样的参数只是滑块是竖直绘制而不是水平绘制.
下面的例子展示了使用竖直滑块来创建一个音频均衡器
结果应类似下面的:
当使用水平滑块时,最小值在滑块的左边最大值在滑块的右边.当使用竖直滑块时,最小值在顶部,最大值在滑块底部.
您可能也想看看和它们类似于滑块,但具有不同的功能。
GUI.WINDOW和GUI.DRAGWINDOW
GUI类提供了在屏幕上绘制窗口的函数,窗口可以使用外部函数(除了OnGUI)来渲染窗口的内容.
如果在窗口的回调函数中使用GUI.DragWindow函数,那窗口将会是可拖动的.
下面的代码创建了一个简单而可拖动的窗口
DraggableWindow.js
如果在新场景中将脚本应用到GameObject上,你就会看到窗口,点击并拖动窗口标题你就可以在屏幕上把窗口拖来拖去.
在窗口中可以放置任意数量的控件.如果你想要Unity在窗口中自动布局控件(就像例子中一样)那你应该使用GUILayout.Window函数而不是GUI.Window函数.当使用GUILayout.Window函数时,unity会自动修改窗口的高度以适应内容.就像上面的例子展示的一样.
在这里展示的绝大数例子,我都是用GUI类来创建菜单.GUI类需要我们手动地在屏幕上放置空间,在某些情况下,手动摆放控件很有用,但如果你想要unity为你自动布局控件,那你需要使用GUILayout类.这个类提供了许多像GUI一样的功能,但不要求你指定控件的大小
GUILayout.beginHorizontal和guilayout.beginVertical
默认情况下,当使用GUILayout函数时所有的视图中的组件都会竖直排列.你可以使用guilayout.beginhorizontal和guilayout.endhorizontal静态函数使控件相邻排放.每出现一次guilayout.BeginVertical必须有对应的GUILayout.EndVertical与其对应,每出现一次GUILayout.BeginHorizontal则必须有对应的GUILayouyudHorizontal与其对应
下面的例子展示了如何使用竖直和水平布局来创建复杂的表格
UserForm.js
这段代码看上去挺复杂的.这里面有些东西如果你不熟悉脚本编写的话可能看起来不熟悉.需要强调的一点是我使用一个静态窗口(不可拖动)的来把控件据合起来.窗口需要一个绘制其内部结构的函数.为此我是用了UseForm函数.
用户表格开头使用竖直布局.因为当使用自动布局时竖直布局是默认的,所以显式的指定它是可有可无的.
之后每一个字段都是用水平布局创建,标签旁边跟着文本.标签被显式的使用GUILayout.Width()函数设置为80像素.我这样做是为了确保所有的文本都整洁的对齐.文本域扩展填充窗口的剩余部分.
在两个文本之后,添加了两个竖直布局的按钮.按钮将扩展填充区域其高度由按钮的内容决定.
不要忘了常使用GUILayout.EndVertical()或GUILayout.EndHorizontal()函数结果竖直或水平布局.
脚本UserForm.js将会产生如下结果:
你可能也想看看,和.所有的这些函数都可以被用于创建组(或者可以自动布局的区域),这些组或者区域可以用于保持控件在特定区域内聚合起来.
样式和皮肤
unity为所有的GUI控件提供了默认的外观.作为一个快速解决方案的话默认的样式足够用了,但你可能不想在你要面市的游戏中使用unity的默认GUI样式.
使用自定义的GUISkin你可以更改按钮,标签,滑块,和滚动条的外观.
GUISkin是一个套件(asset),你可以从主菜单中选择Assets&Create&GUISkin来创建它.
如果你在项目视图(project view)里选择了GUISkin,你可以为你可创建的多种控件编辑单独的样式设置.
要使用你自定义的皮肤将默认皮肤替换掉,在GUI脚本里面设置GUI.skin属性为你自定义的皮肤.将GUI.skin属性设置为null将还原回默认的GUISkin.
GUISkin只是一系列GUIStyle样式的集合.GUIStyle定义了一个控件所有可变状态的样式.一个控件有以下状态:
正常状态:控件的默认状态.鼠标既没有悬停到控件上控件也没有获得系统焦点.
悬停状态:鼠标当前悬停在控件上
注视状态:当前正选择控件,选中的控件将会接受键盘输入.这个状态对于按钮和可编辑文本控件.
活动状态:控件被点击,这个状态对于按钮,滑块和滚动条都是合法的.
GUIStyle可以在没有GUISkin的情况下使用以便改写控件的样式.要使用GUIStyle,简单的在脚本中创建一个GUIStyle类型的公开变量并在检视器(inspecot),当你想要为控件应用样式.简单把样式作为控件函数的最后一个参数数传进去就行.
作为练习,下载下面的Unity包并将其导入一个新的Unity工程中:
使用下面代码,创建一个名称为LevelSelect.js的脚本.
LevelSelect.js
你可能注意到这就是上面按钮例子里面的代码,但是现在我们要为这些按钮设置一套自定的皮肤.
在检视器(inspector)中,在Button Style属性中设置如下选项:
Normal.Background: roundedButton_Normal.psd
Normal.Text Color: (0, 0, 0, 255)
Hover.Background: roundedButton_Hover.psd
Hover.Text Color: (0, 0, 0, 255)
Active.Background: roundedButton_Active.psd
Active.Text Color: (80, 80, 255, 255)
Border.Left: 6
Border.Right: 6
Border.Top: 6
Border.Bottom: 6
Padding.Left: 6
Padding.Right: 6
Padding.Top: 12
Padding.Bottom: 6
Font: SHOWG
Alignment: Middle Center
你会得到类似于下面的展示的.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之Inspector视图中的get/set使用(四)
Unity3D研究院之Inspector视图中的get/set使用(四)
围观36079次
编辑日期: 字体:
get set 使用起来很方便,但是编辑时在Inspector视图中问题就来了,因为get/set的属性即使是public了,但是在Inspector视图中依然不显示。。谷歌一下估计就是下面这样的答案。
1234567891011
public int width {
return _width;
_width = value;
} } [SerializeField] private int _width;
如下图所示问题又来了,因为在编辑模式下修改Width的值,但是代码中的 set 压根就没执行。。
先看看[SerializeField]的含义,它用来序列化一个区域,通俗的来说[SerializeField]可以让private 的属性在Inspector视图中显示出来。。
那么上面的set没执行的原因就出来了,因为我们改的是private _width并不是 public width。由此可见此段代码在编辑模式下是毫无用处的。。
我偏偏就想在编辑时响应 set 的操作怎么办?我想做的是在set里面加一个自己写的方法。
TestInspector.cs放在Editor目录下
1234567891011121314151617
using UnityEngine;using UnityEditor;using System.Collections.Generic;&[CustomEditor(typeof(Test))]public class TestInspector : Editor {& Test model; public override void OnInspectorGUI(){
model=target as Test;
int width=EditorGUILayout.IntField("Width",model.width);
if(model.width!=width){
model.width=width;
base.DrawDefaultInspector(); }}
Test挂在任意游戏对象上。
1234567891011121314151617
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour { public int width {
return _width;
Debug.Log("set :" + value);
_width = value;
} } private int _width;}
如下图所示,在编辑模式下用鼠标修改width的值。 log输出了说明 get set 已经响应了。
感谢下面好友的留言,另外一种实现的方式,我试了一下也很好用。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 unity build settings 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信