ngui 遮挡粒子问题

2015年01月31日 09:56 0 点赞 0 评论 更新于 2025-11-21 15:48

在开发过程中,我们有时会遇到 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 方法中,会检查渲染器和材质是否存在,如果存在则将材质的渲染队列设置为指定的值。当 runOnlyOncetrue 且游戏正在运行时,脚本将自动禁用。

作者信息

feifeila

feifeila

共发布了 3994 篇文章