位置: 编程技术 - 正文
推荐整理分享unity3d完美处理NGUI和特效的显示问题(unity3d quaternion),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:unity3ds,unity 3d ui,unity3d操作,unity3d documentation,unity3d完整项目,unity3d操作,unity怎么后处理,unity 后期处理,内容如对您有帮助,希望把文章链接给更多的朋友!
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 = rq; } } }
首先这段代码就是将特效的renderqueu调整成你想要放置的物体的前面。然后你如果在Update()或者LateUpdate()中执行这段代码,你会发现它工作的不错,就是偶尔会闪一下,这是因为这段代码先更新了,然后NGUI才更新,所以导致滞后一帧。对于我这种完美主义者来说,这是不能接受的。所以我修改了UIPanel的源代码,然里面全部更新完毕后,再去调用这个函数。哈哈,一切都非常完美。
大致代码如下:
List<UISortBehavior> container = new List<UISortBehavior>(); public void addUISort(UISortBehavior uiSort) { if(container.Contains(uiSort)) { return; } container.Add (uiSort); } public void removeUISort(UISortBehavior uiSort) { container.Remove (uiSort); } public void updateUISort() { for(int i = 0; i < container.Count; i) { container[i].UpdateSortUI(); } } void LateUpdate () { if (mUpdateFrame != Time.frameCount) { mUpdateFrame = Time.frameCount; // Update each panel in order for (int i = 0; i < list.size; i) list[i].UpdateSelf(); int rq = ; // Update all draw calls, making them draw in the right order for (int i = 0; i < list.size; i) { UIPanel p = list.buffer[i]; if (p.renderQueue == RenderQueue.Automatic) { p.startingRenderQueue = rq; p.UpdateDrawCalls(); //rq = p.drawCalls.size; 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(); } } } /// <summary> /// Update the panel, all of its widgets and draw calls. /// </summary> void UpdateSelf () { mUpdateTime = RealTime.time; UpdateTransformMatrix(); UpdateLayers(); UpdateWidgets(); if (mRebuild) { mRebuild = false; FillAllDrawCalls(); } else { for (int i = 0; i < drawCalls.size; ) { UIDrawCall dc = drawCalls.buffer[i]; if (dc.isDirty && !FillDrawCall(dc)) { UIDrawCall.Destroy(dc); drawCalls.RemoveAt(i); continue; } i; } } }
unity3d接入GameCenter成就显示有问题 使用unity3d提供的Social.ShowAchievementsUI显示成就,发现还是显示的排行界面,原来重启下就好了!!!参考来自:
Unity3d HDR和Bloom效果(高动态范围图像和泛光) 文章开始先放两组效果,文章结尾再放两组效果本文测试场景资源来自浅墨大神,shader效果为本文效果HDR人们有限的视觉系统,只支持.7百万的颜色,
创建一个扇形Mesh usingUnityEngine;usingSystem.Collections;/*==============================================================================*功能描述:测试Mesh创建*创建者:cjunhong*QQ:*创建日
友情链接: 武汉网站建设