用unity ngui里的NGUI做界面怎么让它不缩放

NGUI处理特效显示和面板显示夹层问题
NGUI相当不错,但是有一点比较纠结的就是面板上显示特效的时候,你会发现要么盖住特效,要么面板永远无法盖住特效。很多人说改renderqueue,然后就能显示了,然后下面一堆楼主给力。。。。呵呵。
&& & &
先从原理上解释吧,NGUI是通过调整renderqueue来显示不同层,然后它的shader是不写入z值的,然后特效刚好也是不写入z值的,所以你
要控制特效和UI的关系,确实只能通过renderqueue.但是如果你只是单纯让renderqueue非常大,那么特效就会永远在面板之上。
&& & &如果你想要两个面板夹住特效,那么就需要看NGUI源代码了。
&& & &这里希望大家自己去看一下,我直接贴上修改方案:
if (this.widgetInFrontOfMe != null && this.widgetInFrontOfMe.drawCall != null) {
&& & & & & & int rq = this.widgetInFrontOfMe.drawCall.renderQueue + 1;
&& & & & & & Debug.Log(rq);
&& & & & & & foreach (Material material in m_renderer.materials) {
&& & & & & & & & if(material.renderQueue != rq)
&& & & & & & & & {
&& & & & & & & & & & material.renderQueue =
&& & & & & & & & }
&& & & & & & }
&& & & & }
首先这段代码就是将特效的renderqueu调整成你想要放置的物体的前面。然后你如果在Update()或者LateUpdate()中执行这
段代码,你会发现它工作的不错,就是偶尔会闪一下,这是因为这段代码先更新了,然后NGUI才更新,所以导致滞后一帧。对于我这种完美主义者来说,这是不
能接受的。所以我修改了UIPanel的源代码,然里面全部更新完毕后,再去调用这个函数。哈哈,一切都非常完美。
完整代码如下:using UnityE
&using System.Collections.G
&
&public class UISortBehavior : MonoBehaviour
&{
&& & public UIP
&& & public UIWidget widgetInFrontOfMe;
&& & public bool AddQueue=
&& &
&& & [System.NonSerialized]
&& & Renderer m_
&& &
&& & void Awake() {
&& & & & m_renderer = this.
&& & }
&
&& & public void initPanel(UIPanel p)
&& & {
&& & & & panel =
&& & }
&
&& & void Start()
&& & {
&& & & & panel.addUISort (this);
&& & }
&
&& & public void UpdateSortUI()
&& & {
&& & & & if (this.widgetInFrontOfMe != null && this.widgetInFrontOfMe.drawCall != null) {
&& & & & & & int rq = this.widgetInFrontOfMe.drawCall.renderQueue + 1;
&& & & & & & if(!AddQueue)
&& & & & & & & & rq -= 2;
&& & & & & & foreach (Material material in m_renderer.materials) {
&& & & & & & & & if(material.renderQueue != rq)
&& & & & & & & & {
&& & & & & & & & & & material.renderQueue =
&& & & & & & & & }
&& & & & & & }
&& & & & }
&& & }
&
&& & void OnDestroy()
&& & {
&& & & & if(panel != null)
&& & & & & & panel.removeUISort (this);
&& & }
&
}
当然UIPanel中也要修改:
void LateUpdate ()
&& & {
&& & & & if (mUpdateFrame != Time.frameCount)
&& & & & {
&& & & & & & mUpdateFrame = Time.frameC
&
&& & & & & & // Update each panel in order
&& & & & & & for (int i = 0; i & list. ++i)
&& & & & & & & & list.UpdateSelf();
&
&& & & & & & int rq = 3000;
&
&& & & & & & // Update all draw calls, making them draw in the right order
&& & & & & & for (int i = 0; i & list. ++i)
&& & & & & & {
&& & & & & & & & UIPanel p = list.buffer;
&
&& & & & & & & & if (p.renderQueue == RenderQueue.Automatic)
&& & & & & & & & {
&& & & & & & & & & & p.startingRenderQueue =
&& & & & & & & & & & p.UpdateDrawCalls();
&& & & & & & & & & & //rq += p.drawCalls.
&& & & & & & & & & & rq += p.drawCalls.size * 2;
&& & & & & & & & }
&& & & & & & & & else if (p.renderQueue == RenderQueue.StartAt)
&& & & & & & & & {
&& & & & & & & & & & p.UpdateDrawCalls();
&& & & & & & & & & & if (p.drawCalls.size != 0)
&& & & & & & & & & & & & rq = Mathf.Max(rq, p.startingRenderQueue + p.drawCalls.size * 2);
&& & & & & & & & & & & & //rq = Mathf.Max(rq, p.startingRenderQueue + p.drawCalls.size);
&& & & & & & & & }
&& & & & & & & & else // Explicit
&& & & & & & & & {
&& & & & & & & & & & p.UpdateDrawCalls();
&& & & & & & & & & & if (p.drawCalls.size != 0)
&& & & & & & & & & & & & rq = Mathf.Max(rq, p.startingRenderQueue + 2);
&& & & & & & & & & & & & //rq = Mathf.Max(rq, p.startingRenderQueue + 1);
&& & & & & & & & }
&& & & & & & & & p.updateUISort();
&& & & & & & }
&
&
&& & & & }
&& & }
&
List&UISortBehavior& container = new List&UISortBehavior&();
&
&& & public void addUISort(UISortBehavior uiSort)
&& & {
&& & & & if(container.Contains(uiSort))
&& & & & {
&& & & & & &
&& & & & }
&& & & & container.Add (uiSort);
&& & }
&
&& & public void removeUISort(UISortBehavior uiSort)
&& & {
&& & & & container.Remove (uiSort);
&& & }
&
&& & public void updateUISort()
&& & {
&& & & & for(int i = 0; i & container.C i++)
&& & & & {
&& & & & & & container.UpdateSortUI();
&& & & & }
&& & }
void UpdateDrawCalls ()
&& & {
&& & & & Transform trans = cachedT
&& & & & bool isUI = usedForUI;
&
&& & & & if (clipping != UIDrawCall.Clipping.None)
&& & & & {
&& & & & & & drawCallClipRange = finalClipR
&& & & & & & drawCallClipRange.z *= 0.5f;
&& & & & & & drawCallClipRange.w *= 0.5f;
&& & & & }
&& & & & else drawCallClipRange = Vector4.
&
&& & & & // Legacy functionality
&& & & & if (drawCallClipRange.z == 0f) drawCallClipRange.z = Screen.width * 0.5f;
&& & & & if (drawCallClipRange.w == 0f) drawCallClipRange.w = Screen.height * 0.5f;
&
&& & & & // DirectX 9 half-pixel offset
&& & & & if (halfPixelOffset)
&& & & & {
&& & & & & & drawCallClipRange.x -= 0.5f;
&& & & & & & drawCallClipRange.y += 0.5f;
&& & & & }
&
&& & & & Vector3
&
&& & & & // We want the position to always be on even pixels so that the
&& & & & // panel's contents always appear pixel-perfect.
&& & & & if (isUI)
&& & & & {
&& & & & & & Transform parent = cachedTransform.
&& & & & & & pos = cachedTransform.localP
&
&& & & & & & if (parent != null)
&& & & & & & {
&& & & & & & & & float x = Mathf.Round(pos.x);
&& & & & & & & & float y = Mathf.Round(pos.y);
&
&& & & & & & & & drawCallClipRange.x += pos.x -
&& & & & & & & & drawCallClipRange.y += pos.y -
&
&& & & & & & & & pos.x =
&& & & & & & & & pos.y =
&& & & & & & & & pos = parent.TransformPoint(pos);
&& & & & & & }
&& & & & & & pos += drawCallO
&& & & & }
&& & & & else pos = trans.
&
&& & & & Quaternion rot = trans.
&& & & & Vector3 scale = trans.lossyS
&
&& & & & for (int i = 0; i & drawCalls. ++i)
&& & & & {
&& & & & & & UIDrawCall dc = drawCalls.buffer;
&
&& & & & & & Transform t = dc.cachedT
&& & & & & & t.position =
&& & & & & & t.rotation =
&& & & & & & t.localScale =
&
&& & & & & & //dc.renderQueue = (renderQueue == RenderQueue.Explicit) ? startingRenderQueue : startingRenderQueue +
&& & & & & & dc.renderQueue = (renderQueue == RenderQueue.Explicit) ? startingRenderQueue : startingRenderQueue + i * 2;
&& & & & & & dc.alwaysOnScreen = alwaysOnScreen &&
&& & & & & & & & (mClipping == UIDrawCall.Clipping.None || mClipping == UIDrawCall.Clipping.ConstrainButDontClip);
&#if !UNITY_3_5 && !UNITY_4_0 && !UNITY_4_1 && !UNITY_4_2
&& & & & & & dc.sortingOrder = mSortingO
&#endif
&& & & & }
&& & }
要评论请先&或者&
擦 排版为啥变成了这样, 大家将就一下或者去我的博客看
你可以简单的多搞几个Camera来设置你想要的效果。代价仅是多几个DP。
:你可以简单的多搞几个Camera来设置你想要的效果。代价仅是多几个DP。 呵呵,你做过项目么原创文章如需转载请注明:转载自 &QQ群:【<span style="color: #192】本文链接地址:
&1.Anchor里面的UIAnchor调整的合适的位置,UIAnchor中的Side起到锚点的作用,各控件大小建议直接调整各控件自身。
(如要调整Button大小,直接调整它的子级Background中Transform的Scale,再根据Background的大小调整Button的BoxCollider碰撞)
2.将Camera的Size调节到默认屏幕大小。比如UI是以分辨率制作的,那么就将调整到1024。
(默认是1,修改后UI会消失,不用管,继续下一步)
3.在Panel上面添加一个UIStretch组件,Style选择&BasedOnWidth&完成之后你可以看到绑定UIStretch组件的Panel的Scale被修改到了当前屏幕的X方向分辨率大小。
(UIStretch组件在菜单栏 Component --& NGUI --& UI --& &Stretch)
4.现在运行看看,当前Panel中的所有控件(包括子Panel)已自适应像素大小。
本文参考自:
阅读(...) 评论()查看: 9642|回复: 64
通过Unity制作的游戏UI,运用了NGUI和UGUI
签到天数: 64 天[LV.6]常住居民II
╱人????人╲定下契约
才可以下载或查看,没有帐号?
& & 本人新到技术宅社区,觉得灰常棒,大家都很热情,但是可能我还不熟吧,没找到关于Unity的地方,只好放到水里好了;
& & 阿咧,以下是我们游戏工作室开发的其中一个游戏项目,当然咯,都是大一,没啥技术只能简单的做个射击游戏咯,下面的图都我参与设计的UI界面,开头和结尾的界面是使用UGI设计的,中间运行时是使用的NGUI设计的,主要是还是没怎么学会UGUI ;
& & 唔,其实吧,还是希望能有大神带带,毕竟UI设计除了托控件最重要的还是要有自己的编程思想。
& & 希望有会UI的或者有兴趣的可以一起交流嘛,额~还有就是那啥,Unity在哪讨论啊,本站太大了,转不过来0.0...
10.jpg (168.7 KB, 下载次数: 0)
游戏运行UI界面
19:10 上传
9.jpg (168.95 KB, 下载次数: 0)
游戏运行UI界面
19:08 上传
8.jpg (168.1 KB, 下载次数: 0)
游戏运行UI界面
19:08 上传
6.jpg (181.27 KB, 下载次数: 0)
游戏结束UI界面
19:08 上传
7.jpg (154.36 KB, 下载次数: 0)
游戏开始UI界面
19:08 上传
大神触( ̄︶ ̄)y: 5 大一的团队!!!!!&
很好很强大
Σ( ° △ °|||)︴ 碉堡了
Σ( ° △ °|||)︴ 碉堡了
签到天数: 64 天[LV.6]常住居民II
咳,那啥,第一次发这种交流的帖子...不喜勿喷,当然,有更好的指导最好啦
签到天数: 254 天[LV.8]以坛为家I
楼主又见你了,话说这是united3d么,看起好高大上,看来你可以在技术区混得风声水起呀,推荐你个网站,你可以去那里深造哟:,我只能帮你到这里了,以后也请你多多关照!
签到天数: 64 天[LV.6]常住居民II
楼主又见你了,话说这是united3d么,看起好高大上,看来你可以在技术区混得风声水起呀,推荐你个网站,你可 ...
啊啊,多谢,O(∩_∩)O~~,请多多指教,纠正一下,这个叫Unity 3D哦~
签到天数: 254 天[LV.8]以坛为家I
听说过,英语渣,请见谅
签到天数: 64 天[LV.6]常住居民II
听说过,英语渣,请见谅
O(∩_∩)O哈哈~,安啦,我也只会一丁点术语
签到天数: 324 天[LV.8]以坛为家I
模型也是自己做的吗!!!!
签到天数: 324 天[LV.8]以坛为家I
unity3d毕竟是方向性强的东西,所以还没有专门的板块,如果讨论的人多了,或许可以开辟
签到天数: 15 天[LV.4]偶尔看看III
我们公司也是搞Unity的,加油!
签到天数: 1644 天[LV.Master]伴坛终老
本帖最后由 ID:L1 于
07:42 编辑
讨论什么啊。。求作教程。。
签到天数: 64 天[LV.6]常住居民II
模型也是自己做的吗!!!!
我们的美工也是大一的,还不会太强的建模,是网上的素材,(*^__^*) 嘻嘻……
签到天数: 64 天[LV.6]常住居民II
unity3d毕竟是方向性强的东西,所以还没有专门的板块,如果讨论的人多了,或许可以开辟 ...
哦哦,现在才发现原来是版主大人驾到,希望讨论的人多的话能开辟,这只是个游戏引擎
签到天数: 64 天[LV.6]常住居民II
我们公司也是搞Unity的,加油!
好啊好啊,你们公司对于UI 有什么要求吗,想借鉴下未来的发展
签到天数: 64 天[LV.6]常住居民II
讨论什么啊。。求作教程。。
Untiy,一款游戏引擎,教程的话3楼已发了一个,你也可以去 泰课 看看,能帮的不多,不好意思
签到天数: 15 天[LV.4]偶尔看看III
好啊好啊,你们公司对于UI 有什么要求吗,想借鉴下未来的发展
我们公司第一款游戏还有一两个月才能上市,对UI的要求主要是会NGUI,现在大部分公司都是这个要求,如果连UGUI也会的话更好。
Hello Hacker
哎哟,不错哦!基于Unity中的NGUI插件,通用的UI如何设计?
招聘信息:
整理自知乎,文/以我的项目经历来说,要保证通用性必须分清需求是框架需要还是项目需要。举一个例子,所有的项目都需要一个弹窗提示的接口,但是不同项目弹窗都不一样,当时做的时候我没有想好怎么分离,那就放到项目类库里,保证框架不受影响,以后再重构。下面根据题主提的要点针对性说下方案(以NGUI框架为基础,UGUI还在研究中):UI和场景中物体的交互如何控制目前遇到的场景中交互有几种:类似血条的显示:通过摄像机转换坐标的方法转换为UI坐标来同步血条位置。对点击等操作的响应:属于控制管理器,不应该放在UI框架中,但是UI框架需要提供UI尺寸和实际尺寸的比例便于规划控制范围。3D物体的展示:可以直接放在界面中也可以使用renderTexture,前者更方便。切换场景时对 UI 如何处理虽然unity提供了Scene这个功能给我们使用,但是我个人的最终目标是将整个游戏运行在一个场景中,但这并不影响UI框架。一个场景一个单例的管理器(M2),还有一个跨场景的管理器(M1),M2负责具体的创建和关闭,M1负责对象池之类的功能。如果多场景,场景切换时M2实例和界面就都销毁了,不需要特别处理;如果单场景,创建和销毁都已经由M2实例负责了。UI如何分组/分类以方便管理个人看来这一条本身提的比较模糊,因为可以理解为资源的管理也可以理解为结构的管理,下面分别回答。资源管理:小的项目可以使用公用图集(+Texture)的方式,大的项目UI资源太多,只靠公用图集肯定会造成内存的严重占用,所以建议是公用图集+功能图集(+Texture)。功能图集就是一个功能模块的公用图集,在功能操作完毕时就可以释放掉了。这里涉及到的细节太多,就不展开了。结构管理:我的思路是分为三类:1控件,就是button、label、sprite等等。(像buttonGroup就是button的组合,使用代码创建和控制)2弹窗/界面/列表项,这三者都由控件组成。3共用布局,这一类是为了节省时间而分的,比方说卡牌游戏中反复出现的卡牌布局其实就是共用布局,每个界面重复制作显然浪费,是否有这类关键在于UE结构是否明确和复杂布局的复用程度。如何统一管理UI的深度这条可以引申为Z坐标(如果UI中有3D物体或者UI本身就是3D的)、renderQueue、界面的调用顺序等全局属性的管理。这些内容都应该在界面制作的时候就记录在界面信息上,在创建、聚/失焦、关闭界面时记录在管理器中。UI本身的深度其实很好管理,麻烦在UI上可能会有3D物体和特效,不同的shader可能会导致不同的问题。打开、关闭时的动效,以及被遮挡时的动效动效本身其实更应该当作项目需求而不是框架需求。首先建议有单独的动效管理器,其次如果项目规划中对动效规划不明确,可以放在具体实现中。如果项目中没有靠谱的UE设计,框架做得越多其实越累。引用程序界的质能公式:error=(more code)^{2}3DUI相比2D多了很多问题,要提前想清楚,比方说在界面上有3D物体的情况下(不用renderTexture)打开弹窗时,Z坐标和缩放的管理。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6254点击量5576点击量5298点击量4133点击量3556点击量3528点击量3473点击量3428点击量3389
&2016 Chukong Technologies,Inc.
京公网安备89代码给物体添加boxcollider,怎么让它尺寸自适应当前物体大小-NGUI-论坛-U3D在线
Unity3D在线
当前位置: ->
-> 代码给物体添加boxcollider,怎么让它尺寸自适应当前物体大小
NGUI 论坛 > 代码给物体添加boxcollider,怎么让它尺寸自适应当前物体大小围观:1315 | 回复:13
欧阳飘歌积分:27帖子:1
代码给物体添加boxcollider,怎么让它尺寸自适应当前物体大小
龙语香积分:15帖子:0
boxcollider 的 size
等于 render 里面的那个width
姜如筠积分:2帖子:0
现在大家都用哪个版本的NGUI?
洪巨之积分:18帖子:0
我用UICamera.lastHit.collider == null判断是不是点击在NGUI层上,但是一但在NGUI层有过点击,这个值就永远不为空
洪巨之积分:18帖子:0
导致后面想点击场景,都没法响应
洪巨之积分:18帖子:0
洪巨之积分:18帖子:0
之前用3.0.6的版本做都没这样 的问题
洪巨之积分:18帖子:0
现在用个新版本,真是蛋疼
呼延盼积分:2帖子:0
请问在场景中怎么知道鼠标点击了,而且还不影响点击的动作,比如点击地面或技能,知道点击了还能走过去和释放技能?
洪巨之积分:18帖子:0
慕容醉瑶积分:1帖子:0
有个UICamera.TouchCount 判断为不为零@Test
免责声明:本站所有内容来源于互联网,如果本站部分内容侵犯您的权益,请您告知,站长会立即处理
Copyright Unity3D在线 All Rights Reserved.Theme by U3dOL 备案:京ICP备号-4 |SiteMap |网站地图 |百度统计| 联系我们}

我要回帖

更多关于 unity3d ngui 的文章

更多推荐

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

点击添加站长微信