UGUI中显示粒子特效

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UGUI中显⽰粒⼦特效
今天在UGUI上显⽰粒⼦特效的时候遇到的⼀些问题,Mark⼀下。

原理:修改特效中每⼀个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sortingOrder值设置为⼤于Canvas中的值。

其实就是控制两个组件
的Render Order。

1. 在UI控件上(eg: Image)显⽰⼀个粒⼦特效
1).⾸先创建⼀个Canvas,RenderMode = Screen Space-Camera ,然后创建⼀个UICamera ,参数设置为:Clear Flags: Depth Only; Culling Mask : UI;
然后把这个UICamera设置为Canvas的RenderCamera。

如下图:
2). 添加⼀个粒⼦特效预设Boom到Image1下⾯,我们需要在Image1上显⽰粒⼦效果。

然后我们需要对这个Boom特效的中的粒⼦系统设置对应的sortingOrder为1
添加⼀个脚本UIEffectPlayer.cs到这个go上,它会递归遍历这个预设上的所有⼦对象,分别设置它们的sortingOrder和所属Layer。

代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIEffectPlayer : MonoBehaviour {
// Use this for initialization
void Awake()
{
if (gameObject.GetComponent<RectTransform>() == null)
{
RectTransform rt = gameObject.AddComponent<RectTransform>();
rt.anchorMin = Vector3.zero;
rt.anchorMax = Vector3.zero;
rt.anchoredPosition = new Vector2(130, 160);
}
//设置所有的粒⼦特效的Layer为UI,把粒⼦系统的Render的sortingOrder设置为⼤于Canvas的OrderInLayer
//Canvas的Order In Layer默认为0,所以这⾥默认设置为1
SetLayerAndSortOrder(gameObject.transform,5,1);
}
void SetLayerAndSortOrder(Transform parent,int layer,int sortOrder)
{
yer = layer;
ParticleSystem ps = parent.GetComponent<ParticleSystem>();
if (ps != null)
{
ParticleSystemRenderer psRender = gameObject.GetComponent<ParticleSystemRenderer>();
if(psRender != null)
{
psRender.sortingOrder = sortOrder;
}
}
foreach(Transform child in parent)
{
SetLayerAndSortOrder(child, layer,sortOrder);
}
}
void Start () {
}
// Update is called once per frame
void Update () {
}
}
3).运⾏游戏即可看见特效显⽰在Image1上⾯。

2. 如果需要在两个UI层之间显⽰特效怎么办?(特效Boom显⽰在图⽚Image1和Image2之间)
很容易想到的办法是新创建⼀个Canvas,(这个Canvas类似NGUI中的UIPanel)将其的值设置为⼤于粒⼦系统的sortingOrder的值,然后将Image2放到Canvas2下⾯进⾏绘制。

效果如下:
可以看到Boom特效显⽰在Image1和Image2之间了,Image2显⽰为半透明。

好像还有别的办法不⽤新建⼀个Canvas,
后续试试再写进去。

欢迎留⾔指教。

相关文档
最新文档