unity3d NGUI粒子特效被遮挡
最近在使用 Unity3D NGUI 时,遇到了粒子特效被遮挡的问题。为了解决这个问题,我查找了相关资料,发现有两种可行的解决方法,下面将详细介绍这两种方法。
解决方法一
粒子系统的渲染顺序默认值为 3000,而 NGUI 的渲染顺序默认也是从 3000 开始。当存在嵌套的 Panel 或者 Depth 值更高的 Panel 时,GUI 的渲染顺序会高于 3000,从而导致粒子特效被遮挡。针对这个问题,有以下几种具体的解决办法:
1. 修改 NGUI 中 UIPanel 脚本的默认渲染队列
可以将 UIPanel 脚本中的默认 RenderQueue 值调整到 3000 以下,这样 NGUI 的渲染顺序就会低于粒子系统,从而避免遮挡粒子特效。当某些窗口需要显示在特效上面时,在检视面板中将该窗口的 Renderer Q 选项调整为 Start At,并将值设置为 3000 以上。需要注意的是,我使用的 NGUI 版本为 3.1.6,在这个版本中可以直接进行这样的调整。
2. 使用另外一个摄像机显示特效
可以专门使用一个摄像机来显示粒子特效。不过这种方法存在一定的局限性,在 UI 窗口相互切换时,特效摄像机的控制会比较困难。
3. 修改粒子特效的 Shader 中的 RenderQueue 值
通过修改粒子特效所使用的 Shader 中的 RenderQueue 值,来调整粒子特效的渲染顺序,避免被 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;
}
}
}
在上述代码中,通过设置 renderQueue
变量来指定粒子特效的渲染顺序。runOnlyOnce
变量用于控制脚本是否只执行一次。在 Update
方法中,会检查渲染器和材质是否存在,如果存在则将材质的渲染顺序设置为指定的值。如果 runOnlyOnce
为 true
且游戏正在运行,则会禁用该脚本。
通过以上两种方法,可以有效地解决 Unity3D NGUI 中粒子特效被遮挡的问题。在实际应用中,可以根据具体的需求和场景选择合适的解决方法。