UGUI中显示粒子特效
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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,
后续试试再写进去。
欢迎留⾔指教。