unity3d NGUI粒子特效被遮挡

2015年01月24日 09:32 0 点赞 0 评论 更新于 2017-05-07 10:39

最近在使用 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 方法中,会检查渲染器和材质是否存在,如果存在则将材质的渲染顺序设置为指定的值。如果 runOnlyOncetrue 且游戏正在运行,则会禁用该脚本。

通过以上两种方法,可以有效地解决 Unity3D NGUI 中粒子特效被遮挡的问题。在实际应用中,可以根据具体的需求和场景选择合适的解决方法。

作者信息

feifeila

feifeila

共发布了 570 篇文章