UGUI已经beat21了。。直觉已经告诉我正式版马上就要来了。刚好今天有时间,我就抽空学习一下UGUI。以前都是搞NGUI,衷心希望UGUI的诞生可以彻底干掉NGUI(目前还不太现实)。今天主要研究的是搭建界面还有自适应屏幕相关的,这里记录下我的学习笔记欢迎大家一起讨论嘿嘿。
如下图所示,我们先看Canvas,Render Mode一共有三种模式。
1.Screen Space – overlay 此模式不需要UI摄像机,UI将永远出现在所有摄像机的最前面。我觉得overlay有问题,如果我想在UI前面放个东西就不行了,因为可能在UI前面放一个特效或者UI啥的。。
2.Screen Space- Camera 此模式是我决定采取的,它需要提供一个UICamera 。这样就和NGUI的原理很像了,如果我想在UI前面加特效我可以在创建一个摄像机深度大于这个UICamera就行了。
3.World Space 这个就是完全3D的UI,UGUI的例子大多都采用它,但是我觉得目前我还是用不到。
如下图所示,在看Canvas Scaler。UGUI在处理自适应这块不需要我们自己在写算法了。
UI Scale Mode :Scale With Screen Size 表示以宽度为标准缩放。。 因为我搭建界面的时候是960X640所以这里我写960X640。
Screen Match Mode 选择 Expand 这个就是UGUI自己自适应屏幕的选项了。
补充: Canvas Scaler 选择 Scale With Screen Size, Screen Match Mode 选择 Match Width Or Height,比例设为1,即只和高度进行适配;
如下图所示,看看我的层次视图
Main Camera 就是主摄像机,也就是透视摄像机,它的深度最小最先绘制。
Canvas就是画布了,下面挂的UICamera 和 UIForward摄像机。
UICamera 下面挂着所有的uGUI的UI控件,它的深度大于MainCamera。
UIForward 就是前面我们说的有些东西要在UICamera的前面显示。注意Camera的的size = 3.2 ,也就是960/640=3.2 。
接着在UICamera下面挂UI控件吧。。这个比较简单就不细说了。。
因为UI的自适应UGUI已经帮我们做了,那么我们要做的就是3DCamera的自适应。把下面这个脚本挂在Main Camera上即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using UnityEngine; using System.Collections; using UnityEngine.UI; public class CameraScale : MonoBehaviour { void Start () { int ManualWidth = 960; int ManualHeight = 640; int manualHeight; if (System.Convert.ToSingle(Screen.height) / Screen.width > System.Convert.ToSingle(ManualHeight) / ManualWidth) manualHeight = Mathf.RoundToInt(System.Convert.ToSingle(ManualWidth) / Screen.width * Screen.height); else manualHeight = ManualHeight; Camera camera = GetComponent<Camera>(); float scale =System.Convert.ToSingle(manualHeight / 640f); camera.fieldOfView*= scale; } } |
记得增加一个UIForward 的层, 这样如果想在UI的前面添加特效 直接把它的特效的Layer设置成UIForward即可。
最后,由于我也正在学习,如果有不对的地方欢迎大家在下面给我留言。谢谢啦,呼呼~~~
- 本文固定链接: https://www.xuanyusong.com/archives/3278
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
官方汽车的例子里面,如果CarTiltControls这个画布的渲染模式改为camera,Accelerator按钮的响应有点问题,如果是overlay模式就没问题。好奇怪啊
我没看过 这个例子。抱歉了。
大神,能抽空帮忙看下么,overlay改成camera就不行 了
为什么我的版本没有canvas scaler…
升级吧
这样设置后Slider用鼠标没法拖动了
原来是因为UICamera和UI界面在一个平面上,拉远点记好了……
如果特效既要在ui前面 也可以被ui挡住该如何做呢
UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九) http://www.xuanyusong.com/archives/3435
怎么让ugui的自适应按百分比而不是固定像素,就像NGUI那样。100 * 100: left = 10 top = 10 right = 10 bottom=10换算成 left = 0.1 top = 0.1 right = 0.1 bottom=0.1
为什么我的MainCamera看不到UICamera上的内容?
我都不知道我做了什么,这次又能看到了,UIForward 摄像机下添加了一个image,都设置了UIForward layer,为什么UIForward 摄像机看不到这个image?
canvas下 UIForward下 image,也就是说image是canvas的子物体,是不是只有UICamera才能看到,那为什么MainCamera也能看到呢,就这个UIForward 看不到,需要设置什么吗
想问一下,MOMO 现在的项目的UI 系统就是根据这套设置来解决UI 特效的问题吗
注意Camera的的size 为什么是 3.2 ,也就是960/640=1.5 啊?
960:640 = 3:2 : 改成.就是3.2了
orthographic下才有size 而已应该是6.4/2=3.2这么算的吧
为什么uGUI没有camera也可以显示呢,既然可以显示,你为什么还要加一个UICamera?
如果想在UI前面显示个别的,, 比如。。粒子特效。。。这样就要搞一个摄像机了。。
但是特效的变化,不会跟着scanvas的scale的变化而变化啊,这怎么弄啊,雨松大神
新版5.0beta 9,创建Cavas没有 Cavas Scaler组件了。奇怪
呃,看到下面的评论有人问到同样的问题。 不用解答这个了。
原来是放到Layout组件里面了,按屏幕高宽适应的是Reference Resolution,按物理尺寸的是Physical Resolution,另外还有一些legacy GUI里用到的布局工具
今天开始学新ui!
哈好。。
用 Screen Space- Camera 模式的是,如果动态添加 button 控件,位置会错。 Vector3 getPositionByIndex(int i) { int Width = (int)((float)Screen.width / (float)10); int Height = (int)((float)(Screen.height / 2) / (float)10); float x = i * Width Width / 2; return new Vector3(x, Height, 0); }请问动态添加控件要怎么做? 在Screen Space- Camera模式下。我在Screen Space – overlay下 是正常的
用 Screen Space- Camera 模式的是,如果动态添加 button 控件,位置会错。 Vector3 getPositionByIndex(int i) { int Width = (int)((float)Screen.width / (float)10); int Height = (int)((float)(Screen.height / 2) / (float)10); float x = i * Width + Width / 2; return new Vector3(x, Height, 0); }请问动态添加控件要怎么做? 在Screen Space- Camera模式下。我在Screen Space – overlay下 是正常的
UIForwardCamera的Depth应该要比UICamera大吧 但是我这里的显示是只要加了比UICamera大的camera UI就不显示了。请问momo你那边没问题的么
4.6想把UI控件定位在4个角上,要怎么设置?效果就是要实现NGUI的Anchor那样。
有anchor 的。。 而且比NGUI的还强大~~
5.0beta9好像没有Canvas Scaler,那要怎么做适配呢?
应该有类似的, 5.0我还没看到。
原来改名字了。。。改为“Reference Resolution”。。。
这么做是不是在CANVAS节点下的所有LABEL,SPRITE都会按照屏幕比例缩放?如果有个方案需求是背景随屏幕比例缩放,而里面的按钮,文本,滑动框按照原始比例不变,是不是应该建2个CANVAS?做第一个CANVAS根据屏幕缩放,第二个CANVAS节点下的物体用锚点对齐的方式做位置自适应?
锚点做对齐方式只有内种简单的界面可以 ,比如战斗界面可以挂在四个角上。。 真正的UI界面比较复杂的 已经布置好的界面 就不能随意拉伸了,只能整体像一个方向对齐。。
Canvas对象上加Reference Resolution组件实现自适应缩放,不是更好吗?雨松前辈您说呢?请指点file:///Applications/Unity 11.28.40/Unity.app/Contents/Documentation/html/en/Manual/script-ReferenceResolution.html
沙发 已阅
Canvas对象上加Reference Resolution组件实现自适应缩放,不是更好吗?雨松前辈您说呢?请指点file:///Applications/Unity%2011.28.40/Unity.app/Contents/Documentation/html/en/Manual/script-ReferenceResolution.html
一般是这种方法
如果界面简单我觉得缩放肯定是可以的, 但是界面复杂,缩放可能就把原有的做变形了。。