ngui 遮挡粒子问题
在开发过程中,我们有时会遇到 NGUI 遮挡粒子的问题。为了解决这一问题,经过查找相关资料,发现有两种可行的解决方法,下面将详细介绍这两种方法。
解决方法一
粒子系统的渲染顺序默认值为 3000,而 NGUI 的渲染顺序默认也是从 3000 开始。当存在嵌套的 Panel 或者 Depth 值更高的 Panel 时,GUI 的渲染顺序会高于 3000,从而导致 NGUI 遮挡粒子特效。针对此情况,有以下几种解决办法:
1. 修改 UIPanel 脚本的渲染队列
修改 NGUI 中 UIPanel 脚本里的默认 RenderQueue,将其调整到 3000 以下,这样 NGUI 就不会遮挡住粒子特效。若有窗口需要显示在特效上面,可在检视面板中将该窗口的 Renderer Q 选项调整为 Start At,并且将值设置为 3000 以上。需要注意的是,我的 NGUI 版本为 3.1.6,在此版本下可以直接进行这样的调整。
2. 使用额外摄像机显示特效
可以使用另外一个摄像机专门来显示特效。不过这种方法存在一定的局限性,在 UI 窗口相互切换时,特效的显示控制会变得比较困难。
3. 修改粒子特效 Shader 的渲染队列值
通过修改粒子特效的 Shader 中的 RendererQueue 值,也能够解决 NGUI 遮挡粒子的问题。
解决方法二
可以通过编写脚本动态控制粒子的渲染队列,以下是具体的代码实现:
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class ControlParticle : MonoBehaviour {
public int renderQueue = 30000;
public bool runOnlyOnce = false;
void Start() {
Update();
}
void Update() {
if (renderer != null && renderer.sharedMaterial != null) {
renderer.sharedMaterial.renderQueue = renderQueue;
}
if (runOnlyOnce && Application.isPlaying) {
this.enabled = false;
}
}
}
上述代码定义了一个名为 ControlParticle 的脚本,该脚本可以在编辑器模式和运行时执行。通过设置 renderQueue 变量,可以指定粒子的渲染队列值。runOnlyOnce 变量用于控制脚本是否只执行一次。在 Update 方法中,会检查渲染器和材质是否存在,如果存在则将材质的渲染队列设置为指定的值。当 runOnlyOnce 为 true 且游戏正在运行时,脚本将自动禁用。