求助,UGUI,Screen Space-Camera模式下camthe reracs Cullingmask问题

UGUI中的Canvas、Camera和Canvas Scaler - 简书
UGUI中的Canvas、Camera和Canvas Scaler
投影空间和屏幕空间
先不说UI,如果是一个普通渲染流程,一个Cube普通地被渲染。
800X600的屏幕中,右边的Cube和中间的Image大小相仿。(可能由于网页显示问题导致本图显示尺寸变小。请自行脑补成其真实800x600大小,起码比下图248X186大好多)
248X186的屏幕中,发现正方体已变小,但Image却没变
如果屏幕在现实中变小了,这个Cube在现实中也会变小。具体地说,屏幕变小时,Cube在投影空间中是恒定大小的。但透视空间转换到屏幕空间时,一般都是使用默认的GPU流程:直接把投影空间投影面的四个角直接映射到屏幕空间的四个角。因为屏幕变小了,屏幕空间就变小了,所以这个Cube也就变小了。
总之,屏幕变小不影响投影空间,但会让屏幕空间变小。
注,文章以下部分如不特殊注明,都认为Canvas.RenderMode是ScreenSpace,而并非WorldSpace。
Canvas Scaler
Canvas Scaler的各种模式最终都是设置了Canvas.scaleFactor(还有Canvas.referencePixelsPerUnit,但并非本文重点)。Canvas.scaleFactor会影响Canvas的RectTransform的ScaleXYZ。
Canvas.RenderMode:ScreenSpace - Overlay
当是ScreenOverlay的情况,因为根本没有经过投影空间,而是直接在屏幕空间绘制,所以可以更加简单地讨论问题。
因为在屏幕空间的坐标直接绘制像素,所以Canvas的RectTransform的width*scaleX必须等于屏幕的宽、RectTransform的height*scaleY必须等于屏幕的高。其中,scaleXY事实上是可以通过Canvas.scaleFactor给脚本设置的,也就是说:
Canvas的核心功能是,自动根据屏幕设备的分辨率、当前的scaleXY,算出正确的width和height,确保和屏幕匹配。
Canvas的核心功能是自动根据屏幕设备的分辨率、当前的scaleXY,算出正确的width和height,确保和屏幕匹配。
注,Overlay情况下,Scene View是世界空间的、Canvas是屏幕空间的,两者处于不同空间,它们的大小比较也就没有可比性了。但也总得把Canvas在SceneView显示出来对吧,所以Unity这里的Editor实现是,屏幕空间1像素等于世界空间1米地把Canvas在SceneView显示出来。
CanvasScaler.ScaleMode: ConstantPixelSize
以图中Scale Factor=1为例,ConstantPixelSize的作用是直接设置scaleXYZ为1。所以,Canvas的width和height总是等于屏幕大小(244x183)。所以当设备分辨率变小时,scaleXYZ总是1,UI元素的大小并不改变,但Canvas的width和height变小了,所以UI元素占比Canvas的比例也随之变大。结果:屏幕分辨率变小,UI元素在设备的实际像素数不变,也就大小不变。
CanvasScaler.ScaleMode: ScaleWithScreenSize
ScreenMatchMode.MatchWidthOrHeight
以图中Canvas的Reference Resolution等于800X600比例为4:3、屏幕恰好是同比例4:3的244X183为例,scaleXYZ总是等于屏幕分辨率/参考分辨率=0.305,所以Canvas的width和height总是800X600。所以当屏幕分辨率变小于800X600时,Canvas的width/height不变。Canvas的scaleXYZ变小,Canvas本身和UI元素的全局scaleXYZ都变小,但UI元素占比Canvas的比例不变。结果:屏幕分辨率变小,UI元素在设备的比例不变,所以UI的实际像素数变小。事实上,CanvasScaler是ScaleWithScreenSize的作用就是:
根据参考分辨率和当前设备分辨率,得出一个“合适”的scaleFactor。至于设备分辨率和参考分辨率比例不同,这个问题交由Canvas自动设置width/height来解决。
当设备分辨率比参考分辨率大时,scaleFactor需要“合适”的大,当设备分辨率比参考分辨率小时,scaleFactor需要“合适”地小。这个“合适”,在内部实现的代码是:
float logWidth = Mathf.Log(screenSize.x / m_ReferenceResolution.x, kLogBase);
float logHeight = Mathf.Log(screenSize.y / m_ReferenceResolution.y, kLogBase);
float logWeightedAverage = Mathf.Lerp(logWidth, logHeight, m_MatchWidthOrHeight);
scaleFactor = Mathf.Pow(kLogBase, logWeightedAverage);
ScreenMatchMode.Expand
scaleFactor = Mathf.Min(screenSize.x / m_ReferenceResolution.x, screenSize.y / m_ReferenceResolution.y);
scaleFactor尽可能小,可知,结果是尽量把UI在设备屏幕给放大
ScreenMatchMode.Shrink
scaleFactor = Mathf.Max(screenSize.x / m_ReferenceResolution.x, screenSize.y / m_ReferenceResolution.y);
scaleFactor尽可能大,可知,结果是尽量把UI在设备屏幕给缩小
CanvasScaler.ScaleMode: ConstantPhysicalSize
根据屏幕的PPI信息和ConstantPhysicalSize本身的配置信息,得出一个“合适”的scaleFactor,以达到UI在不同PPI设备上的最终大小都是一致的。
Canvas.RenderMode:ScreenSpace - Camera
由于使用了Camera,所以此时的Canvas和Scene View里的任意GameObject一样,都是处于世界空间了。所以对于ScreenSpace - Camera的Canvas来说,关键是如何把处于世界空间中的Canvas能够占满投影空间的投影平面。
然而,由于在世界坐标系中任意GameObject的默认scaleXYZ都是1,Canvas也不例外。所以,需要根据Camera的设置、Canvas的plane distance设置,算出scaleFactorCamera出来。
正交(Orthographic)Camera
正交Camera的可调参数是Size。Size的定义为视体的投影平面高的1/2。 比如Camera的Size是300,即投影平面高为600。投影平面的宽根据平面的高和屏幕比例得出。所以Canvas必须和这个投影平面一样大小(且位置重合)。此时,有两种方法和投影平面大小一样:
调整Canvas的width/height
调整Canvas的ScaleXY
由于第1种方法会导致切换Overlay和Camera的方式时,UI的表现不一致,所以Unity的实现是采取了第2种方法。即:
当Canvas是Screen Space - Overlay时,Canvas.RectTransform.scaleXYZ = Canvas.scaleFactor当Canvas是Screen Space - Camera时,Canvas.RectTransform.scaleXYZ = Canvas.scaleFactor * scaleFactorCamera
所以,在这种情况下,
Canvas.height==Screen.height
Canvas.height * scaleFactor * scaleFactorCamera = Camera.size * 2,
所以scaleFactorCamera = Camera.size * 2 / Canvas.height / scaleFactor = Camera.size * 2 / Screen.height / scaleFactor
透视(Perspective)Camera
透视Camera的可调参数为fov。同时Canvas的plane distance也认为是参数之一。
Canvas.height == Screen.height
Canvas.height * scaleFactor * scaleFactorCamera = 2 * Canvas.planeDistance * tan(Camera.fov/2)
所以scaleFactorCamera = 2 * Canvas.planeDistance * tan(Camera.fov/2) / Screen.height / scaleFactor
CanvasScaler
至此,已求出不同Camera模式的scaleFactorCamera。
在ScreenSpace - Camera的情况下,不管CanvasScaler的模式再怎么变,都是在上面Overlay的情况下的CanvasScaler的讨论基础上,再乘多一个scaleFactorCamera即可。
WorldSpace
Canvas的width和height、scaleXYZ都可以任意设置。Canvas不再自动根据屏幕设备的分辨率、当前的scaleXY,算出正确的width和height。此时的CanvasScaler在此模式下几乎形同虚设。只是拿来设置Canvas.referencePixelsPerUnit
live learn and loveUnity的优化系列4 - 最好使用Canvas Overlay代替Screen Space Camera - CSDN博客
Unity的优化系列4 - 最好使用Canvas Overlay代替Screen Space Camera
孙广东& Unity提供了用于创建 UI 的画布。画布上有渲染模式如下&︰ 屏幕空间相机 Screen Space Camera屏幕空间覆盖 Screen Space Overlay世界空间 World Space&&&&&&&& 让我们了解哪种模式是更好的,让我们以一个非常简单的示例测试这三项。1&& 屏幕空间相机 让我们创建一个Unity项目︰ 脚本 ︰ MoveCamera.cs 在你的场景建立一个Canvas。&设置渲染模式为:& Screen Space Camera将Main Camera,拖到render camera 选项(其他相机也可以)。 用sprite或图像中作为一个背景。 才Canvas内创建尽可能多的panels 和 UI的Texts 和Images 添加到Camera上的脚本。using UnityE
using System.C
public class MoveCamera : MonoBehaviour
private float velocity = 0.0f;
private float smoothTime = 0.3f;
private bool moveCamera =
public Vector3 initialP
public Vector3 targetP
public float lerpS
public float initialZ;
public float targetZ;
void Update ()
if (Input.GetMouseButtonDown (0)) {
initialPosition = transform.
targetPosition = new Vector3 (transform.position.x + Random.Range (-5, 5), transform.position.y +
Random.Range (-5, 5), transform.position.z);
initialZ = transform.eulerAngles.z;
targetZ = initialZ + Random.Range (-50, 50);
moveCamera =
lerpSpeed = 0;
if (moveCamera) {
CameraMovementMethod ();
private void CameraMovementMethod ()
lerpSpeed = Mathf.SmoothDamp (lerpSpeed, 1.0f, ref velocity, smoothTime);
cam.transform.position = Vector3.Lerp (initialPosition, targetPosition, lerpSpeed);
cam.transform.eulerAngles = new Vector3 (0, 0, Mathf.LerpAngle (initialZ, targetZ, lerpSpeed));
Build部署到 Android 手机、 创建debugging build ,允许自动连接到profiler&在手机上运行该项目的,然后在处理随便点击屏幕在Unity编辑器中profiler上搜索 &canvas&,你会看到。:&正如你从图片中可以看到,有很多的画布的调用Calls,特别注意到CanvasRender.OnTransformChanged 每当相机移动,大约每个帧上有 50 次调用。 注意 &&调用次数是依赖于Canvas上的 使用的UI 元素个数。 我们可以更好地理解这与下面 gif: 你可以看到上面,在游戏中移动Canvas相关的摄像机,因此每个UI 元素在画布上不得不由Unity引擎重新定位。因此越多的UI元素,就需要更多的处理。那么,解决方案是什么?2&& 屏幕空间覆盖在刚刚的测试项目中我们把 Canvas的渲染模式改为 Screen Space Overlay ,并重复之前的步骤,同样想在观察Profiler。大约我们优化它约 90%正如你可以看到以上,UI 画布保持原样在Unity空间,摄像机运动的不影响 UI Canvas根本。画布保持静态。因此,不需要任何重新定位或所需的处理。实现了高的优化。3& &世界空间在世界空间模式,画布渲染手动更改为 World Space,测试结果和第一种一样。结论 ︰考虑screen space camera 类型的呈现进行大量的调用,所以非常推荐使用Overlay 绘制画布,使你的游戏在移动设备上更顺畅。(当然了这种只是限于纯UI),但是另外两种模式是有其特殊用处的!ForEach 循环优化 这是个老生常谈的话题, 主要还是产生GC的问题:public&class&ForEachLoopTest&:&MonoBehaviour
&&&&#region&PUBLIC_DECLARATIONS
&&&&public&List&GameObject&&emptyGameO
&&&&#endregion
&&&&#region&UNITY_CALLBACKS
&&&&void&Update()
&&&&&&&&if&(Input.GetKey(KeyCode.Space))
&&&&&&&&&&&&UpdateTextValue();
&&&&#endregion
&&&&#region&PUBLIC_METHODS
&&&&public&void&UpdateTextValue()
&&&&&&&&foreach&(var&item&in&emptyGameObjects)
&&&&&&&&&&&&//&PROCESS&ITEMS&IN&LIST
//&&&&&&&&for&(int&i&=&0;&i&&&emptyGameObjects .C&i++)
//&&&&&&&&{
&&&&&&&&//&PROCESS&ITEMS&IN&LIST
//&&&&&&&&}
&&&&#endregion
}按下空格键 ,当是10~30大小的循环时& 会看到如上图的 效果: 每帧产生 40B 的GCforeach (SomeType sin someList)&&& s.DoSomething();现在编译, 编译器预处理的代码:using (SomeType.Enumerator enumerator = this.someList.GetEnumerator())
while (enumerator.MoveNext())
SomeType s = (SomeType)enumerator.C
s.DoSomething();
在每次迭代时,会创建一个 enumerator对象。
本文已收录于以下专栏:
相关文章推荐
一、DrawCall优化
三张图对比发现场景中UI的数目一样,布局有变化,导致了其DrawCall数目不一样。当出现重叠时,会影响空间拓扑关系,从而影响了Unity对DrawCall的...
在使用UGUI的项目中经常遇到诸如0x4A66 (Unity) Unity::GameObject::IsActive
0xB2E73 (Unity) ...
其实我自己也没理解。。。随便写写。
================================================================================...
把之前做的UI界面修改成 Screen Space-Camera模式之后,发现很多 Clone 出来的按钮都变成了模糊一片,检查发现按钮的 Scale 都变成了 64 !
~渲染模式共3种:
1、Screen Space-Overlay
·不需要UI摄像机,UI 永远在前面
·同一个画布,UI顺序,子物体顺序在下面,后渲染,显示在上层
·不同画布之间顺序,Sort Or...
Unity5.3官方VR教程重磅登场-系列4
VR中的用户界面
在设计VR应用的用户界面时要考虑很多因素,而这些因素对于传统应用或游戏的界面设计可能都不是事儿。下面我们会看看作为一个...
Canvas Component 是UI布局和渲染的抽象空間,所有的UI都必須在此元素之下(子物件),簡單來說 Canvas 就是渲染 UI 的組件
Render Mode
本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以...
这部分spec的内容没有全看懂,但是根据FSL的代码能知道这其中的sequence,下面就结合着FSL的代码来描述下video overlay过程的sequence。
首先介绍一下video o...
Screen Space Ambient Occlusion (SSAO) approximates
Ambient Occlusion in realtime, as an image post-...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)求助,UGUI,Screen Space-Camera模式下camrera Cullingmask问题【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:77,832贴子:
求助,UGUI,Screen Space-Camera模式下camrera Cullingmask问题收藏
如题:为什么不同相机设置不同物体的cullingmask,物体还会显示????1.Cavas选择的是Screen Space-Camera模式2.canvas的RenderCamera的camrea是UICamera,它的cullingmask是StartUI3.canvas下的gameobject 的layer是UI
达内unity3d培训全程&实战教学&,unity3d金牌讲师授课.免费unity3d课程试听中!到达内unity3d学院学习unity3d,只需4个月速成unity3d游戏工程师.
。。。。。。。晚上这么少人,自己顶
楼主这个问题解决了吗?
搞定了吗?版主
登录百度帐号推荐应用Unity UGUI——Canvas绘制模式比较 - CSDN博客
Unity UGUI——Canvas绘制模式比较
三种绘制模式:Screen Space - Overlay、Screen Space - Camera和World Space
本文已收录于以下专栏:
相关文章推荐
大家好,我是孙广东。   转载请注明出处:http://write.blog.csdn.net/postedit/
更全的内容请看我的游戏蛮牛地址:http://www.unityma...
写在前面,是时候规划,从大到小,系统分块的写博客主要记录学习的知识点,方便以后回头看,和巩固自己的知识体系, 现在从UGUI学起,下面主要说下Canvas画布和三种渲染模式的区别。
Simple、Sliced、Tiled、Filled、Set Native Size
基本属性介绍
基础属性:Width、Height、Pivot图示
Texture、Color、Material、UV Rect
Unity4.6推出的新UI系统
优点:灵活、快速、可视化、效率高效果好、易于使用和扩展
1.      在窗口创建之前修改窗口外观: The framework calls PreCreateWindow just prior to creating the window. By mod...
Source Image、Color、Material
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)UGUI 之 Canvas布局层级关系(一) - CSDN博客
UGUI 之 Canvas布局层级关系(一)
一、用过NGUI的人们都知道,各种NGUI的sprite之间是可以有dept来进行分层管理,以便处理层级间的关系,而在unity4.6开始的UGUI中,这是通过Canvas来设置深度关系的
我在开发中设计了三个Canvas,来处理不同的UI消息相应类型
StaticCanvas
TouchOrMouseCanvas
ButtonCanvas
1、StaticCanvas ,其Sort Order我设置为0,我用来处理一些不用来进行触屏和按钮(这里针对的都是手机)相应的UI放置,如角色的血量,魔法值,伤血的HUDTXT,敌人头顶的血量提示等
2、TouchOrMouseCanvas,其Sort Order我设置为1,是为了进行触屏响应消息而单独设置的,如通过触屏来改变摄像机的旋转,在TouchOrMouseCanvas目录下添加一个Panel,在加一个Event Triger组件,设置其Enent type为Drag,再给它一个具体的消息响应函数技能实现触屏控制相机的旋转。
3、ButtonCanvas,其Sort Order我设置为2,是是用来处理各种按钮消息响应的,各种按钮的UI都放在这
这些Canvas的Render Mode必须一样,其Sort Order才能起作用。如下图所示
二、UGUi的组件除了Canvas之外是没有Inspector层级设置概念的,同一根目录下的组件,是以根目录下所在Hierarchy关系决定的,谁在下,在game和scene视图中,谁就遮挡住谁。
三、另外设置一个Camera来单独渲染UI的layer层时的注意事项
如下图摄像机设置
然后Canvas的Render Mode要设置为Screen Space-Camera
将自己设置好的摄像机拖拽到Render Camera中
而且Canvas层的Layer要跟自己设置好的摄像机的Culling mask一样,否则game视野中会看不到
Plane Distance要大于1的数(0到1之间也行,但是得自己调节才能在game视图中看到),否则game视图看不到
上面图UI摄像机的Culling mask为UIlayer层
下面是一个相应的Canvas截图
本文已收录于以下专栏:
相关文章推荐
UGUI在Screen Space - Overlay渲染模式下,由于不依赖摄像机渲染,使得其无法通过修改Z轴的方式修改物体间的层级关系,以下是解决方案:
我创建了一个空的工程,然后创建了一个I...
之前一直用NGUI开发界面,但看到现在的unity的新版本的UGUI也不错,这几天专门学习了一下,用过NGUI的人都知道NGUI的渲染顺序或者层级关系是Deapth(深度)决定,而UGUI的界面是用C...
http://blog.csdn.net/kingsea168/article/details/
之前一直用NGUI开发界面,但看到现在的unity的新版本的UGUI也不错,这几天...
前言在UI上显示3D的特效,要考虑两个问题:
1、特效的位置自适应与UGUI自适应一致,否则在16:9下把特效调好位置后,切成16:10后,位置对应不上
2、特效显示层次最好能夹在UI中间UGUI...
为了做出更酷炫的的UI效果,通常要在UI中加入粒子效果。但与纯2D的UI动画或Spine不同,粒子在场景中制作,会存在与UI的穿插问题。本文探讨如何更改特效或UI的 SortingOrder 避免特效...
一、用过NGUI的人们都知道,各种NGUI的sprite之间是可以有dept来进行分层管理,以便处理层级间的关系,而在unity4.6开始的UGUI中,这是通过Canvas来设置深度关系的
目录1、介绍两大UI插件NGUI和UGUI
2、unity渲染顺序控制方式
3、NGUI的控制
4、UGUI的控制
5、模型深度的控制
6、粒子特效深度控制
7、NGUI与模型和粒子特效穿...
这几天在做游戏的WindowManager,一开始只是想到打开单一窗口和设置窗口并存的问题,一切运行良好。
但是昨天加了一个等待窗口(沙漏加菊花)之后就出现了问题。
直接看代码简单明了:
      public class UIDepth : MonoBehaviour
public bool isUI = t...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 rera奥特莱斯 的文章

 

随机推荐